1 /* Disassemble support for GDB.
3 Copyright (C) 2000-2017 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/>. */
30 /* Disassemble functions.
31 FIXME: We should get rid of all the duplicate code in gdb that does
32 the same thing: disassemble_command() and the gdbtk variation. */
34 /* This structure is used to store line number information for the
36 We need a different sort of line table from the normal one cuz we can't
37 depend upon implicit line-end pc's for lines to do the
38 reordering in this function. */
40 struct deprecated_dis_line_entry
47 /* This Structure is used to store line number information.
48 We need a different sort of line table from the normal one cuz we can't
49 depend upon implicit line-end pc's for lines to do the
50 reordering in this function. */
54 struct symtab
*symtab
;
58 /* Hash function for dis_line_entry. */
61 hash_dis_line_entry (const void *item
)
63 const struct dis_line_entry
*dle
= (const struct dis_line_entry
*) item
;
65 return htab_hash_pointer (dle
->symtab
) + dle
->line
;
68 /* Equal function for dis_line_entry. */
71 eq_dis_line_entry (const void *item_lhs
, const void *item_rhs
)
73 const struct dis_line_entry
*lhs
= (const struct dis_line_entry
*) item_lhs
;
74 const struct dis_line_entry
*rhs
= (const struct dis_line_entry
*) item_rhs
;
76 return (lhs
->symtab
== rhs
->symtab
77 && lhs
->line
== rhs
->line
);
80 /* Create the table to manage lines for mixed source/disassembly. */
83 allocate_dis_line_table (void)
85 return htab_create_alloc (41,
86 hash_dis_line_entry
, eq_dis_line_entry
,
87 xfree
, xcalloc
, xfree
);
90 /* Add a new dis_line_entry containing SYMTAB and LINE to TABLE. */
93 add_dis_line_entry (htab_t table
, struct symtab
*symtab
, int line
)
96 struct dis_line_entry dle
, *dlep
;
100 slot
= htab_find_slot (table
, &dle
, INSERT
);
103 dlep
= XNEW (struct dis_line_entry
);
104 dlep
->symtab
= symtab
;
110 /* Return non-zero if SYMTAB, LINE are in TABLE. */
113 line_has_code_p (htab_t table
, struct symtab
*symtab
, int line
)
115 struct dis_line_entry dle
;
119 return htab_find (table
, &dle
) != NULL
;
122 /* Wrapper of target_read_code. */
125 gdb_disassembler::dis_asm_read_memory (bfd_vma memaddr
, gdb_byte
*myaddr
,
127 struct disassemble_info
*info
)
129 return target_read_code (memaddr
, myaddr
, len
);
132 /* Wrapper of memory_error. */
135 gdb_disassembler::dis_asm_memory_error (int err
, bfd_vma memaddr
,
136 struct disassemble_info
*info
)
138 gdb_disassembler
*self
139 = static_cast<gdb_disassembler
*>(info
->application_data
);
141 self
->m_err_memaddr
= memaddr
;
144 /* Wrapper of print_address. */
147 gdb_disassembler::dis_asm_print_address (bfd_vma addr
,
148 struct disassemble_info
*info
)
150 gdb_disassembler
*self
151 = static_cast<gdb_disassembler
*>(info
->application_data
);
153 print_address (self
->arch (), addr
, self
->stream ());
157 compare_lines (const void *mle1p
, const void *mle2p
)
159 struct deprecated_dis_line_entry
*mle1
, *mle2
;
162 mle1
= (struct deprecated_dis_line_entry
*) mle1p
;
163 mle2
= (struct deprecated_dis_line_entry
*) mle2p
;
165 /* End of sequence markers have a line number of 0 but don't want to
166 be sorted to the head of the list, instead sort by PC. */
167 if (mle1
->line
== 0 || mle2
->line
== 0)
169 val
= mle1
->start_pc
- mle2
->start_pc
;
171 val
= mle1
->line
- mle2
->line
;
175 val
= mle1
->line
- mle2
->line
;
177 val
= mle1
->start_pc
- mle2
->start_pc
;
185 gdb_disassembler::pretty_print_insn (struct ui_out
*uiout
,
186 const struct disasm_insn
*insn
,
189 /* parts of the symbolic representation of the address */
194 struct cleanup
*ui_out_chain
;
195 char *filename
= NULL
;
198 struct ui_file
*stb
= stream ();
199 struct gdbarch
*gdbarch
= arch ();
201 ui_out_chain
= make_cleanup_ui_out_tuple_begin_end (uiout
, NULL
);
204 if (insn
->number
!= 0)
206 uiout
->field_fmt ("insn-number", "%u", insn
->number
);
210 if ((flags
& DISASSEMBLY_SPECULATIVE
) != 0)
212 if (insn
->is_speculative
)
214 uiout
->field_string ("is-speculative", "?");
216 /* The speculative execution indication overwrites the first
217 character of the PC prefix.
218 We assume a PC prefix length of 3 characters. */
219 if ((flags
& DISASSEMBLY_OMIT_PC
) == 0)
220 uiout
->text (pc_prefix (pc
) + 1);
224 else if ((flags
& DISASSEMBLY_OMIT_PC
) == 0)
225 uiout
->text (pc_prefix (pc
));
229 else if ((flags
& DISASSEMBLY_OMIT_PC
) == 0)
230 uiout
->text (pc_prefix (pc
));
231 uiout
->field_core_addr ("address", gdbarch
, pc
);
233 if (!build_address_symbolic (gdbarch
, pc
, 0, &name
, &offset
, &filename
,
236 /* We don't care now about line, filename and unmapped. But we might in
239 if ((flags
& DISASSEMBLY_OMIT_FNAME
) == 0)
240 uiout
->field_string ("func-name", name
);
242 uiout
->field_int ("offset", offset
);
243 uiout
->text (">:\t");
248 if (filename
!= NULL
)
253 ui_file_rewind (stb
);
254 if (flags
& DISASSEMBLY_RAW_INSN
)
259 const char *spacer
= "";
261 /* Build the opcodes using a temporary stream so we can
262 write them out in a single go for the MI. */
263 struct ui_file
*opcode_stream
= mem_fileopen ();
264 struct cleanup
*cleanups
=
265 make_cleanup_ui_file_delete (opcode_stream
);
267 size
= print_insn (pc
);
270 for (;pc
< end_pc
; ++pc
)
272 err
= m_di
.read_memory_func (pc
, &data
, 1, &m_di
);
274 m_di
.memory_error_func (err
, pc
, &m_di
);
275 fprintf_filtered (opcode_stream
, "%s%02x",
276 spacer
, (unsigned) data
);
280 uiout
->field_stream ("opcodes", opcode_stream
);
283 do_cleanups (cleanups
);
286 size
= print_insn (pc
);
288 uiout
->field_stream ("inst", stb
);
289 ui_file_rewind (stb
);
290 do_cleanups (ui_out_chain
);
297 dump_insns (struct ui_out
*uiout
, gdb_disassembler
*di
,
298 CORE_ADDR low
, CORE_ADDR high
,
299 int how_many
, int flags
,
302 struct disasm_insn insn
;
303 int num_displayed
= 0;
305 memset (&insn
, 0, sizeof (insn
));
308 while (insn
.addr
< high
&& (how_many
< 0 || num_displayed
< how_many
))
312 size
= di
->pretty_print_insn (uiout
, &insn
, flags
);
319 /* Allow user to bail out with ^C. */
326 return num_displayed
;
329 /* The idea here is to present a source-O-centric view of a
330 function to the user. This means that things are presented
331 in source order, with (possibly) out of order assembly
332 immediately following.
334 N.B. This view is deprecated. */
337 do_mixed_source_and_assembly_deprecated
338 (struct ui_out
*uiout
,
339 gdb_disassembler
*di
, struct symtab
*symtab
,
340 CORE_ADDR low
, CORE_ADDR high
,
341 int how_many
, int flags
)
345 struct linetable_entry
*le
;
346 struct deprecated_dis_line_entry
*mle
;
347 struct symtab_and_line sal
;
349 int out_of_order
= 0;
351 int num_displayed
= 0;
352 print_source_lines_flags psl_flags
= 0;
353 struct cleanup
*ui_out_chain
;
354 struct cleanup
*ui_out_tuple_chain
= make_cleanup (null_cleanup
, 0);
355 struct cleanup
*ui_out_list_chain
= make_cleanup (null_cleanup
, 0);
357 gdb_assert (symtab
!= NULL
&& SYMTAB_LINETABLE (symtab
) != NULL
);
359 nlines
= SYMTAB_LINETABLE (symtab
)->nitems
;
360 le
= SYMTAB_LINETABLE (symtab
)->item
;
362 if (flags
& DISASSEMBLY_FILENAME
)
363 psl_flags
|= PRINT_SOURCE_LINES_FILENAME
;
365 mle
= (struct deprecated_dis_line_entry
*)
366 alloca (nlines
* sizeof (struct deprecated_dis_line_entry
));
368 /* Copy linetable entries for this function into our data
369 structure, creating end_pc's and setting out_of_order as
372 /* First, skip all the preceding functions. */
374 for (i
= 0; i
< nlines
- 1 && le
[i
].pc
< low
; i
++);
376 /* Now, copy all entries before the end of this function. */
378 for (; i
< nlines
- 1 && le
[i
].pc
< high
; i
++)
380 if (le
[i
].line
== le
[i
+ 1].line
&& le
[i
].pc
== le
[i
+ 1].pc
)
381 continue; /* Ignore duplicates. */
383 /* Skip any end-of-function markers. */
387 mle
[newlines
].line
= le
[i
].line
;
388 if (le
[i
].line
> le
[i
+ 1].line
)
390 mle
[newlines
].start_pc
= le
[i
].pc
;
391 mle
[newlines
].end_pc
= le
[i
+ 1].pc
;
395 /* If we're on the last line, and it's part of the function,
396 then we need to get the end pc in a special way. */
398 if (i
== nlines
- 1 && le
[i
].pc
< high
)
400 mle
[newlines
].line
= le
[i
].line
;
401 mle
[newlines
].start_pc
= le
[i
].pc
;
402 sal
= find_pc_line (le
[i
].pc
, 0);
403 mle
[newlines
].end_pc
= sal
.end
;
407 /* Now, sort mle by line #s (and, then by addresses within lines). */
410 qsort (mle
, newlines
, sizeof (struct deprecated_dis_line_entry
),
413 /* Now, for each line entry, emit the specified lines (unless
414 they have been emitted before), followed by the assembly code
417 ui_out_chain
= make_cleanup_ui_out_list_begin_end (uiout
, "asm_insns");
419 for (i
= 0; i
< newlines
; i
++)
421 /* Print out everything from next_line to the current line. */
422 if (mle
[i
].line
>= next_line
)
426 /* Just one line to print. */
427 if (next_line
== mle
[i
].line
)
430 = make_cleanup_ui_out_tuple_begin_end (uiout
,
432 print_source_lines (symtab
, next_line
, mle
[i
].line
+ 1, psl_flags
);
436 /* Several source lines w/o asm instructions associated. */
437 for (; next_line
< mle
[i
].line
; next_line
++)
439 struct cleanup
*ui_out_list_chain_line
;
440 struct cleanup
*ui_out_tuple_chain_line
;
442 ui_out_tuple_chain_line
443 = make_cleanup_ui_out_tuple_begin_end (uiout
,
445 print_source_lines (symtab
, next_line
, next_line
+ 1,
447 ui_out_list_chain_line
448 = make_cleanup_ui_out_list_begin_end (uiout
,
450 do_cleanups (ui_out_list_chain_line
);
451 do_cleanups (ui_out_tuple_chain_line
);
453 /* Print the last line and leave list open for
454 asm instructions to be added. */
456 = make_cleanup_ui_out_tuple_begin_end (uiout
,
458 print_source_lines (symtab
, next_line
, mle
[i
].line
+ 1, psl_flags
);
464 = make_cleanup_ui_out_tuple_begin_end (uiout
,
466 print_source_lines (symtab
, mle
[i
].line
, mle
[i
].line
+ 1, psl_flags
);
469 next_line
= mle
[i
].line
+ 1;
471 = make_cleanup_ui_out_list_begin_end (uiout
, "line_asm_insn");
474 num_displayed
+= dump_insns (uiout
, di
,
475 mle
[i
].start_pc
, mle
[i
].end_pc
,
476 how_many
, flags
, NULL
);
478 /* When we've reached the end of the mle array, or we've seen the last
479 assembly range for this source line, close out the list/tuple. */
480 if (i
== (newlines
- 1) || mle
[i
+ 1].line
> mle
[i
].line
)
482 do_cleanups (ui_out_list_chain
);
483 do_cleanups (ui_out_tuple_chain
);
484 ui_out_tuple_chain
= make_cleanup (null_cleanup
, 0);
485 ui_out_list_chain
= make_cleanup (null_cleanup
, 0);
488 if (how_many
>= 0 && num_displayed
>= how_many
)
491 do_cleanups (ui_out_chain
);
494 /* The idea here is to present a source-O-centric view of a
495 function to the user. This means that things are presented
496 in source order, with (possibly) out of order assembly
497 immediately following. */
500 do_mixed_source_and_assembly (struct gdbarch
*gdbarch
,
501 struct ui_out
*uiout
,
502 gdb_disassembler
*di
,
503 struct symtab
*main_symtab
,
504 CORE_ADDR low
, CORE_ADDR high
,
505 int how_many
, int flags
)
507 const struct linetable_entry
*le
, *first_le
;
509 int num_displayed
= 0;
510 print_source_lines_flags psl_flags
= 0;
511 struct cleanup
*ui_out_chain
;
512 struct cleanup
*ui_out_tuple_chain
;
513 struct cleanup
*ui_out_list_chain
;
515 struct symtab
*last_symtab
;
518 gdb_assert (main_symtab
!= NULL
&& SYMTAB_LINETABLE (main_symtab
) != NULL
);
520 /* First pass: collect the list of all source files and lines.
521 We do this so that we can only print lines containing code once.
522 We try to print the source text leading up to the next instruction,
523 but if that text is for code that will be disassembled later, then
524 we'll want to defer printing it until later with its associated code. */
526 htab_up
dis_line_table (allocate_dis_line_table ());
530 /* The prologue may be empty, but there may still be a line number entry
531 for the opening brace which is distinct from the first line of code.
532 If the prologue has been eliminated find_pc_line may return the source
533 line after the opening brace. We still want to print this opening brace.
534 first_le is used to implement this. */
536 nlines
= SYMTAB_LINETABLE (main_symtab
)->nitems
;
537 le
= SYMTAB_LINETABLE (main_symtab
)->item
;
540 /* Skip all the preceding functions. */
541 for (i
= 0; i
< nlines
&& le
[i
].pc
< low
; i
++)
544 if (i
< nlines
&& le
[i
].pc
< high
)
547 /* Add lines for every pc value. */
550 struct symtab_and_line sal
;
553 sal
= find_pc_line (pc
, 0);
554 length
= gdb_insn_length (gdbarch
, pc
);
557 if (sal
.symtab
!= NULL
)
558 add_dis_line_entry (dis_line_table
.get (), sal
.symtab
, sal
.line
);
561 /* Second pass: print the disassembly.
563 Output format, from an MI perspective:
564 The result is a ui_out list, field name "asm_insns", where elements have
565 name "src_and_asm_line".
566 Each element is a tuple of source line specs (field names line, file,
567 fullname), and field "line_asm_insn" which contains the disassembly.
568 Field "line_asm_insn" is a list of tuples: address, func-name, offset,
571 CLI output works on top of this because MI ignores ui_out_text output,
572 which is where we put file name and source line contents output.
576 Handles the outer "asm_insns" list.
578 The tuples for each group of consecutive disassemblies.
580 List of consecutive source lines or disassembled insns. */
582 if (flags
& DISASSEMBLY_FILENAME
)
583 psl_flags
|= PRINT_SOURCE_LINES_FILENAME
;
585 ui_out_chain
= make_cleanup_ui_out_list_begin_end (uiout
, "asm_insns");
587 ui_out_tuple_chain
= NULL
;
588 ui_out_list_chain
= NULL
;
596 struct symtab_and_line sal
;
598 int start_preceding_line_to_display
= 0;
599 int end_preceding_line_to_display
= 0;
600 int new_source_line
= 0;
602 sal
= find_pc_line (pc
, 0);
604 if (sal
.symtab
!= last_symtab
)
606 /* New source file. */
609 /* If this is the first line of output, check for any preceding
613 && first_le
->line
< sal
.line
)
615 start_preceding_line_to_display
= first_le
->line
;
616 end_preceding_line_to_display
= sal
.line
;
621 /* Same source file as last time. */
622 if (sal
.symtab
!= NULL
)
624 if (sal
.line
> last_line
+ 1 && last_line
!= 0)
628 /* Several preceding source lines. Print the trailing ones
629 not associated with code that we'll print later. */
630 for (l
= sal
.line
- 1; l
> last_line
; --l
)
632 if (line_has_code_p (dis_line_table
.get (),
636 if (l
< sal
.line
- 1)
638 start_preceding_line_to_display
= l
+ 1;
639 end_preceding_line_to_display
= sal
.line
;
642 if (sal
.line
!= last_line
)
646 /* Same source line as last time. This can happen, depending
647 on the debug info. */
654 /* Skip the newline if this is the first instruction. */
657 if (ui_out_tuple_chain
!= NULL
)
659 gdb_assert (ui_out_list_chain
!= NULL
);
660 do_cleanups (ui_out_list_chain
);
661 do_cleanups (ui_out_tuple_chain
);
663 if (sal
.symtab
!= last_symtab
664 && !(flags
& DISASSEMBLY_FILENAME
))
666 /* Remember MI ignores ui_out_text.
667 We don't have to do anything here for MI because MI
668 output includes the source specs for each line. */
669 if (sal
.symtab
!= NULL
)
671 uiout
->text (symtab_to_filename_for_display (sal
.symtab
));
674 uiout
->text ("unknown");
677 if (start_preceding_line_to_display
> 0)
679 /* Several source lines w/o asm instructions associated.
680 We need to preserve the structure of the output, so output
681 a bunch of line tuples with no asm entries. */
683 struct cleanup
*ui_out_list_chain_line
;
684 struct cleanup
*ui_out_tuple_chain_line
;
686 gdb_assert (sal
.symtab
!= NULL
);
687 for (l
= start_preceding_line_to_display
;
688 l
< end_preceding_line_to_display
;
691 ui_out_tuple_chain_line
692 = make_cleanup_ui_out_tuple_begin_end (uiout
,
694 print_source_lines (sal
.symtab
, l
, l
+ 1, psl_flags
);
695 ui_out_list_chain_line
696 = make_cleanup_ui_out_list_begin_end (uiout
,
698 do_cleanups (ui_out_list_chain_line
);
699 do_cleanups (ui_out_tuple_chain_line
);
703 = make_cleanup_ui_out_tuple_begin_end (uiout
, "src_and_asm_line");
704 if (sal
.symtab
!= NULL
)
705 print_source_lines (sal
.symtab
, sal
.line
, sal
.line
+ 1, psl_flags
);
707 uiout
->text (_("--- no source info for this pc ---\n"));
709 = make_cleanup_ui_out_list_begin_end (uiout
, "line_asm_insn");
713 /* Here we're appending instructions to an existing line.
714 By construction the very first insn will have a symtab
715 and follow the new_source_line path above. */
716 gdb_assert (ui_out_tuple_chain
!= NULL
);
717 gdb_assert (ui_out_list_chain
!= NULL
);
721 end_pc
= std::min (sal
.end
, high
);
724 num_displayed
+= dump_insns (uiout
, di
, pc
, end_pc
,
725 how_many
, flags
, &end_pc
);
728 if (how_many
>= 0 && num_displayed
>= how_many
)
731 last_symtab
= sal
.symtab
;
732 last_line
= sal
.line
;
735 do_cleanups (ui_out_chain
);
739 do_assembly_only (struct ui_out
*uiout
,
740 gdb_disassembler
*di
,
741 CORE_ADDR low
, CORE_ADDR high
,
742 int how_many
, int flags
)
744 struct cleanup
*ui_out_chain
;
746 ui_out_chain
= make_cleanup_ui_out_list_begin_end (uiout
, "asm_insns");
748 dump_insns (uiout
, di
, low
, high
, how_many
, flags
, NULL
);
750 do_cleanups (ui_out_chain
);
753 /* Initialize the disassemble info struct ready for the specified
756 static int ATTRIBUTE_PRINTF (2, 3)
757 fprintf_disasm (void *stream
, const char *format
, ...)
761 va_start (args
, format
);
762 vfprintf_filtered ((struct ui_file
*) stream
, format
, args
);
764 /* Something non -ve. */
768 gdb_disassembler::gdb_disassembler (struct gdbarch
*gdbarch
,
769 struct ui_file
*file
,
770 di_read_memory_ftype read_memory_func
)
771 : m_gdbarch (gdbarch
),
774 init_disassemble_info (&m_di
, file
, fprintf_disasm
);
775 m_di
.flavour
= bfd_target_unknown_flavour
;
776 m_di
.memory_error_func
= dis_asm_memory_error
;
777 m_di
.print_address_func
= dis_asm_print_address
;
778 /* NOTE: cagney/2003-04-28: The original code, from the old Insight
779 disassembler had a local optomization here. By default it would
780 access the executable file, instead of the target memory (there
781 was a growing list of exceptions though). Unfortunately, the
782 heuristic was flawed. Commands like "disassemble &variable"
783 didn't work as they relied on the access going to the target.
784 Further, it has been supperseeded by trust-read-only-sections
785 (although that should be superseeded by target_trust..._p()). */
786 m_di
.read_memory_func
= read_memory_func
;
787 m_di
.arch
= gdbarch_bfd_arch_info (gdbarch
)->arch
;
788 m_di
.mach
= gdbarch_bfd_arch_info (gdbarch
)->mach
;
789 m_di
.endian
= gdbarch_byte_order (gdbarch
);
790 m_di
.endian_code
= gdbarch_byte_order_for_code (gdbarch
);
791 m_di
.application_data
= this;
792 disassemble_init_for_target (&m_di
);
796 gdb_disassembler::print_insn (CORE_ADDR memaddr
,
797 int *branch_delay_insns
)
801 int length
= gdbarch_print_insn (arch (), memaddr
, &m_di
);
804 memory_error (TARGET_XFER_E_IO
, m_err_memaddr
);
806 if (branch_delay_insns
!= NULL
)
808 if (m_di
.insn_info_valid
)
809 *branch_delay_insns
= m_di
.branch_delay_insns
;
811 *branch_delay_insns
= 0;
817 gdb_disassembly (struct gdbarch
*gdbarch
, struct ui_out
*uiout
,
818 int flags
, int how_many
,
819 CORE_ADDR low
, CORE_ADDR high
)
821 struct ui_file
*stb
= mem_fileopen ();
822 struct cleanup
*cleanups
= make_cleanup_ui_file_delete (stb
);
823 gdb_disassembler
di (gdbarch
, stb
);
824 struct symtab
*symtab
;
827 /* Assume symtab is valid for whole PC range. */
828 symtab
= find_pc_line_symtab (low
);
830 if (symtab
!= NULL
&& SYMTAB_LINETABLE (symtab
) != NULL
)
831 nlines
= SYMTAB_LINETABLE (symtab
)->nitems
;
833 if (!(flags
& (DISASSEMBLY_SOURCE_DEPRECATED
| DISASSEMBLY_SOURCE
))
835 do_assembly_only (uiout
, &di
, low
, high
, how_many
, flags
);
837 else if (flags
& DISASSEMBLY_SOURCE
)
838 do_mixed_source_and_assembly (gdbarch
, uiout
, &di
, symtab
, low
, high
,
841 else if (flags
& DISASSEMBLY_SOURCE_DEPRECATED
)
842 do_mixed_source_and_assembly_deprecated (uiout
, &di
, symtab
,
843 low
, high
, how_many
, flags
);
845 do_cleanups (cleanups
);
846 gdb_flush (gdb_stdout
);
849 /* Print the instruction at address MEMADDR in debugged memory,
850 on STREAM. Returns the length of the instruction, in bytes,
851 and, if requested, the number of branch delay slot instructions. */
854 gdb_print_insn (struct gdbarch
*gdbarch
, CORE_ADDR memaddr
,
855 struct ui_file
*stream
, int *branch_delay_insns
)
858 gdb_disassembler
di (gdbarch
, stream
);
860 return di
.print_insn (memaddr
, branch_delay_insns
);
863 /* Return the length in bytes of the instruction at address MEMADDR in
867 gdb_insn_length (struct gdbarch
*gdbarch
, CORE_ADDR addr
)
869 return gdb_print_insn (gdbarch
, addr
, null_stream (), NULL
);
872 /* fprintf-function for gdb_buffered_insn_length. This function is a
873 nop, we don't want to print anything, we just want to compute the
874 length of the insn. */
876 static int ATTRIBUTE_PRINTF (2, 3)
877 gdb_buffered_insn_length_fprintf (void *stream
, const char *format
, ...)
882 /* Initialize a struct disassemble_info for gdb_buffered_insn_length. */
885 gdb_buffered_insn_length_init_dis (struct gdbarch
*gdbarch
,
886 struct disassemble_info
*di
,
887 const gdb_byte
*insn
, int max_len
,
890 init_disassemble_info (di
, NULL
, gdb_buffered_insn_length_fprintf
);
892 /* init_disassemble_info installs buffer_read_memory, etc.
893 so we don't need to do that here.
894 The cast is necessary until disassemble_info is const-ified. */
895 di
->buffer
= (gdb_byte
*) insn
;
896 di
->buffer_length
= max_len
;
897 di
->buffer_vma
= addr
;
899 di
->arch
= gdbarch_bfd_arch_info (gdbarch
)->arch
;
900 di
->mach
= gdbarch_bfd_arch_info (gdbarch
)->mach
;
901 di
->endian
= gdbarch_byte_order (gdbarch
);
902 di
->endian_code
= gdbarch_byte_order_for_code (gdbarch
);
904 disassemble_init_for_target (di
);
907 /* Return the length in bytes of INSN. MAX_LEN is the size of the
908 buffer containing INSN. */
911 gdb_buffered_insn_length (struct gdbarch
*gdbarch
,
912 const gdb_byte
*insn
, int max_len
, CORE_ADDR addr
)
914 struct disassemble_info di
;
916 gdb_buffered_insn_length_init_dis (gdbarch
, &di
, insn
, max_len
, addr
);
918 return gdbarch_print_insn (gdbarch
, addr
, &di
);