1 /* Disassemble support for GDB.
3 Copyright (C) 2000-2022 Free Software Foundation, Inc.
5 This file is part of GDB.
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.
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.
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/>. */
21 #include "arch-utils.h"
30 #include "safe-ctype.h"
32 #include "gdbsupport/gdb_optional.h"
34 #include "cli/cli-style.h"
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. */
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
;
44 /* This structure is used to store line number information for the
46 We need a different sort of line table from the normal one cuz we can't
47 depend upon implicit line-end pc's for lines to do the
48 reordering in this function. */
50 struct deprecated_dis_line_entry
57 /* This Structure is used to store line number information.
58 We need a different sort of line table from the normal one cuz we can't
59 depend upon implicit line-end pc's for lines to do the
60 reordering in this function. */
64 struct symtab
*symtab
;
68 /* Hash function for dis_line_entry. */
71 hash_dis_line_entry (const void *item
)
73 const struct dis_line_entry
*dle
= (const struct dis_line_entry
*) item
;
75 return htab_hash_pointer (dle
->symtab
) + dle
->line
;
78 /* Equal function for dis_line_entry. */
81 eq_dis_line_entry (const void *item_lhs
, const void *item_rhs
)
83 const struct dis_line_entry
*lhs
= (const struct dis_line_entry
*) item_lhs
;
84 const struct dis_line_entry
*rhs
= (const struct dis_line_entry
*) item_rhs
;
86 return (lhs
->symtab
== rhs
->symtab
87 && lhs
->line
== rhs
->line
);
90 /* Create the table to manage lines for mixed source/disassembly. */
93 allocate_dis_line_table (void)
95 return htab_create_alloc (41,
96 hash_dis_line_entry
, eq_dis_line_entry
,
97 xfree
, xcalloc
, xfree
);
100 /* Add a new dis_line_entry containing SYMTAB and LINE to TABLE. */
103 add_dis_line_entry (htab_t table
, struct symtab
*symtab
, int line
)
106 struct dis_line_entry dle
, *dlep
;
110 slot
= htab_find_slot (table
, &dle
, INSERT
);
113 dlep
= XNEW (struct dis_line_entry
);
114 dlep
->symtab
= symtab
;
120 /* Return non-zero if SYMTAB, LINE are in TABLE. */
123 line_has_code_p (htab_t table
, struct symtab
*symtab
, int line
)
125 struct dis_line_entry dle
;
129 return htab_find (table
, &dle
) != NULL
;
132 /* Wrapper of target_read_code. */
135 gdb_disassembler::dis_asm_read_memory (bfd_vma memaddr
, gdb_byte
*myaddr
,
137 struct disassemble_info
*info
)
139 return target_read_code (memaddr
, myaddr
, len
);
142 /* Wrapper of memory_error. */
145 gdb_disassembler::dis_asm_memory_error (int err
, bfd_vma memaddr
,
146 struct disassemble_info
*info
)
148 gdb_disassembler
*self
149 = static_cast<gdb_disassembler
*>(info
->application_data
);
151 self
->m_err_memaddr
.emplace (memaddr
);
154 /* Wrapper of print_address. */
157 gdb_disassembler::dis_asm_print_address (bfd_vma addr
,
158 struct disassemble_info
*info
)
160 gdb_disassembler
*self
161 = static_cast<gdb_disassembler
*>(info
->application_data
);
163 print_address (self
->arch (), addr
, self
->stream ());
166 /* Format disassembler output to STREAM. */
169 gdb_disassembler::dis_asm_fprintf (void *stream
, const char *format
, ...)
173 va_start (args
, format
);
174 gdb_vprintf ((struct ui_file
*) stream
, format
, args
);
176 /* Something non -ve. */
183 gdb_disassembler::dis_asm_styled_fprintf (void *stream
,
184 enum disassembler_style style
,
185 const char *format
, ...)
189 va_start (args
, format
);
190 gdb_vprintf ((struct ui_file
*) stream
, format
, args
);
192 /* Something non -ve. */
197 line_is_less_than (const deprecated_dis_line_entry
&mle1
,
198 const deprecated_dis_line_entry
&mle2
)
202 /* End of sequence markers have a line number of 0 but don't want to
203 be sorted to the head of the list, instead sort by PC. */
204 if (mle1
.line
== 0 || mle2
.line
== 0)
206 if (mle1
.start_pc
!= mle2
.start_pc
)
207 val
= mle1
.start_pc
< mle2
.start_pc
;
209 val
= mle1
.line
< mle2
.line
;
213 if (mle1
.line
!= mle2
.line
)
214 val
= mle1
.line
< mle2
.line
;
216 val
= mle1
.start_pc
< mle2
.start_pc
;
224 gdb_pretty_print_disassembler::pretty_print_insn (const struct disasm_insn
*insn
,
225 gdb_disassembly_flags flags
)
227 /* parts of the symbolic representation of the address */
233 struct gdbarch
*gdbarch
= arch ();
236 ui_out_emit_tuple
tuple_emitter (m_uiout
, NULL
);
239 if (insn
->number
!= 0)
241 m_uiout
->field_unsigned ("insn-number", insn
->number
);
242 m_uiout
->text ("\t");
245 if ((flags
& DISASSEMBLY_SPECULATIVE
) != 0)
247 if (insn
->is_speculative
)
249 m_uiout
->field_string ("is-speculative", "?");
251 /* The speculative execution indication overwrites the first
252 character of the PC prefix.
253 We assume a PC prefix length of 3 characters. */
254 if ((flags
& DISASSEMBLY_OMIT_PC
) == 0)
255 m_uiout
->text (pc_prefix (pc
) + 1);
259 else if ((flags
& DISASSEMBLY_OMIT_PC
) == 0)
260 m_uiout
->text (pc_prefix (pc
));
264 else if ((flags
& DISASSEMBLY_OMIT_PC
) == 0)
265 m_uiout
->text (pc_prefix (pc
));
266 m_uiout
->field_core_addr ("address", gdbarch
, pc
);
268 std::string name
, filename
;
269 bool omit_fname
= ((flags
& DISASSEMBLY_OMIT_FNAME
) != 0);
270 if (!build_address_symbolic (gdbarch
, pc
, false, omit_fname
, &name
,
271 &offset
, &filename
, &line
, &unmapped
))
273 /* We don't care now about line, filename and unmapped. But we might in
275 m_uiout
->text (" <");
277 m_uiout
->field_string ("func-name", name
,
278 function_name_style
.style ());
279 /* For negative offsets, avoid displaying them as +-N; the sign of
280 the offset takes the place of the "+" here. */
283 m_uiout
->field_signed ("offset", offset
);
284 m_uiout
->text (">:\t");
287 m_uiout
->text (":\t");
289 /* Clear the buffer into which we will disassemble the instruction. */
292 /* A helper function to write the M_INSN_STB buffer, followed by a
293 newline. This can be called in a couple of situations. */
294 auto write_out_insn_buffer
= [&] ()
296 m_uiout
->field_stream ("inst", m_insn_stb
);
297 m_uiout
->text ("\n");
302 /* Now we can disassemble the instruction. If the disassembler
303 returns a negative value this indicates an error and is handled
304 within the print_insn call, resulting in an exception being
305 thrown. Returning zero makes no sense, as this indicates we
306 disassembled something successfully, but it was something of no
308 size
= m_di
.print_insn (pc
);
309 gdb_assert (size
> 0);
311 catch (const gdb_exception
&ex
)
313 /* An exception was thrown while disassembling the instruction.
314 However, the disassembler might still have written something
315 out, so ensure that we flush the instruction buffer before
316 rethrowing the exception. We can't perform this write from an
317 object destructor as the write itself might throw an exception
318 if the pager kicks in, and the user selects quit. */
319 write_out_insn_buffer ();
323 if (flags
& DISASSEMBLY_RAW_INSN
)
327 const char *spacer
= "";
329 /* Build the opcodes using a temporary stream so we can
330 write them out in a single go for the MI. */
331 m_opcode_stb
.clear ();
335 for (;pc
< end_pc
; ++pc
)
337 read_code (pc
, &data
, 1);
338 m_opcode_stb
.printf ("%s%02x", spacer
, (unsigned) data
);
342 m_uiout
->field_stream ("opcodes", m_opcode_stb
);
343 m_uiout
->text ("\t");
346 /* Disassembly was a success, write out the instruction buffer. */
347 write_out_insn_buffer ();
354 dump_insns (struct gdbarch
*gdbarch
,
355 struct ui_out
*uiout
, CORE_ADDR low
, CORE_ADDR high
,
356 int how_many
, gdb_disassembly_flags flags
, CORE_ADDR
*end_pc
)
358 struct disasm_insn insn
;
359 int num_displayed
= 0;
361 memset (&insn
, 0, sizeof (insn
));
364 gdb_pretty_print_disassembler
disasm (gdbarch
, uiout
);
366 while (insn
.addr
< high
&& (how_many
< 0 || num_displayed
< how_many
))
370 size
= disasm
.pretty_print_insn (&insn
, flags
);
377 /* Allow user to bail out with ^C. */
384 return num_displayed
;
387 /* The idea here is to present a source-O-centric view of a
388 function to the user. This means that things are presented
389 in source order, with (possibly) out of order assembly
390 immediately following.
392 N.B. This view is deprecated. */
395 do_mixed_source_and_assembly_deprecated
396 (struct gdbarch
*gdbarch
, struct ui_out
*uiout
,
397 struct symtab
*symtab
,
398 CORE_ADDR low
, CORE_ADDR high
,
399 int how_many
, gdb_disassembly_flags flags
)
403 struct linetable_entry
*le
;
404 struct deprecated_dis_line_entry
*mle
;
405 struct symtab_and_line sal
;
407 int out_of_order
= 0;
409 int num_displayed
= 0;
410 print_source_lines_flags psl_flags
= 0;
412 gdb_assert (symtab
!= nullptr && symtab
->linetable () != nullptr);
414 nlines
= symtab
->linetable ()->nitems
;
415 le
= symtab
->linetable ()->item
;
417 if (flags
& DISASSEMBLY_FILENAME
)
418 psl_flags
|= PRINT_SOURCE_LINES_FILENAME
;
420 mle
= (struct deprecated_dis_line_entry
*)
421 alloca (nlines
* sizeof (struct deprecated_dis_line_entry
));
423 /* Copy linetable entries for this function into our data
424 structure, creating end_pc's and setting out_of_order as
427 /* First, skip all the preceding functions. */
429 for (i
= 0; i
< nlines
- 1 && le
[i
].pc
< low
; i
++);
431 /* Now, copy all entries before the end of this function. */
433 for (; i
< nlines
- 1 && le
[i
].pc
< high
; i
++)
435 if (le
[i
].line
== le
[i
+ 1].line
&& le
[i
].pc
== le
[i
+ 1].pc
)
436 continue; /* Ignore duplicates. */
438 /* Skip any end-of-function markers. */
442 mle
[newlines
].line
= le
[i
].line
;
443 if (le
[i
].line
> le
[i
+ 1].line
)
445 mle
[newlines
].start_pc
= le
[i
].pc
;
446 mle
[newlines
].end_pc
= le
[i
+ 1].pc
;
450 /* If we're on the last line, and it's part of the function,
451 then we need to get the end pc in a special way. */
453 if (i
== nlines
- 1 && le
[i
].pc
< high
)
455 mle
[newlines
].line
= le
[i
].line
;
456 mle
[newlines
].start_pc
= le
[i
].pc
;
457 sal
= find_pc_line (le
[i
].pc
, 0);
458 mle
[newlines
].end_pc
= sal
.end
;
462 /* Now, sort mle by line #s (and, then by addresses within lines). */
465 std::sort (mle
, mle
+ newlines
, line_is_less_than
);
467 /* Now, for each line entry, emit the specified lines (unless
468 they have been emitted before), followed by the assembly code
471 ui_out_emit_list
asm_insns_list (uiout
, "asm_insns");
473 gdb::optional
<ui_out_emit_tuple
> outer_tuple_emitter
;
474 gdb::optional
<ui_out_emit_list
> inner_list_emitter
;
476 for (i
= 0; i
< newlines
; i
++)
478 /* Print out everything from next_line to the current line. */
479 if (mle
[i
].line
>= next_line
)
483 /* Just one line to print. */
484 if (next_line
== mle
[i
].line
)
486 outer_tuple_emitter
.emplace (uiout
, "src_and_asm_line");
487 print_source_lines (symtab
, next_line
, mle
[i
].line
+ 1, psl_flags
);
491 /* Several source lines w/o asm instructions associated. */
492 for (; next_line
< mle
[i
].line
; next_line
++)
494 ui_out_emit_tuple
tuple_emitter (uiout
,
496 print_source_lines (symtab
, next_line
, next_line
+ 1,
498 ui_out_emit_list
temp_list_emitter (uiout
,
501 /* Print the last line and leave list open for
502 asm instructions to be added. */
503 outer_tuple_emitter
.emplace (uiout
, "src_and_asm_line");
504 print_source_lines (symtab
, next_line
, mle
[i
].line
+ 1, psl_flags
);
509 outer_tuple_emitter
.emplace (uiout
, "src_and_asm_line");
510 print_source_lines (symtab
, mle
[i
].line
, mle
[i
].line
+ 1, psl_flags
);
513 next_line
= mle
[i
].line
+ 1;
514 inner_list_emitter
.emplace (uiout
, "line_asm_insn");
517 num_displayed
+= dump_insns (gdbarch
, uiout
,
518 mle
[i
].start_pc
, mle
[i
].end_pc
,
519 how_many
, flags
, NULL
);
521 /* When we've reached the end of the mle array, or we've seen the last
522 assembly range for this source line, close out the list/tuple. */
523 if (i
== (newlines
- 1) || mle
[i
+ 1].line
> mle
[i
].line
)
525 inner_list_emitter
.reset ();
526 outer_tuple_emitter
.reset ();
529 if (how_many
>= 0 && num_displayed
>= how_many
)
534 /* The idea here is to present a source-O-centric view of a
535 function to the user. This means that things are presented
536 in source order, with (possibly) out of order assembly
537 immediately following. */
540 do_mixed_source_and_assembly (struct gdbarch
*gdbarch
,
541 struct ui_out
*uiout
,
542 struct symtab
*main_symtab
,
543 CORE_ADDR low
, CORE_ADDR high
,
544 int how_many
, gdb_disassembly_flags flags
)
546 const struct linetable_entry
*le
, *first_le
;
548 int num_displayed
= 0;
549 print_source_lines_flags psl_flags
= 0;
551 struct symtab
*last_symtab
;
554 gdb_assert (main_symtab
!= NULL
&& main_symtab
->linetable () != NULL
);
556 /* First pass: collect the list of all source files and lines.
557 We do this so that we can only print lines containing code once.
558 We try to print the source text leading up to the next instruction,
559 but if that text is for code that will be disassembled later, then
560 we'll want to defer printing it until later with its associated code. */
562 htab_up
dis_line_table (allocate_dis_line_table ());
566 /* The prologue may be empty, but there may still be a line number entry
567 for the opening brace which is distinct from the first line of code.
568 If the prologue has been eliminated find_pc_line may return the source
569 line after the opening brace. We still want to print this opening brace.
570 first_le is used to implement this. */
572 nlines
= main_symtab
->linetable ()->nitems
;
573 le
= main_symtab
->linetable ()->item
;
576 /* Skip all the preceding functions. */
577 for (i
= 0; i
< nlines
&& le
[i
].pc
< low
; i
++)
580 if (i
< nlines
&& le
[i
].pc
< high
)
583 /* Add lines for every pc value. */
586 struct symtab_and_line sal
;
589 sal
= find_pc_line (pc
, 0);
590 length
= gdb_insn_length (gdbarch
, pc
);
593 if (sal
.symtab
!= NULL
)
594 add_dis_line_entry (dis_line_table
.get (), sal
.symtab
, sal
.line
);
597 /* Second pass: print the disassembly.
599 Output format, from an MI perspective:
600 The result is a ui_out list, field name "asm_insns", where elements have
601 name "src_and_asm_line".
602 Each element is a tuple of source line specs (field names line, file,
603 fullname), and field "line_asm_insn" which contains the disassembly.
604 Field "line_asm_insn" is a list of tuples: address, func-name, offset,
607 CLI output works on top of this because MI ignores ui_out_text output,
608 which is where we put file name and source line contents output.
612 Handles the outer "asm_insns" list.
614 The tuples for each group of consecutive disassemblies.
616 List of consecutive source lines or disassembled insns. */
618 if (flags
& DISASSEMBLY_FILENAME
)
619 psl_flags
|= PRINT_SOURCE_LINES_FILENAME
;
621 ui_out_emit_list
asm_insns_emitter (uiout
, "asm_insns");
623 gdb::optional
<ui_out_emit_tuple
> tuple_emitter
;
624 gdb::optional
<ui_out_emit_list
> list_emitter
;
632 struct symtab_and_line sal
;
634 int start_preceding_line_to_display
= 0;
635 int end_preceding_line_to_display
= 0;
636 int new_source_line
= 0;
638 sal
= find_pc_line (pc
, 0);
640 if (sal
.symtab
!= last_symtab
)
642 /* New source file. */
645 /* If this is the first line of output, check for any preceding
649 && first_le
->line
< sal
.line
)
651 start_preceding_line_to_display
= first_le
->line
;
652 end_preceding_line_to_display
= sal
.line
;
657 /* Same source file as last time. */
658 if (sal
.symtab
!= NULL
)
660 if (sal
.line
> last_line
+ 1 && last_line
!= 0)
664 /* Several preceding source lines. Print the trailing ones
665 not associated with code that we'll print later. */
666 for (l
= sal
.line
- 1; l
> last_line
; --l
)
668 if (line_has_code_p (dis_line_table
.get (),
672 if (l
< sal
.line
- 1)
674 start_preceding_line_to_display
= l
+ 1;
675 end_preceding_line_to_display
= sal
.line
;
678 if (sal
.line
!= last_line
)
682 /* Same source line as last time. This can happen, depending
683 on the debug info. */
690 /* Skip the newline if this is the first instruction. */
693 if (tuple_emitter
.has_value ())
695 gdb_assert (list_emitter
.has_value ());
696 list_emitter
.reset ();
697 tuple_emitter
.reset ();
699 if (sal
.symtab
!= last_symtab
700 && !(flags
& DISASSEMBLY_FILENAME
))
702 /* Remember MI ignores ui_out_text.
703 We don't have to do anything here for MI because MI
704 output includes the source specs for each line. */
705 if (sal
.symtab
!= NULL
)
707 uiout
->text (symtab_to_filename_for_display (sal
.symtab
));
710 uiout
->text ("unknown");
713 if (start_preceding_line_to_display
> 0)
715 /* Several source lines w/o asm instructions associated.
716 We need to preserve the structure of the output, so output
717 a bunch of line tuples with no asm entries. */
720 gdb_assert (sal
.symtab
!= NULL
);
721 for (l
= start_preceding_line_to_display
;
722 l
< end_preceding_line_to_display
;
725 ui_out_emit_tuple
line_tuple_emitter (uiout
,
727 print_source_lines (sal
.symtab
, l
, l
+ 1, psl_flags
);
728 ui_out_emit_list
chain_line_emitter (uiout
, "line_asm_insn");
731 tuple_emitter
.emplace (uiout
, "src_and_asm_line");
732 if (sal
.symtab
!= NULL
)
733 print_source_lines (sal
.symtab
, sal
.line
, sal
.line
+ 1, psl_flags
);
735 uiout
->text (_("--- no source info for this pc ---\n"));
736 list_emitter
.emplace (uiout
, "line_asm_insn");
740 /* Here we're appending instructions to an existing line.
741 By construction the very first insn will have a symtab
742 and follow the new_source_line path above. */
743 gdb_assert (tuple_emitter
.has_value ());
744 gdb_assert (list_emitter
.has_value ());
748 end_pc
= std::min (sal
.end
, high
);
751 num_displayed
+= dump_insns (gdbarch
, uiout
, pc
, end_pc
,
752 how_many
, flags
, &end_pc
);
755 if (how_many
>= 0 && num_displayed
>= how_many
)
758 last_symtab
= sal
.symtab
;
759 last_line
= sal
.line
;
764 do_assembly_only (struct gdbarch
*gdbarch
, struct ui_out
*uiout
,
765 CORE_ADDR low
, CORE_ADDR high
,
766 int how_many
, gdb_disassembly_flags flags
)
768 ui_out_emit_list
list_emitter (uiout
, "asm_insns");
770 dump_insns (gdbarch
, uiout
, low
, high
, how_many
, flags
, NULL
);
773 /* Combine implicit and user disassembler options and return them
774 in a newly-created string. */
777 get_all_disassembler_options (struct gdbarch
*gdbarch
)
779 const char *implicit
= gdbarch_disassembler_options_implicit (gdbarch
);
780 const char *options
= get_disassembler_options (gdbarch
);
781 const char *comma
= ",";
783 if (implicit
== nullptr)
789 if (options
== nullptr)
795 return string_printf ("%s%s%s", implicit
, comma
, options
);
798 gdb_disassembler::gdb_disassembler (struct gdbarch
*gdbarch
,
799 struct ui_file
*file
,
800 di_read_memory_ftype read_memory_func
)
801 : m_gdbarch (gdbarch
),
802 m_buffer (!use_ext_lang_colorization_p
&& disassembler_styling
803 && file
->can_emit_style_escape ()),
806 init_disassemble_info (&m_di
, &m_buffer
, dis_asm_fprintf
,
807 dis_asm_styled_fprintf
);
808 m_di
.flavour
= bfd_target_unknown_flavour
;
809 m_di
.memory_error_func
= dis_asm_memory_error
;
810 m_di
.print_address_func
= dis_asm_print_address
;
811 /* NOTE: cagney/2003-04-28: The original code, from the old Insight
812 disassembler had a local optimization here. By default it would
813 access the executable file, instead of the target memory (there
814 was a growing list of exceptions though). Unfortunately, the
815 heuristic was flawed. Commands like "disassemble &variable"
816 didn't work as they relied on the access going to the target.
817 Further, it has been superseeded by trust-read-only-sections
818 (although that should be superseeded by target_trust..._p()). */
819 m_di
.read_memory_func
= read_memory_func
;
820 m_di
.arch
= gdbarch_bfd_arch_info (gdbarch
)->arch
;
821 m_di
.mach
= gdbarch_bfd_arch_info (gdbarch
)->mach
;
822 m_di
.endian
= gdbarch_byte_order (gdbarch
);
823 m_di
.endian_code
= gdbarch_byte_order_for_code (gdbarch
);
824 m_di
.application_data
= this;
825 m_disassembler_options_holder
= get_all_disassembler_options (gdbarch
);
826 if (!m_disassembler_options_holder
.empty ())
827 m_di
.disassembler_options
= m_disassembler_options_holder
.c_str ();
828 disassemble_init_for_target (&m_di
);
831 gdb_disassembler::~gdb_disassembler ()
833 disassemble_free_target (&m_di
);
838 bool gdb_disassembler::use_ext_lang_colorization_p
= true;
843 gdb_disassembler::print_insn (CORE_ADDR memaddr
,
844 int *branch_delay_insns
)
846 m_err_memaddr
.reset ();
849 int length
= gdbarch_print_insn (arch (), memaddr
, &m_di
);
851 /* If we have successfully disassembled an instruction, styling is on, we
852 think that the extension language might be able to perform styling for
853 us, and the destination can support styling, then lets call into the
854 extension languages in order to style this output. */
855 if (length
> 0 && disassembler_styling
856 && use_ext_lang_colorization_p
857 && m_dest
->can_emit_style_escape ())
859 gdb::optional
<std::string
> ext_contents
;
860 ext_contents
= ext_lang_colorize_disasm (m_buffer
.string (), arch ());
861 if (ext_contents
.has_value ())
862 m_buffer
= std::move (*ext_contents
);
865 /* The extension language failed to add styling to the
866 disassembly output. Set the static flag so that next time we
867 disassemble we don't even bother attempting to use the
868 extension language for styling. */
869 use_ext_lang_colorization_p
= false;
871 /* The instruction we just disassembled, and the extension
872 languages failed to style, might have otherwise had some
873 minimal styling applied by GDB. To regain that styling we
874 need to recreate m_buffer, but this time with styling support.
876 To do this we perform an in-place new, but this time turn on
877 the styling support, then we can re-disassembly the
878 instruction, and gain any minimal styling GDB might add. */
879 gdb_static_assert ((std::is_same
<decltype (m_buffer
),
880 string_file
>::value
));
881 gdb_assert (!m_buffer
.term_out ());
882 m_buffer
.~string_file ();
883 new (&m_buffer
) string_file (true);
884 length
= gdbarch_print_insn (arch (), memaddr
, &m_di
);
885 gdb_assert (length
> 0);
889 /* Push any disassemble output to the real destination stream. We do
890 this even if the disassembler reported failure (-1) as the
891 disassembler may have printed something to its output stream. */
892 m_di
.fprintf_func (m_dest
, "%s", m_buffer
.c_str ());
894 /* If the disassembler failed then report an appropriate error. */
897 if (m_err_memaddr
.has_value ())
898 memory_error (TARGET_XFER_E_IO
, *m_err_memaddr
);
900 error (_("unknown disassembler error (error = %d)"), length
);
903 if (branch_delay_insns
!= NULL
)
905 if (m_di
.insn_info_valid
)
906 *branch_delay_insns
= m_di
.branch_delay_insns
;
908 *branch_delay_insns
= 0;
914 gdb_disassembly (struct gdbarch
*gdbarch
, struct ui_out
*uiout
,
915 gdb_disassembly_flags flags
, int how_many
,
916 CORE_ADDR low
, CORE_ADDR high
)
918 struct symtab
*symtab
;
921 /* Assume symtab is valid for whole PC range. */
922 symtab
= find_pc_line_symtab (low
);
924 if (symtab
!= NULL
&& symtab
->linetable () != NULL
)
925 nlines
= symtab
->linetable ()->nitems
;
927 if (!(flags
& (DISASSEMBLY_SOURCE_DEPRECATED
| DISASSEMBLY_SOURCE
))
929 do_assembly_only (gdbarch
, uiout
, low
, high
, how_many
, flags
);
931 else if (flags
& DISASSEMBLY_SOURCE
)
932 do_mixed_source_and_assembly (gdbarch
, uiout
, symtab
, low
, high
,
935 else if (flags
& DISASSEMBLY_SOURCE_DEPRECATED
)
936 do_mixed_source_and_assembly_deprecated (gdbarch
, uiout
, symtab
,
937 low
, high
, how_many
, flags
);
939 gdb_flush (gdb_stdout
);
942 /* Print the instruction at address MEMADDR in debugged memory,
943 on STREAM. Returns the length of the instruction, in bytes,
944 and, if requested, the number of branch delay slot instructions. */
947 gdb_print_insn (struct gdbarch
*gdbarch
, CORE_ADDR memaddr
,
948 struct ui_file
*stream
, int *branch_delay_insns
)
951 gdb_disassembler
di (gdbarch
, stream
);
953 return di
.print_insn (memaddr
, branch_delay_insns
);
956 /* Return the length in bytes of the instruction at address MEMADDR in
960 gdb_insn_length (struct gdbarch
*gdbarch
, CORE_ADDR addr
)
962 return gdb_print_insn (gdbarch
, addr
, &null_stream
, NULL
);
965 /* An fprintf-function for use by the disassembler when we know we don't
966 want to print anything. Always returns success. */
968 static int ATTRIBUTE_PRINTF (2, 3)
969 gdb_disasm_null_printf (void *stream
, const char *format
, ...)
974 /* An fprintf-function for use by the disassembler when we know we don't
975 want to print anything, and the disassembler is using style. Always
978 static int ATTRIBUTE_PRINTF (3, 4)
979 gdb_disasm_null_styled_printf (void *stream
,
980 enum disassembler_style style
,
981 const char *format
, ...)
989 init_disassemble_info_for_no_printing (struct disassemble_info
*dinfo
)
991 init_disassemble_info (dinfo
, nullptr, gdb_disasm_null_printf
,
992 gdb_disasm_null_styled_printf
);
995 /* Initialize a struct disassemble_info for gdb_buffered_insn_length.
996 Upon return, *DISASSEMBLER_OPTIONS_HOLDER owns the string pointed
997 to by DI.DISASSEMBLER_OPTIONS. */
1000 gdb_buffered_insn_length_init_dis (struct gdbarch
*gdbarch
,
1001 struct disassemble_info
*di
,
1002 const gdb_byte
*insn
, int max_len
,
1004 std::string
*disassembler_options_holder
)
1006 init_disassemble_info_for_no_printing (di
);
1008 /* init_disassemble_info installs buffer_read_memory, etc.
1009 so we don't need to do that here.
1010 The cast is necessary until disassemble_info is const-ified. */
1011 di
->buffer
= (gdb_byte
*) insn
;
1012 di
->buffer_length
= max_len
;
1013 di
->buffer_vma
= addr
;
1015 di
->arch
= gdbarch_bfd_arch_info (gdbarch
)->arch
;
1016 di
->mach
= gdbarch_bfd_arch_info (gdbarch
)->mach
;
1017 di
->endian
= gdbarch_byte_order (gdbarch
);
1018 di
->endian_code
= gdbarch_byte_order_for_code (gdbarch
);
1020 *disassembler_options_holder
= get_all_disassembler_options (gdbarch
);
1021 if (!disassembler_options_holder
->empty ())
1022 di
->disassembler_options
= disassembler_options_holder
->c_str ();
1023 disassemble_init_for_target (di
);
1026 /* Return the length in bytes of INSN. MAX_LEN is the size of the
1027 buffer containing INSN. */
1030 gdb_buffered_insn_length (struct gdbarch
*gdbarch
,
1031 const gdb_byte
*insn
, int max_len
, CORE_ADDR addr
)
1033 struct disassemble_info di
;
1034 std::string disassembler_options_holder
;
1036 gdb_buffered_insn_length_init_dis (gdbarch
, &di
, insn
, max_len
, addr
,
1037 &disassembler_options_holder
);
1039 int result
= gdbarch_print_insn (gdbarch
, addr
, &di
);
1040 disassemble_free_target (&di
);
1045 get_disassembler_options (struct gdbarch
*gdbarch
)
1047 char **disassembler_options
= gdbarch_disassembler_options (gdbarch
);
1048 if (disassembler_options
== NULL
)
1050 return *disassembler_options
;
1054 set_disassembler_options (const char *prospective_options
)
1056 struct gdbarch
*gdbarch
= get_current_arch ();
1057 char **disassembler_options
= gdbarch_disassembler_options (gdbarch
);
1058 const disasm_options_and_args_t
*valid_options_and_args
;
1059 const disasm_options_t
*valid_options
;
1060 gdb::unique_xmalloc_ptr
<char> prospective_options_local
1061 = make_unique_xstrdup (prospective_options
);
1062 char *options
= remove_whitespace_and_extra_commas
1063 (prospective_options_local
.get ());
1066 /* Allow all architectures, even ones that do not support 'set disassembler',
1067 to reset their disassembler options to NULL. */
1068 if (options
== NULL
)
1070 if (disassembler_options
!= NULL
)
1072 free (*disassembler_options
);
1073 *disassembler_options
= NULL
;
1078 valid_options_and_args
= gdbarch_valid_disassembler_options (gdbarch
);
1079 if (valid_options_and_args
== NULL
)
1081 gdb_printf (gdb_stderr
, _("\
1082 'set disassembler-options ...' is not supported on this architecture.\n"));
1086 valid_options
= &valid_options_and_args
->options
;
1088 /* Verify we have valid disassembler options. */
1089 FOR_EACH_DISASSEMBLER_OPTION (opt
, options
)
1092 for (i
= 0; valid_options
->name
[i
] != NULL
; i
++)
1093 if (valid_options
->arg
!= NULL
&& valid_options
->arg
[i
] != NULL
)
1095 size_t len
= strlen (valid_options
->name
[i
]);
1100 if (memcmp (opt
, valid_options
->name
[i
], len
) != 0)
1103 for (j
= 0; valid_options
->arg
[i
]->values
[j
] != NULL
; j
++)
1104 if (disassembler_options_cmp
1105 (arg
, valid_options
->arg
[i
]->values
[j
]) == 0)
1113 else if (disassembler_options_cmp (opt
, valid_options
->name
[i
]) == 0)
1115 if (valid_options
->name
[i
] == NULL
)
1117 gdb_printf (gdb_stderr
,
1118 _("Invalid disassembler option value: '%s'.\n"),
1124 free (*disassembler_options
);
1125 *disassembler_options
= xstrdup (options
);
1129 set_disassembler_options_sfunc (const char *args
, int from_tty
,
1130 struct cmd_list_element
*c
)
1132 set_disassembler_options (prospective_options
.c_str ());
1136 show_disassembler_options_sfunc (struct ui_file
*file
, int from_tty
,
1137 struct cmd_list_element
*c
, const char *value
)
1139 struct gdbarch
*gdbarch
= get_current_arch ();
1140 const disasm_options_and_args_t
*valid_options_and_args
;
1141 const disasm_option_arg_t
*valid_args
;
1142 const disasm_options_t
*valid_options
;
1144 const char *options
= get_disassembler_options (gdbarch
);
1145 if (options
== NULL
)
1148 gdb_printf (file
, _("The current disassembler options are '%s'\n\n"),
1151 valid_options_and_args
= gdbarch_valid_disassembler_options (gdbarch
);
1153 if (valid_options_and_args
== NULL
)
1155 gdb_puts (_("There are no disassembler options available "
1156 "for this architecture.\n"),
1161 valid_options
= &valid_options_and_args
->options
;
1163 gdb_printf (file
, _("\
1164 The following disassembler options are supported for use with the\n\
1165 'set disassembler-options OPTION [,OPTION]...' command:\n"));
1167 if (valid_options
->description
!= NULL
)
1169 size_t i
, max_len
= 0;
1171 gdb_printf (file
, "\n");
1173 /* Compute the length of the longest option name. */
1174 for (i
= 0; valid_options
->name
[i
] != NULL
; i
++)
1176 size_t len
= strlen (valid_options
->name
[i
]);
1178 if (valid_options
->arg
!= NULL
&& valid_options
->arg
[i
] != NULL
)
1179 len
+= strlen (valid_options
->arg
[i
]->name
);
1184 for (i
= 0, max_len
++; valid_options
->name
[i
] != NULL
; i
++)
1186 gdb_printf (file
, " %s", valid_options
->name
[i
]);
1187 if (valid_options
->arg
!= NULL
&& valid_options
->arg
[i
] != NULL
)
1188 gdb_printf (file
, "%s", valid_options
->arg
[i
]->name
);
1189 if (valid_options
->description
[i
] != NULL
)
1191 size_t len
= strlen (valid_options
->name
[i
]);
1193 if (valid_options
->arg
!= NULL
&& valid_options
->arg
[i
] != NULL
)
1194 len
+= strlen (valid_options
->arg
[i
]->name
);
1195 gdb_printf (file
, "%*c %s", (int) (max_len
- len
), ' ',
1196 valid_options
->description
[i
]);
1198 gdb_printf (file
, "\n");
1204 gdb_printf (file
, " ");
1205 for (i
= 0; valid_options
->name
[i
] != NULL
; i
++)
1207 gdb_printf (file
, "%s", valid_options
->name
[i
]);
1208 if (valid_options
->arg
!= NULL
&& valid_options
->arg
[i
] != NULL
)
1209 gdb_printf (file
, "%s", valid_options
->arg
[i
]->name
);
1210 if (valid_options
->name
[i
+ 1] != NULL
)
1211 gdb_printf (file
, ", ");
1212 file
->wrap_here (2);
1214 gdb_printf (file
, "\n");
1217 valid_args
= valid_options_and_args
->args
;
1218 if (valid_args
!= NULL
)
1222 for (i
= 0; valid_args
[i
].name
!= NULL
; i
++)
1224 gdb_printf (file
, _("\n\
1225 For the options above, the following values are supported for \"%s\":\n "),
1226 valid_args
[i
].name
);
1227 for (j
= 0; valid_args
[i
].values
[j
] != NULL
; j
++)
1229 gdb_printf (file
, " %s", valid_args
[i
].values
[j
]);
1230 file
->wrap_here (3);
1232 gdb_printf (file
, "\n");
1237 /* A completion function for "set disassembler". */
1240 disassembler_options_completer (struct cmd_list_element
*ignore
,
1241 completion_tracker
&tracker
,
1242 const char *text
, const char *word
)
1244 struct gdbarch
*gdbarch
= get_current_arch ();
1245 const disasm_options_and_args_t
*opts_and_args
1246 = gdbarch_valid_disassembler_options (gdbarch
);
1248 if (opts_and_args
!= NULL
)
1250 const disasm_options_t
*opts
= &opts_and_args
->options
;
1252 /* Only attempt to complete on the last option text. */
1253 const char *separator
= strrchr (text
, ',');
1254 if (separator
!= NULL
)
1255 text
= separator
+ 1;
1256 text
= skip_spaces (text
);
1257 complete_on_enum (tracker
, opts
->name
, text
, word
);
1262 /* Initialization code. */
1264 void _initialize_disasm ();
1266 _initialize_disasm ()
1268 /* Add the command that controls the disassembler options. */
1269 set_show_commands set_show_disas_opts
1270 = add_setshow_string_noescape_cmd ("disassembler-options", no_class
,
1271 &prospective_options
, _("\
1272 Set the disassembler options.\n\
1273 Usage: set disassembler-options OPTION [,OPTION]...\n\n\
1274 See: 'show disassembler-options' for valid option values."), _("\
1275 Show the disassembler options."), NULL
,
1276 set_disassembler_options_sfunc
,
1277 show_disassembler_options_sfunc
,
1278 &setlist
, &showlist
);
1279 set_cmd_completer (set_show_disas_opts
.set
, disassembler_options_completer
);