gdb: disassembler opcode display formatting
[binutils-gdb.git] / gdb / disasm.c
1 /* Disassemble support for GDB.
2
3 Copyright (C) 2000-2022 Free Software Foundation, Inc.
4
5 This file is part of GDB.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
19
20 #include "defs.h"
21 #include "arch-utils.h"
22 #include "target.h"
23 #include "value.h"
24 #include "ui-out.h"
25 #include "disasm.h"
26 #include "gdbcore.h"
27 #include "gdbcmd.h"
28 #include "dis-asm.h"
29 #include "source.h"
30 #include "safe-ctype.h"
31 #include <algorithm>
32 #include "gdbsupport/gdb_optional.h"
33 #include "valprint.h"
34 #include "cli/cli-style.h"
35
36 /* Disassemble functions.
37 FIXME: We should get rid of all the duplicate code in gdb that does
38 the same thing: disassemble_command() and the gdbtk variation. */
39
40 /* This variable is used to hold the prospective disassembler_options value
41 which is set by the "set disassembler_options" command. */
42 static std::string prospective_options;
43
44 /* When this is true we will try to use libopcodes to provide styling to
45 the disassembler output. */
46
47 static bool use_libopcodes_styling = true;
48
49 /* To support the set_use_libopcodes_styling function we have a second
50 variable which is connected to the actual set/show option. */
51
52 static bool use_libopcodes_styling_option = use_libopcodes_styling;
53
54 /* The "maint show libopcodes-styling enabled" command. */
55
56 static void
57 show_use_libopcodes_styling (struct ui_file *file, int from_tty,
58 struct cmd_list_element *c,
59 const char *value)
60 {
61 gdb_non_printing_memory_disassembler dis (target_gdbarch ());
62 bool supported = dis.disasm_info ()->created_styled_output;
63
64 if (supported || !use_libopcodes_styling)
65 gdb_printf (file, _("Use of libopcodes styling support is \"%s\".\n"),
66 value);
67 else
68 {
69 /* Use of libopcodes styling is not supported, and the user has this
70 turned on! */
71 gdb_printf (file, _("Use of libopcodes styling support is \"off\""
72 " (not supported on architecture \"%s\")\n"),
73 gdbarch_bfd_arch_info (target_gdbarch ())->printable_name);
74 }
75 }
76
77 /* The "maint set libopcodes-styling enabled" command. */
78
79 static void
80 set_use_libopcodes_styling (const char *args, int from_tty,
81 struct cmd_list_element *c)
82 {
83 gdb_non_printing_memory_disassembler dis (target_gdbarch ());
84 bool supported = dis.disasm_info ()->created_styled_output;
85
86 /* If the current architecture doesn't support libopcodes styling then we
87 give an error here, but leave the underlying setting enabled. This
88 means that if the user switches to an architecture that does support
89 libopcodes styling the setting will be enabled. */
90
91 if (use_libopcodes_styling_option && !supported)
92 {
93 use_libopcodes_styling_option = use_libopcodes_styling;
94 error (_("Use of libopcodes styling not supported on architecture \"%s\"."),
95 gdbarch_bfd_arch_info (target_gdbarch ())->printable_name);
96 }
97 else
98 use_libopcodes_styling = use_libopcodes_styling_option;
99 }
100
101 /* This structure is used to store line number information for the
102 deprecated /m option.
103 We need a different sort of line table from the normal one cuz we can't
104 depend upon implicit line-end pc's for lines to do the
105 reordering in this function. */
106
107 struct deprecated_dis_line_entry
108 {
109 int line;
110 CORE_ADDR start_pc;
111 CORE_ADDR end_pc;
112 };
113
114 /* This Structure is used to store line number information.
115 We need a different sort of line table from the normal one cuz we can't
116 depend upon implicit line-end pc's for lines to do the
117 reordering in this function. */
118
119 struct dis_line_entry
120 {
121 struct symtab *symtab;
122 int line;
123 };
124
125 /* Hash function for dis_line_entry. */
126
127 static hashval_t
128 hash_dis_line_entry (const void *item)
129 {
130 const struct dis_line_entry *dle = (const struct dis_line_entry *) item;
131
132 return htab_hash_pointer (dle->symtab) + dle->line;
133 }
134
135 /* Equal function for dis_line_entry. */
136
137 static int
138 eq_dis_line_entry (const void *item_lhs, const void *item_rhs)
139 {
140 const struct dis_line_entry *lhs = (const struct dis_line_entry *) item_lhs;
141 const struct dis_line_entry *rhs = (const struct dis_line_entry *) item_rhs;
142
143 return (lhs->symtab == rhs->symtab
144 && lhs->line == rhs->line);
145 }
146
147 /* Create the table to manage lines for mixed source/disassembly. */
148
149 static htab_t
150 allocate_dis_line_table (void)
151 {
152 return htab_create_alloc (41,
153 hash_dis_line_entry, eq_dis_line_entry,
154 xfree, xcalloc, xfree);
155 }
156
157 /* Add a new dis_line_entry containing SYMTAB and LINE to TABLE. */
158
159 static void
160 add_dis_line_entry (htab_t table, struct symtab *symtab, int line)
161 {
162 void **slot;
163 struct dis_line_entry dle, *dlep;
164
165 dle.symtab = symtab;
166 dle.line = line;
167 slot = htab_find_slot (table, &dle, INSERT);
168 if (*slot == NULL)
169 {
170 dlep = XNEW (struct dis_line_entry);
171 dlep->symtab = symtab;
172 dlep->line = line;
173 *slot = dlep;
174 }
175 }
176
177 /* Return non-zero if SYMTAB, LINE are in TABLE. */
178
179 static int
180 line_has_code_p (htab_t table, struct symtab *symtab, int line)
181 {
182 struct dis_line_entry dle;
183
184 dle.symtab = symtab;
185 dle.line = line;
186 return htab_find (table, &dle) != NULL;
187 }
188
189 /* Wrapper of target_read_code. */
190
191 int
192 gdb_disassembler_memory_reader::dis_asm_read_memory
193 (bfd_vma memaddr, gdb_byte *myaddr, unsigned int len,
194 struct disassemble_info *info)
195 {
196 return target_read_code (memaddr, myaddr, len);
197 }
198
199 /* Wrapper of memory_error. */
200
201 void
202 gdb_disassembler::dis_asm_memory_error (int err, bfd_vma memaddr,
203 struct disassemble_info *info)
204 {
205 gdb_disassembler *self
206 = static_cast<gdb_disassembler *>(info->application_data);
207
208 self->m_err_memaddr.emplace (memaddr);
209 }
210
211 /* Wrapper of print_address. */
212
213 void
214 gdb_disassembler::dis_asm_print_address (bfd_vma addr,
215 struct disassemble_info *info)
216 {
217 gdb_disassembler *self
218 = static_cast<gdb_disassembler *>(info->application_data);
219
220 if (self->in_comment_p ())
221 {
222 /* Calling 'print_address' might add styling to the output (based on
223 the properties of the stream we're writing too). This is usually
224 fine, but if we are in an assembler comment then we'd prefer to
225 have the comment style, rather than the default address style.
226
227 Print the address into a temporary buffer which doesn't support
228 styling, then reprint this unstyled address with the default text
229 style.
230
231 As we are inside a comment right now, the standard print routine
232 will ensure that the comment is printed to the user with a
233 suitable comment style. */
234 string_file tmp;
235 print_address (self->arch (), addr, &tmp);
236 self->fprintf_styled_func (self, dis_style_text, "%s", tmp.c_str ());
237 }
238 else
239 print_address (self->arch (), addr, self->stream ());
240 }
241
242 /* See disasm.h. */
243
244 ui_file *
245 gdb_printing_disassembler::stream_from_gdb_disassemble_info (void *dis_info)
246 {
247 gdb_disassemble_info *di = (gdb_disassemble_info *) dis_info;
248 gdb_printing_disassembler *dis
249 = gdb::checked_static_cast<gdb_printing_disassembler *> (di);
250 ui_file *stream = dis->stream ();
251 gdb_assert (stream != nullptr);
252 return stream;
253 }
254
255 /* Format disassembler output to STREAM. */
256
257 int
258 gdb_printing_disassembler::fprintf_func (void *dis_info,
259 const char *format, ...)
260 {
261 ui_file *stream = stream_from_gdb_disassemble_info (dis_info);
262
263 va_list args;
264 va_start (args, format);
265 gdb_vprintf (stream, format, args);
266 va_end (args);
267
268 /* Something non -ve. */
269 return 0;
270 }
271
272 /* See disasm.h. */
273
274 int
275 gdb_printing_disassembler::fprintf_styled_func (void *dis_info,
276 enum disassembler_style style,
277 const char *format, ...)
278 {
279 ui_file *stream = stream_from_gdb_disassemble_info (dis_info);
280 gdb_printing_disassembler *dis = (gdb_printing_disassembler *) dis_info;
281
282 va_list args;
283 va_start (args, format);
284 std::string content = string_vprintf (format, args);
285 va_end (args);
286
287 /* Once in a comment then everything should be styled as a comment. */
288 if (style == dis_style_comment_start)
289 dis->set_in_comment (true);
290 if (dis->in_comment_p ())
291 style = dis_style_comment_start;
292
293 /* Now print the content with the correct style. */
294 const char *txt = content.c_str ();
295 switch (style)
296 {
297 case dis_style_mnemonic:
298 case dis_style_sub_mnemonic:
299 case dis_style_assembler_directive:
300 fputs_styled (txt, disasm_mnemonic_style.style (), stream);
301 break;
302
303 case dis_style_register:
304 fputs_styled (txt, disasm_register_style.style (), stream);
305 break;
306
307 case dis_style_immediate:
308 case dis_style_address_offset:
309 fputs_styled (txt, disasm_immediate_style.style (), stream);
310 break;
311
312 case dis_style_address:
313 fputs_styled (txt, address_style.style (), stream);
314 break;
315
316 case dis_style_symbol:
317 fputs_styled (txt, function_name_style.style (), stream);
318 break;
319
320 case dis_style_comment_start:
321 fputs_styled (txt, disasm_comment_style.style (), stream);
322 break;
323
324 case dis_style_text:
325 gdb_puts (txt, stream);
326 break;
327 }
328
329 /* Something non -ve. */
330 return 0;
331 }
332
333 static bool
334 line_is_less_than (const deprecated_dis_line_entry &mle1,
335 const deprecated_dis_line_entry &mle2)
336 {
337 bool val;
338
339 /* End of sequence markers have a line number of 0 but don't want to
340 be sorted to the head of the list, instead sort by PC. */
341 if (mle1.line == 0 || mle2.line == 0)
342 {
343 if (mle1.start_pc != mle2.start_pc)
344 val = mle1.start_pc < mle2.start_pc;
345 else
346 val = mle1.line < mle2.line;
347 }
348 else
349 {
350 if (mle1.line != mle2.line)
351 val = mle1.line < mle2.line;
352 else
353 val = mle1.start_pc < mle2.start_pc;
354 }
355 return val;
356 }
357
358 /* See disasm.h. */
359
360 int
361 gdb_pretty_print_disassembler::pretty_print_insn (const struct disasm_insn *insn,
362 gdb_disassembly_flags flags)
363 {
364 /* parts of the symbolic representation of the address */
365 int unmapped;
366 int offset;
367 int line;
368 int size;
369 CORE_ADDR pc;
370 struct gdbarch *gdbarch = arch ();
371
372 {
373 ui_out_emit_tuple tuple_emitter (m_uiout, NULL);
374 pc = insn->addr;
375
376 if (insn->number != 0)
377 {
378 m_uiout->field_unsigned ("insn-number", insn->number);
379 m_uiout->text ("\t");
380 }
381
382 if ((flags & DISASSEMBLY_SPECULATIVE) != 0)
383 {
384 if (insn->is_speculative)
385 {
386 m_uiout->field_string ("is-speculative", "?");
387
388 /* The speculative execution indication overwrites the first
389 character of the PC prefix.
390 We assume a PC prefix length of 3 characters. */
391 if ((flags & DISASSEMBLY_OMIT_PC) == 0)
392 m_uiout->text (pc_prefix (pc) + 1);
393 else
394 m_uiout->text (" ");
395 }
396 else if ((flags & DISASSEMBLY_OMIT_PC) == 0)
397 m_uiout->text (pc_prefix (pc));
398 else
399 m_uiout->text (" ");
400 }
401 else if ((flags & DISASSEMBLY_OMIT_PC) == 0)
402 m_uiout->text (pc_prefix (pc));
403 m_uiout->field_core_addr ("address", gdbarch, pc);
404
405 std::string name, filename;
406 bool omit_fname = ((flags & DISASSEMBLY_OMIT_FNAME) != 0);
407 if (!build_address_symbolic (gdbarch, pc, false, omit_fname, &name,
408 &offset, &filename, &line, &unmapped))
409 {
410 /* We don't care now about line, filename and unmapped. But we might in
411 the future. */
412 m_uiout->text (" <");
413 if (!omit_fname)
414 m_uiout->field_string ("func-name", name,
415 function_name_style.style ());
416 /* For negative offsets, avoid displaying them as +-N; the sign of
417 the offset takes the place of the "+" here. */
418 if (offset >= 0)
419 m_uiout->text ("+");
420 m_uiout->field_signed ("offset", offset);
421 m_uiout->text (">:\t");
422 }
423 else
424 m_uiout->text (":\t");
425
426 /* Clear the buffer into which we will disassemble the instruction. */
427 m_insn_stb.clear ();
428
429 /* A helper function to write the M_INSN_STB buffer, followed by a
430 newline. This can be called in a couple of situations. */
431 auto write_out_insn_buffer = [&] ()
432 {
433 m_uiout->field_stream ("inst", m_insn_stb);
434 m_uiout->text ("\n");
435 };
436
437 try
438 {
439 /* Now we can disassemble the instruction. If the disassembler
440 returns a negative value this indicates an error and is handled
441 within the print_insn call, resulting in an exception being
442 thrown. Returning zero makes no sense, as this indicates we
443 disassembled something successfully, but it was something of no
444 size? */
445 size = m_di.print_insn (pc);
446 gdb_assert (size > 0);
447 }
448 catch (const gdb_exception &ex)
449 {
450 /* An exception was thrown while disassembling the instruction.
451 However, the disassembler might still have written something
452 out, so ensure that we flush the instruction buffer before
453 rethrowing the exception. We can't perform this write from an
454 object destructor as the write itself might throw an exception
455 if the pager kicks in, and the user selects quit. */
456 write_out_insn_buffer ();
457 throw ex;
458 }
459
460 if ((flags & (DISASSEMBLY_RAW_INSN | DISASSEMBLY_RAW_BYTES)) != 0)
461 {
462 /* Build the opcodes using a temporary stream so we can
463 write them out in a single go for the MI. */
464 m_opcode_stb.clear ();
465
466 /* Read the instruction opcode data. */
467 m_opcode_data.resize (size);
468 read_code (pc, m_opcode_data.data (), size);
469
470 /* The disassembler provides information about the best way to
471 display the instruction bytes to the user. We provide some sane
472 defaults in case the disassembler gets it wrong. */
473 const struct disassemble_info *di = m_di.disasm_info ();
474 int bytes_per_line = std::max (di->bytes_per_line, size);
475 int bytes_per_chunk = std::max (di->bytes_per_chunk, 1);
476
477 /* If the user has requested the instruction bytes be displayed
478 byte at a time, then handle that here. Also, if the instruction
479 is not a multiple of the chunk size (which probably indicates a
480 disassembler problem) then avoid that causing display problems
481 by switching to byte at a time mode. */
482 if ((flags & DISASSEMBLY_RAW_BYTES) != 0
483 || (size % bytes_per_chunk) != 0)
484 bytes_per_chunk = 1;
485
486 /* Print the instruction opcodes bytes, grouped into chunks. */
487 for (int i = 0; i < size; i += bytes_per_chunk)
488 {
489 if (i > 0)
490 m_opcode_stb.puts (" ");
491
492 if (di->display_endian == BFD_ENDIAN_LITTLE)
493 {
494 for (int k = bytes_per_chunk; k-- != 0; )
495 m_opcode_stb.printf ("%02x", (unsigned) m_opcode_data[i + k]);
496 }
497 else
498 {
499 for (int k = 0; k < bytes_per_chunk; k++)
500 m_opcode_stb.printf ("%02x", (unsigned) m_opcode_data[i + k]);
501 }
502 }
503
504 /* Calculate required padding. */
505 int nspaces = 0;
506 for (int i = size; i < bytes_per_line; i += bytes_per_chunk)
507 {
508 if (i > size)
509 nspaces++;
510 nspaces += bytes_per_chunk * 2;
511 }
512
513 m_uiout->field_stream ("opcodes", m_opcode_stb);
514 m_uiout->spaces (nspaces);
515 m_uiout->text ("\t");
516 }
517
518 /* Disassembly was a success, write out the instruction buffer. */
519 write_out_insn_buffer ();
520 }
521
522 return size;
523 }
524
525 static int
526 dump_insns (struct gdbarch *gdbarch,
527 struct ui_out *uiout, CORE_ADDR low, CORE_ADDR high,
528 int how_many, gdb_disassembly_flags flags, CORE_ADDR *end_pc)
529 {
530 struct disasm_insn insn;
531 int num_displayed = 0;
532
533 memset (&insn, 0, sizeof (insn));
534 insn.addr = low;
535
536 gdb_pretty_print_disassembler disasm (gdbarch, uiout);
537
538 while (insn.addr < high && (how_many < 0 || num_displayed < how_many))
539 {
540 int size;
541
542 size = disasm.pretty_print_insn (&insn, flags);
543 if (size <= 0)
544 break;
545
546 ++num_displayed;
547 insn.addr += size;
548
549 /* Allow user to bail out with ^C. */
550 QUIT;
551 }
552
553 if (end_pc != NULL)
554 *end_pc = insn.addr;
555
556 return num_displayed;
557 }
558
559 /* The idea here is to present a source-O-centric view of a
560 function to the user. This means that things are presented
561 in source order, with (possibly) out of order assembly
562 immediately following.
563
564 N.B. This view is deprecated. */
565
566 static void
567 do_mixed_source_and_assembly_deprecated
568 (struct gdbarch *gdbarch, struct ui_out *uiout,
569 struct symtab *symtab,
570 CORE_ADDR low, CORE_ADDR high,
571 int how_many, gdb_disassembly_flags flags)
572 {
573 int newlines = 0;
574 int nlines;
575 struct linetable_entry *le;
576 struct deprecated_dis_line_entry *mle;
577 struct symtab_and_line sal;
578 int i;
579 int out_of_order = 0;
580 int next_line = 0;
581 int num_displayed = 0;
582 print_source_lines_flags psl_flags = 0;
583
584 gdb_assert (symtab != nullptr && symtab->linetable () != nullptr);
585
586 nlines = symtab->linetable ()->nitems;
587 le = symtab->linetable ()->item;
588
589 if (flags & DISASSEMBLY_FILENAME)
590 psl_flags |= PRINT_SOURCE_LINES_FILENAME;
591
592 mle = (struct deprecated_dis_line_entry *)
593 alloca (nlines * sizeof (struct deprecated_dis_line_entry));
594
595 /* Copy linetable entries for this function into our data
596 structure, creating end_pc's and setting out_of_order as
597 appropriate. */
598
599 /* First, skip all the preceding functions. */
600
601 for (i = 0; i < nlines - 1 && le[i].pc < low; i++);
602
603 /* Now, copy all entries before the end of this function. */
604
605 for (; i < nlines - 1 && le[i].pc < high; i++)
606 {
607 if (le[i].line == le[i + 1].line && le[i].pc == le[i + 1].pc)
608 continue; /* Ignore duplicates. */
609
610 /* Skip any end-of-function markers. */
611 if (le[i].line == 0)
612 continue;
613
614 mle[newlines].line = le[i].line;
615 if (le[i].line > le[i + 1].line)
616 out_of_order = 1;
617 mle[newlines].start_pc = le[i].pc;
618 mle[newlines].end_pc = le[i + 1].pc;
619 newlines++;
620 }
621
622 /* If we're on the last line, and it's part of the function,
623 then we need to get the end pc in a special way. */
624
625 if (i == nlines - 1 && le[i].pc < high)
626 {
627 mle[newlines].line = le[i].line;
628 mle[newlines].start_pc = le[i].pc;
629 sal = find_pc_line (le[i].pc, 0);
630 mle[newlines].end_pc = sal.end;
631 newlines++;
632 }
633
634 /* Now, sort mle by line #s (and, then by addresses within lines). */
635
636 if (out_of_order)
637 std::sort (mle, mle + newlines, line_is_less_than);
638
639 /* Now, for each line entry, emit the specified lines (unless
640 they have been emitted before), followed by the assembly code
641 for that line. */
642
643 ui_out_emit_list asm_insns_list (uiout, "asm_insns");
644
645 gdb::optional<ui_out_emit_tuple> outer_tuple_emitter;
646 gdb::optional<ui_out_emit_list> inner_list_emitter;
647
648 for (i = 0; i < newlines; i++)
649 {
650 /* Print out everything from next_line to the current line. */
651 if (mle[i].line >= next_line)
652 {
653 if (next_line != 0)
654 {
655 /* Just one line to print. */
656 if (next_line == mle[i].line)
657 {
658 outer_tuple_emitter.emplace (uiout, "src_and_asm_line");
659 print_source_lines (symtab, next_line, mle[i].line + 1, psl_flags);
660 }
661 else
662 {
663 /* Several source lines w/o asm instructions associated. */
664 for (; next_line < mle[i].line; next_line++)
665 {
666 ui_out_emit_tuple tuple_emitter (uiout,
667 "src_and_asm_line");
668 print_source_lines (symtab, next_line, next_line + 1,
669 psl_flags);
670 ui_out_emit_list temp_list_emitter (uiout,
671 "line_asm_insn");
672 }
673 /* Print the last line and leave list open for
674 asm instructions to be added. */
675 outer_tuple_emitter.emplace (uiout, "src_and_asm_line");
676 print_source_lines (symtab, next_line, mle[i].line + 1, psl_flags);
677 }
678 }
679 else
680 {
681 outer_tuple_emitter.emplace (uiout, "src_and_asm_line");
682 print_source_lines (symtab, mle[i].line, mle[i].line + 1, psl_flags);
683 }
684
685 next_line = mle[i].line + 1;
686 inner_list_emitter.emplace (uiout, "line_asm_insn");
687 }
688
689 num_displayed += dump_insns (gdbarch, uiout,
690 mle[i].start_pc, mle[i].end_pc,
691 how_many, flags, NULL);
692
693 /* When we've reached the end of the mle array, or we've seen the last
694 assembly range for this source line, close out the list/tuple. */
695 if (i == (newlines - 1) || mle[i + 1].line > mle[i].line)
696 {
697 inner_list_emitter.reset ();
698 outer_tuple_emitter.reset ();
699 uiout->text ("\n");
700 }
701 if (how_many >= 0 && num_displayed >= how_many)
702 break;
703 }
704 }
705
706 /* The idea here is to present a source-O-centric view of a
707 function to the user. This means that things are presented
708 in source order, with (possibly) out of order assembly
709 immediately following. */
710
711 static void
712 do_mixed_source_and_assembly (struct gdbarch *gdbarch,
713 struct ui_out *uiout,
714 struct symtab *main_symtab,
715 CORE_ADDR low, CORE_ADDR high,
716 int how_many, gdb_disassembly_flags flags)
717 {
718 const struct linetable_entry *le, *first_le;
719 int i, nlines;
720 int num_displayed = 0;
721 print_source_lines_flags psl_flags = 0;
722 CORE_ADDR pc;
723 struct symtab *last_symtab;
724 int last_line;
725
726 gdb_assert (main_symtab != NULL && main_symtab->linetable () != NULL);
727
728 /* First pass: collect the list of all source files and lines.
729 We do this so that we can only print lines containing code once.
730 We try to print the source text leading up to the next instruction,
731 but if that text is for code that will be disassembled later, then
732 we'll want to defer printing it until later with its associated code. */
733
734 htab_up dis_line_table (allocate_dis_line_table ());
735
736 pc = low;
737
738 /* The prologue may be empty, but there may still be a line number entry
739 for the opening brace which is distinct from the first line of code.
740 If the prologue has been eliminated find_pc_line may return the source
741 line after the opening brace. We still want to print this opening brace.
742 first_le is used to implement this. */
743
744 nlines = main_symtab->linetable ()->nitems;
745 le = main_symtab->linetable ()->item;
746 first_le = NULL;
747
748 /* Skip all the preceding functions. */
749 for (i = 0; i < nlines && le[i].pc < low; i++)
750 continue;
751
752 if (i < nlines && le[i].pc < high)
753 first_le = &le[i];
754
755 /* Add lines for every pc value. */
756 while (pc < high)
757 {
758 struct symtab_and_line sal;
759 int length;
760
761 sal = find_pc_line (pc, 0);
762 length = gdb_insn_length (gdbarch, pc);
763 pc += length;
764
765 if (sal.symtab != NULL)
766 add_dis_line_entry (dis_line_table.get (), sal.symtab, sal.line);
767 }
768
769 /* Second pass: print the disassembly.
770
771 Output format, from an MI perspective:
772 The result is a ui_out list, field name "asm_insns", where elements have
773 name "src_and_asm_line".
774 Each element is a tuple of source line specs (field names line, file,
775 fullname), and field "line_asm_insn" which contains the disassembly.
776 Field "line_asm_insn" is a list of tuples: address, func-name, offset,
777 opcodes, inst.
778
779 CLI output works on top of this because MI ignores ui_out_text output,
780 which is where we put file name and source line contents output.
781
782 Emitter usage:
783 asm_insns_emitter
784 Handles the outer "asm_insns" list.
785 tuple_emitter
786 The tuples for each group of consecutive disassemblies.
787 list_emitter
788 List of consecutive source lines or disassembled insns. */
789
790 if (flags & DISASSEMBLY_FILENAME)
791 psl_flags |= PRINT_SOURCE_LINES_FILENAME;
792
793 ui_out_emit_list asm_insns_emitter (uiout, "asm_insns");
794
795 gdb::optional<ui_out_emit_tuple> tuple_emitter;
796 gdb::optional<ui_out_emit_list> list_emitter;
797
798 last_symtab = NULL;
799 last_line = 0;
800 pc = low;
801
802 while (pc < high)
803 {
804 struct symtab_and_line sal;
805 CORE_ADDR end_pc;
806 int start_preceding_line_to_display = 0;
807 int end_preceding_line_to_display = 0;
808 int new_source_line = 0;
809
810 sal = find_pc_line (pc, 0);
811
812 if (sal.symtab != last_symtab)
813 {
814 /* New source file. */
815 new_source_line = 1;
816
817 /* If this is the first line of output, check for any preceding
818 lines. */
819 if (last_line == 0
820 && first_le != NULL
821 && first_le->line < sal.line)
822 {
823 start_preceding_line_to_display = first_le->line;
824 end_preceding_line_to_display = sal.line;
825 }
826 }
827 else
828 {
829 /* Same source file as last time. */
830 if (sal.symtab != NULL)
831 {
832 if (sal.line > last_line + 1 && last_line != 0)
833 {
834 int l;
835
836 /* Several preceding source lines. Print the trailing ones
837 not associated with code that we'll print later. */
838 for (l = sal.line - 1; l > last_line; --l)
839 {
840 if (line_has_code_p (dis_line_table.get (),
841 sal.symtab, l))
842 break;
843 }
844 if (l < sal.line - 1)
845 {
846 start_preceding_line_to_display = l + 1;
847 end_preceding_line_to_display = sal.line;
848 }
849 }
850 if (sal.line != last_line)
851 new_source_line = 1;
852 else
853 {
854 /* Same source line as last time. This can happen, depending
855 on the debug info. */
856 }
857 }
858 }
859
860 if (new_source_line)
861 {
862 /* Skip the newline if this is the first instruction. */
863 if (pc > low)
864 uiout->text ("\n");
865 if (tuple_emitter.has_value ())
866 {
867 gdb_assert (list_emitter.has_value ());
868 list_emitter.reset ();
869 tuple_emitter.reset ();
870 }
871 if (sal.symtab != last_symtab
872 && !(flags & DISASSEMBLY_FILENAME))
873 {
874 /* Remember MI ignores ui_out_text.
875 We don't have to do anything here for MI because MI
876 output includes the source specs for each line. */
877 if (sal.symtab != NULL)
878 {
879 uiout->text (symtab_to_filename_for_display (sal.symtab));
880 }
881 else
882 uiout->text ("unknown");
883 uiout->text (":\n");
884 }
885 if (start_preceding_line_to_display > 0)
886 {
887 /* Several source lines w/o asm instructions associated.
888 We need to preserve the structure of the output, so output
889 a bunch of line tuples with no asm entries. */
890 int l;
891
892 gdb_assert (sal.symtab != NULL);
893 for (l = start_preceding_line_to_display;
894 l < end_preceding_line_to_display;
895 ++l)
896 {
897 ui_out_emit_tuple line_tuple_emitter (uiout,
898 "src_and_asm_line");
899 print_source_lines (sal.symtab, l, l + 1, psl_flags);
900 ui_out_emit_list chain_line_emitter (uiout, "line_asm_insn");
901 }
902 }
903 tuple_emitter.emplace (uiout, "src_and_asm_line");
904 if (sal.symtab != NULL)
905 print_source_lines (sal.symtab, sal.line, sal.line + 1, psl_flags);
906 else
907 uiout->text (_("--- no source info for this pc ---\n"));
908 list_emitter.emplace (uiout, "line_asm_insn");
909 }
910 else
911 {
912 /* Here we're appending instructions to an existing line.
913 By construction the very first insn will have a symtab
914 and follow the new_source_line path above. */
915 gdb_assert (tuple_emitter.has_value ());
916 gdb_assert (list_emitter.has_value ());
917 }
918
919 if (sal.end != 0)
920 end_pc = std::min (sal.end, high);
921 else
922 end_pc = pc + 1;
923 num_displayed += dump_insns (gdbarch, uiout, pc, end_pc,
924 how_many, flags, &end_pc);
925 pc = end_pc;
926
927 if (how_many >= 0 && num_displayed >= how_many)
928 break;
929
930 last_symtab = sal.symtab;
931 last_line = sal.line;
932 }
933 }
934
935 static void
936 do_assembly_only (struct gdbarch *gdbarch, struct ui_out *uiout,
937 CORE_ADDR low, CORE_ADDR high,
938 int how_many, gdb_disassembly_flags flags)
939 {
940 ui_out_emit_list list_emitter (uiout, "asm_insns");
941
942 dump_insns (gdbarch, uiout, low, high, how_many, flags, NULL);
943 }
944
945 /* Combine implicit and user disassembler options and return them
946 in a newly-created string. */
947
948 static std::string
949 get_all_disassembler_options (struct gdbarch *gdbarch)
950 {
951 const char *implicit = gdbarch_disassembler_options_implicit (gdbarch);
952 const char *options = get_disassembler_options (gdbarch);
953 const char *comma = ",";
954
955 if (implicit == nullptr)
956 {
957 implicit = "";
958 comma = "";
959 }
960
961 if (options == nullptr)
962 {
963 options = "";
964 comma = "";
965 }
966
967 return string_printf ("%s%s%s", implicit, comma, options);
968 }
969
970 gdb_disassembler::gdb_disassembler (struct gdbarch *gdbarch,
971 struct ui_file *file,
972 read_memory_ftype func)
973 : gdb_printing_disassembler (gdbarch, &m_buffer, func,
974 dis_asm_memory_error, dis_asm_print_address),
975 /* The use of m_di.created_styled_output here is a bit of a cheat, but
976 it works fine for now. Currently, for all targets that support
977 libopcodes styling, this field is set during the call to
978 disassemble_init_for_target, which was called as part of the
979 initialization of gdb_printing_disassembler. And so, we are able to
980 spot if a target supports libopcodes styling, and create m_buffer in
981 the correct styling mode.
982
983 If there's ever a target that only sets created_styled_output during
984 the actual disassemble phase, then the logic here will have to
985 change. */
986 m_buffer ((!use_ext_lang_colorization_p
987 || (use_libopcodes_styling && m_di.created_styled_output))
988 && disassembler_styling
989 && file->can_emit_style_escape ()),
990 m_dest (file)
991 { /* Nothing. */ }
992
993 /* See disasm.h. */
994
995 gdb_disassemble_info::gdb_disassemble_info
996 (struct gdbarch *gdbarch,
997 read_memory_ftype read_memory_func, memory_error_ftype memory_error_func,
998 print_address_ftype print_address_func, fprintf_ftype fprintf_func,
999 fprintf_styled_ftype fprintf_styled_func)
1000 : m_gdbarch (gdbarch)
1001 {
1002 gdb_assert (fprintf_func != nullptr);
1003 gdb_assert (fprintf_styled_func != nullptr);
1004 init_disassemble_info (&m_di, (void *) this, fprintf_func,
1005 fprintf_styled_func);
1006 m_di.flavour = bfd_target_unknown_flavour;
1007
1008 /* The memory_error_func, print_address_func, and read_memory_func are
1009 all initialized to a default (non-nullptr) value by the call to
1010 init_disassemble_info above. If the user is overriding these fields
1011 (by passing non-nullptr values) then do that now, otherwise, leave
1012 these fields as the defaults. */
1013 if (memory_error_func != nullptr)
1014 m_di.memory_error_func = memory_error_func;
1015 if (print_address_func != nullptr)
1016 m_di.print_address_func = print_address_func;
1017 if (read_memory_func != nullptr)
1018 m_di.read_memory_func = read_memory_func;
1019
1020 m_di.arch = gdbarch_bfd_arch_info (gdbarch)->arch;
1021 m_di.mach = gdbarch_bfd_arch_info (gdbarch)->mach;
1022 m_di.endian = gdbarch_byte_order (gdbarch);
1023 m_di.endian_code = gdbarch_byte_order_for_code (gdbarch);
1024 m_di.application_data = this;
1025 m_disassembler_options_holder = get_all_disassembler_options (gdbarch);
1026 if (!m_disassembler_options_holder.empty ())
1027 m_di.disassembler_options = m_disassembler_options_holder.c_str ();
1028 disassemble_init_for_target (&m_di);
1029 }
1030
1031 /* See disasm.h. */
1032
1033 gdb_disassemble_info::~gdb_disassemble_info ()
1034 {
1035 disassemble_free_target (&m_di);
1036 }
1037
1038 /* Wrapper around calling gdbarch_print_insn. This function takes care of
1039 first calling the extension language hooks for print_insn, and, if none
1040 of the extension languages can print this instruction, calls
1041 gdbarch_print_insn to do the work.
1042
1043 GDBARCH is the architecture to disassemble in, VMA is the address of the
1044 instruction being disassembled, and INFO is the libopcodes disassembler
1045 related information. */
1046
1047 static int
1048 gdb_print_insn_1 (struct gdbarch *gdbarch, CORE_ADDR vma,
1049 struct disassemble_info *info)
1050 {
1051 /* Call into the extension languages to do the disassembly. */
1052 gdb::optional<int> length = ext_lang_print_insn (gdbarch, vma, info);
1053 if (length.has_value ())
1054 return *length;
1055
1056 /* No extension language wanted to do the disassembly, so do it
1057 manually. */
1058 return gdbarch_print_insn (gdbarch, vma, info);
1059 }
1060
1061 /* See disasm.h. */
1062
1063 bool gdb_disassembler::use_ext_lang_colorization_p = true;
1064
1065 /* See disasm.h. */
1066
1067 int
1068 gdb_disassembler::print_insn (CORE_ADDR memaddr,
1069 int *branch_delay_insns)
1070 {
1071 m_err_memaddr.reset ();
1072 m_buffer.clear ();
1073 this->set_in_comment (false);
1074
1075 int length = gdb_print_insn_1 (arch (), memaddr, &m_di);
1076
1077 /* If we have successfully disassembled an instruction, disassembler
1078 styling using the extension language is on, and libopcodes hasn't
1079 already styled the output for us, and, if the destination can support
1080 styling, then lets call into the extension languages in order to style
1081 this output. */
1082 if (length > 0 && disassembler_styling
1083 && (!m_di.created_styled_output || !use_libopcodes_styling)
1084 && use_ext_lang_colorization_p
1085 && m_dest->can_emit_style_escape ())
1086 {
1087 gdb::optional<std::string> ext_contents;
1088 ext_contents = ext_lang_colorize_disasm (m_buffer.string (), arch ());
1089 if (ext_contents.has_value ())
1090 m_buffer = std::move (*ext_contents);
1091 else
1092 {
1093 /* The extension language failed to add styling to the
1094 disassembly output. Set the static flag so that next time we
1095 disassemble we don't even bother attempting to use the
1096 extension language for styling. */
1097 use_ext_lang_colorization_p = false;
1098
1099 /* The instruction we just disassembled, and the extension
1100 languages failed to style, might have otherwise had some
1101 minimal styling applied by GDB. To regain that styling we
1102 need to recreate m_buffer, but this time with styling support.
1103
1104 To do this we perform an in-place new, but this time turn on
1105 the styling support, then we can re-disassembly the
1106 instruction, and gain any minimal styling GDB might add. */
1107 gdb_static_assert ((std::is_same<decltype (m_buffer),
1108 string_file>::value));
1109 gdb_assert (!m_buffer.term_out ());
1110 m_buffer.~string_file ();
1111 new (&m_buffer) string_file (true);
1112 length = gdb_print_insn_1 (arch (), memaddr, &m_di);
1113 gdb_assert (length > 0);
1114 }
1115 }
1116
1117 /* Push any disassemble output to the real destination stream. We do
1118 this even if the disassembler reported failure (-1) as the
1119 disassembler may have printed something to its output stream. */
1120 gdb_printf (m_dest, "%s", m_buffer.c_str ());
1121
1122 /* If the disassembler failed then report an appropriate error. */
1123 if (length < 0)
1124 {
1125 if (m_err_memaddr.has_value ())
1126 memory_error (TARGET_XFER_E_IO, *m_err_memaddr);
1127 else
1128 error (_("unknown disassembler error (error = %d)"), length);
1129 }
1130
1131 if (branch_delay_insns != NULL)
1132 {
1133 if (m_di.insn_info_valid)
1134 *branch_delay_insns = m_di.branch_delay_insns;
1135 else
1136 *branch_delay_insns = 0;
1137 }
1138 return length;
1139 }
1140
1141 void
1142 gdb_disassembly (struct gdbarch *gdbarch, struct ui_out *uiout,
1143 gdb_disassembly_flags flags, int how_many,
1144 CORE_ADDR low, CORE_ADDR high)
1145 {
1146 struct symtab *symtab;
1147 int nlines = -1;
1148
1149 /* Assume symtab is valid for whole PC range. */
1150 symtab = find_pc_line_symtab (low);
1151
1152 if (symtab != NULL && symtab->linetable () != NULL)
1153 nlines = symtab->linetable ()->nitems;
1154
1155 if (!(flags & (DISASSEMBLY_SOURCE_DEPRECATED | DISASSEMBLY_SOURCE))
1156 || nlines <= 0)
1157 do_assembly_only (gdbarch, uiout, low, high, how_many, flags);
1158
1159 else if (flags & DISASSEMBLY_SOURCE)
1160 do_mixed_source_and_assembly (gdbarch, uiout, symtab, low, high,
1161 how_many, flags);
1162
1163 else if (flags & DISASSEMBLY_SOURCE_DEPRECATED)
1164 do_mixed_source_and_assembly_deprecated (gdbarch, uiout, symtab,
1165 low, high, how_many, flags);
1166
1167 gdb_flush (gdb_stdout);
1168 }
1169
1170 /* Print the instruction at address MEMADDR in debugged memory,
1171 on STREAM. Returns the length of the instruction, in bytes,
1172 and, if requested, the number of branch delay slot instructions. */
1173
1174 int
1175 gdb_print_insn (struct gdbarch *gdbarch, CORE_ADDR memaddr,
1176 struct ui_file *stream, int *branch_delay_insns)
1177 {
1178
1179 gdb_disassembler di (gdbarch, stream);
1180
1181 return di.print_insn (memaddr, branch_delay_insns);
1182 }
1183
1184 /* Return the length in bytes of the instruction at address MEMADDR in
1185 debugged memory. */
1186
1187 int
1188 gdb_insn_length (struct gdbarch *gdbarch, CORE_ADDR addr)
1189 {
1190 return gdb_print_insn (gdbarch, addr, &null_stream, NULL);
1191 }
1192
1193 /* See disasm.h. */
1194
1195 int
1196 gdb_non_printing_disassembler::null_fprintf_func (void *stream,
1197 const char *format, ...)
1198 {
1199 return 0;
1200 }
1201
1202 /* See disasm.h. */
1203
1204 int
1205 gdb_non_printing_disassembler::null_fprintf_styled_func
1206 (void *stream, enum disassembler_style style, const char *format, ...)
1207 {
1208 return 0;
1209 }
1210
1211 /* A non-printing disassemble_info management class. The disassemble_info
1212 setup by this class will not print anything to the output stream (there
1213 is no output stream), and the instruction to be disassembled will be
1214 read from a buffer passed to the constructor. */
1215
1216 struct gdb_non_printing_buffer_disassembler
1217 : public gdb_non_printing_disassembler
1218 {
1219 /* Constructor. GDBARCH is the architecture to disassemble for, BUFFER
1220 contains the instruction to disassemble, and INSN_ADDRESS is the
1221 address (in target memory) of the instruction to disassemble. */
1222 gdb_non_printing_buffer_disassembler (struct gdbarch *gdbarch,
1223 gdb::array_view<const gdb_byte> buffer,
1224 CORE_ADDR insn_address)
1225 : gdb_non_printing_disassembler (gdbarch, nullptr)
1226 {
1227 /* The cast is necessary until disassemble_info is const-ified. */
1228 m_di.buffer = (gdb_byte *) buffer.data ();
1229 m_di.buffer_length = buffer.size ();
1230 m_di.buffer_vma = insn_address;
1231 }
1232 };
1233
1234 /* Return the length in bytes of INSN. MAX_LEN is the size of the
1235 buffer containing INSN. */
1236
1237 int
1238 gdb_buffered_insn_length (struct gdbarch *gdbarch,
1239 const gdb_byte *insn, int max_len, CORE_ADDR addr)
1240 {
1241 gdb::array_view<const gdb_byte> buffer
1242 = gdb::make_array_view (insn, max_len);
1243 gdb_non_printing_buffer_disassembler dis (gdbarch, buffer, addr);
1244 int result = gdb_print_insn_1 (gdbarch, addr, dis.disasm_info ());
1245 return result;
1246 }
1247
1248 char *
1249 get_disassembler_options (struct gdbarch *gdbarch)
1250 {
1251 char **disassembler_options = gdbarch_disassembler_options (gdbarch);
1252 if (disassembler_options == NULL)
1253 return NULL;
1254 return *disassembler_options;
1255 }
1256
1257 void
1258 set_disassembler_options (const char *prospective_options)
1259 {
1260 struct gdbarch *gdbarch = get_current_arch ();
1261 char **disassembler_options = gdbarch_disassembler_options (gdbarch);
1262 const disasm_options_and_args_t *valid_options_and_args;
1263 const disasm_options_t *valid_options;
1264 gdb::unique_xmalloc_ptr<char> prospective_options_local
1265 = make_unique_xstrdup (prospective_options);
1266 char *options = remove_whitespace_and_extra_commas
1267 (prospective_options_local.get ());
1268 const char *opt;
1269
1270 /* Allow all architectures, even ones that do not support 'set disassembler',
1271 to reset their disassembler options to NULL. */
1272 if (options == NULL)
1273 {
1274 if (disassembler_options != NULL)
1275 {
1276 free (*disassembler_options);
1277 *disassembler_options = NULL;
1278 }
1279 return;
1280 }
1281
1282 valid_options_and_args = gdbarch_valid_disassembler_options (gdbarch);
1283 if (valid_options_and_args == NULL)
1284 {
1285 gdb_printf (gdb_stderr, _("\
1286 'set disassembler-options ...' is not supported on this architecture.\n"));
1287 return;
1288 }
1289
1290 valid_options = &valid_options_and_args->options;
1291
1292 /* Verify we have valid disassembler options. */
1293 FOR_EACH_DISASSEMBLER_OPTION (opt, options)
1294 {
1295 size_t i;
1296 for (i = 0; valid_options->name[i] != NULL; i++)
1297 if (valid_options->arg != NULL && valid_options->arg[i] != NULL)
1298 {
1299 size_t len = strlen (valid_options->name[i]);
1300 bool found = false;
1301 const char *arg;
1302 size_t j;
1303
1304 if (memcmp (opt, valid_options->name[i], len) != 0)
1305 continue;
1306 arg = opt + len;
1307 if (valid_options->arg[i]->values == NULL)
1308 break;
1309 for (j = 0; valid_options->arg[i]->values[j] != NULL; j++)
1310 if (disassembler_options_cmp
1311 (arg, valid_options->arg[i]->values[j]) == 0)
1312 {
1313 found = true;
1314 break;
1315 }
1316 if (found)
1317 break;
1318 }
1319 else if (disassembler_options_cmp (opt, valid_options->name[i]) == 0)
1320 break;
1321 if (valid_options->name[i] == NULL)
1322 {
1323 gdb_printf (gdb_stderr,
1324 _("Invalid disassembler option value: '%s'.\n"),
1325 opt);
1326 return;
1327 }
1328 }
1329
1330 free (*disassembler_options);
1331 *disassembler_options = xstrdup (options);
1332 }
1333
1334 static void
1335 set_disassembler_options_sfunc (const char *args, int from_tty,
1336 struct cmd_list_element *c)
1337 {
1338 set_disassembler_options (prospective_options.c_str ());
1339 }
1340
1341 static void
1342 show_disassembler_options_sfunc (struct ui_file *file, int from_tty,
1343 struct cmd_list_element *c, const char *value)
1344 {
1345 struct gdbarch *gdbarch = get_current_arch ();
1346 const disasm_options_and_args_t *valid_options_and_args;
1347 const disasm_option_arg_t *valid_args;
1348 const disasm_options_t *valid_options;
1349
1350 const char *options = get_disassembler_options (gdbarch);
1351 if (options == NULL)
1352 options = "";
1353
1354 gdb_printf (file, _("The current disassembler options are '%s'\n\n"),
1355 options);
1356
1357 valid_options_and_args = gdbarch_valid_disassembler_options (gdbarch);
1358
1359 if (valid_options_and_args == NULL)
1360 {
1361 gdb_puts (_("There are no disassembler options available "
1362 "for this architecture.\n"),
1363 file);
1364 return;
1365 }
1366
1367 valid_options = &valid_options_and_args->options;
1368
1369 gdb_printf (file, _("\
1370 The following disassembler options are supported for use with the\n\
1371 'set disassembler-options OPTION [,OPTION]...' command:\n"));
1372
1373 if (valid_options->description != NULL)
1374 {
1375 size_t i, max_len = 0;
1376
1377 gdb_printf (file, "\n");
1378
1379 /* Compute the length of the longest option name. */
1380 for (i = 0; valid_options->name[i] != NULL; i++)
1381 {
1382 size_t len = strlen (valid_options->name[i]);
1383
1384 if (valid_options->arg != NULL && valid_options->arg[i] != NULL)
1385 len += strlen (valid_options->arg[i]->name);
1386 if (max_len < len)
1387 max_len = len;
1388 }
1389
1390 for (i = 0, max_len++; valid_options->name[i] != NULL; i++)
1391 {
1392 gdb_printf (file, " %s", valid_options->name[i]);
1393 if (valid_options->arg != NULL && valid_options->arg[i] != NULL)
1394 gdb_printf (file, "%s", valid_options->arg[i]->name);
1395 if (valid_options->description[i] != NULL)
1396 {
1397 size_t len = strlen (valid_options->name[i]);
1398
1399 if (valid_options->arg != NULL && valid_options->arg[i] != NULL)
1400 len += strlen (valid_options->arg[i]->name);
1401 gdb_printf (file, "%*c %s", (int) (max_len - len), ' ',
1402 valid_options->description[i]);
1403 }
1404 gdb_printf (file, "\n");
1405 }
1406 }
1407 else
1408 {
1409 size_t i;
1410 gdb_printf (file, " ");
1411 for (i = 0; valid_options->name[i] != NULL; i++)
1412 {
1413 gdb_printf (file, "%s", valid_options->name[i]);
1414 if (valid_options->arg != NULL && valid_options->arg[i] != NULL)
1415 gdb_printf (file, "%s", valid_options->arg[i]->name);
1416 if (valid_options->name[i + 1] != NULL)
1417 gdb_printf (file, ", ");
1418 file->wrap_here (2);
1419 }
1420 gdb_printf (file, "\n");
1421 }
1422
1423 valid_args = valid_options_and_args->args;
1424 if (valid_args != NULL)
1425 {
1426 size_t i, j;
1427
1428 for (i = 0; valid_args[i].name != NULL; i++)
1429 {
1430 if (valid_args[i].values == NULL)
1431 continue;
1432 gdb_printf (file, _("\n\
1433 For the options above, the following values are supported for \"%s\":\n "),
1434 valid_args[i].name);
1435 for (j = 0; valid_args[i].values[j] != NULL; j++)
1436 {
1437 gdb_printf (file, " %s", valid_args[i].values[j]);
1438 file->wrap_here (3);
1439 }
1440 gdb_printf (file, "\n");
1441 }
1442 }
1443 }
1444
1445 /* A completion function for "set disassembler". */
1446
1447 static void
1448 disassembler_options_completer (struct cmd_list_element *ignore,
1449 completion_tracker &tracker,
1450 const char *text, const char *word)
1451 {
1452 struct gdbarch *gdbarch = get_current_arch ();
1453 const disasm_options_and_args_t *opts_and_args
1454 = gdbarch_valid_disassembler_options (gdbarch);
1455
1456 if (opts_and_args != NULL)
1457 {
1458 const disasm_options_t *opts = &opts_and_args->options;
1459
1460 /* Only attempt to complete on the last option text. */
1461 const char *separator = strrchr (text, ',');
1462 if (separator != NULL)
1463 text = separator + 1;
1464 text = skip_spaces (text);
1465 complete_on_enum (tracker, opts->name, text, word);
1466 }
1467 }
1468
1469
1470 /* Initialization code. */
1471
1472 void _initialize_disasm ();
1473 void
1474 _initialize_disasm ()
1475 {
1476 /* Add the command that controls the disassembler options. */
1477 set_show_commands set_show_disas_opts
1478 = add_setshow_string_noescape_cmd ("disassembler-options", no_class,
1479 &prospective_options, _("\
1480 Set the disassembler options.\n\
1481 Usage: set disassembler-options OPTION [,OPTION]...\n\n\
1482 See: 'show disassembler-options' for valid option values."), _("\
1483 Show the disassembler options."), NULL,
1484 set_disassembler_options_sfunc,
1485 show_disassembler_options_sfunc,
1486 &setlist, &showlist);
1487 set_cmd_completer (set_show_disas_opts.set, disassembler_options_completer);
1488
1489
1490 /* All the 'maint set|show libopcodes-styling' sub-commands. */
1491 static struct cmd_list_element *maint_set_libopcodes_styling_cmdlist;
1492 static struct cmd_list_element *maint_show_libopcodes_styling_cmdlist;
1493
1494 /* Adds 'maint set|show libopcodes-styling'. */
1495 add_setshow_prefix_cmd ("libopcodes-styling", class_maintenance,
1496 _("Set libopcodes-styling specific variables."),
1497 _("Show libopcodes-styling specific variables."),
1498 &maint_set_libopcodes_styling_cmdlist,
1499 &maint_show_libopcodes_styling_cmdlist,
1500 &maintenance_set_cmdlist,
1501 &maintenance_show_cmdlist);
1502
1503 /* Adds 'maint set|show gnu-source-highlight enabled'. */
1504 add_setshow_boolean_cmd ("enabled", class_maintenance,
1505 &use_libopcodes_styling_option, _("\
1506 Set whether the libopcodes styling support should be used."), _("\
1507 Show whether the libopcodes styling support should be used."),_("\
1508 When enabled, GDB will try to make use of the builtin libopcodes styling\n\
1509 support, to style the disassembler output. Not every architecture has\n\
1510 styling support within libopcodes, so enabling this is not a guarantee\n\
1511 that libopcodes styling will be available.\n\
1512 \n\
1513 When this option is disabled, GDB will make use of the Python Pygments\n\
1514 package (if available) to style the disassembler output.\n\
1515 \n\
1516 All disassembler styling can be disabled with:\n\
1517 \n\
1518 set style disassembler enabled off"),
1519 set_use_libopcodes_styling,
1520 show_use_libopcodes_styling,
1521 &maint_set_libopcodes_styling_cmdlist,
1522 &maint_show_libopcodes_styling_cmdlist);
1523 }