1 /* Disassemble support for GDB.
3 Copyright (C) 2000-2016 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/>. */
29 /* Disassemble functions.
30 FIXME: We should get rid of all the duplicate code in gdb that does
31 the same thing: disassemble_command() and the gdbtk variation. */
33 /* This structure is used to store line number information for the
35 We need a different sort of line table from the normal one cuz we can't
36 depend upon implicit line-end pc's for lines to do the
37 reordering in this function. */
39 struct deprecated_dis_line_entry
46 /* This Structure is used to store line number information.
47 We need a different sort of line table from the normal one cuz we can't
48 depend upon implicit line-end pc's for lines to do the
49 reordering in this function. */
53 struct symtab *symtab;
57 /* Hash function for dis_line_entry. */
60 hash_dis_line_entry (const void *item)
62 const struct dis_line_entry *dle = (const struct dis_line_entry *) item;
64 return htab_hash_pointer (dle->symtab) + dle->line;
67 /* Equal function for dis_line_entry. */
70 eq_dis_line_entry (const void *item_lhs, const void *item_rhs)
72 const struct dis_line_entry *lhs = (const struct dis_line_entry *) item_lhs;
73 const struct dis_line_entry *rhs = (const struct dis_line_entry *) item_rhs;
75 return (lhs->symtab == rhs->symtab
76 && lhs->line == rhs->line);
79 /* Create the table to manage lines for mixed source/disassembly. */
82 allocate_dis_line_table (void)
84 return htab_create_alloc (41,
85 hash_dis_line_entry, eq_dis_line_entry,
86 xfree, xcalloc, xfree);
90 Returns 1 if added, 0 if already present. */
93 maybe_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 /* Like target_read_memory, but slightly different parameters. */
124 dis_asm_read_memory (bfd_vma memaddr, gdb_byte *myaddr, unsigned int len,
125 struct disassemble_info *info)
127 return target_read_code (memaddr, myaddr, len);
130 /* Like memory_error with slightly different parameters. */
132 dis_asm_memory_error (int err, bfd_vma memaddr,
133 struct disassemble_info *info)
135 memory_error (TARGET_XFER_E_IO, memaddr);
138 /* Like print_address with slightly different parameters. */
140 dis_asm_print_address (bfd_vma addr, struct disassemble_info *info)
142 struct gdbarch *gdbarch = (struct gdbarch *) info->application_data;
144 print_address (gdbarch, addr, (struct ui_file *) info->stream);
148 compare_lines (const void *mle1p, const void *mle2p)
150 struct deprecated_dis_line_entry *mle1, *mle2;
153 mle1 = (struct deprecated_dis_line_entry *) mle1p;
154 mle2 = (struct deprecated_dis_line_entry *) mle2p;
156 /* End of sequence markers have a line number of 0 but don't want to
157 be sorted to the head of the list, instead sort by PC. */
158 if (mle1->line == 0 || mle2->line == 0)
160 val = mle1->start_pc - mle2->start_pc;
162 val = mle1->line - mle2->line;
166 val = mle1->line - mle2->line;
168 val = mle1->start_pc - mle2->start_pc;
176 gdb_pretty_print_insn (struct gdbarch *gdbarch, struct ui_out *uiout,
177 struct disassemble_info * di,
178 const struct disasm_insn *insn, int flags,
181 /* parts of the symbolic representation of the address */
186 struct cleanup *ui_out_chain;
187 char *filename = NULL;
191 ui_out_chain = make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
194 if (insn->number != 0)
196 ui_out_field_fmt (uiout, "insn-number", "%u", insn->number);
197 ui_out_text (uiout, "\t");
200 if ((flags & DISASSEMBLY_SPECULATIVE) != 0)
202 if (insn->is_speculative)
204 ui_out_field_string (uiout, "is-speculative", "?");
206 /* The speculative execution indication overwrites the first
207 character of the PC prefix.
208 We assume a PC prefix length of 3 characters. */
209 if ((flags & DISASSEMBLY_OMIT_PC) == 0)
210 ui_out_text (uiout, pc_prefix (pc) + 1);
212 ui_out_text (uiout, " ");
214 else if ((flags & DISASSEMBLY_OMIT_PC) == 0)
215 ui_out_text (uiout, pc_prefix (pc));
217 ui_out_text (uiout, " ");
219 else if ((flags & DISASSEMBLY_OMIT_PC) == 0)
220 ui_out_text (uiout, pc_prefix (pc));
221 ui_out_field_core_addr (uiout, "address", gdbarch, pc);
223 if (!build_address_symbolic (gdbarch, pc, 0, &name, &offset, &filename,
226 /* We don't care now about line, filename and unmapped. But we might in
228 ui_out_text (uiout, " <");
229 if ((flags & DISASSEMBLY_OMIT_FNAME) == 0)
230 ui_out_field_string (uiout, "func-name", name);
231 ui_out_text (uiout, "+");
232 ui_out_field_int (uiout, "offset", offset);
233 ui_out_text (uiout, ">:\t");
236 ui_out_text (uiout, ":\t");
238 if (filename != NULL)
243 ui_file_rewind (stb);
244 if (flags & DISASSEMBLY_RAW_INSN)
249 const char *spacer = "";
251 /* Build the opcodes using a temporary stream so we can
252 write them out in a single go for the MI. */
253 struct ui_file *opcode_stream = mem_fileopen ();
254 struct cleanup *cleanups =
255 make_cleanup_ui_file_delete (opcode_stream);
257 size = gdbarch_print_insn (gdbarch, pc, di);
260 for (;pc < end_pc; ++pc)
262 err = (*di->read_memory_func) (pc, &data, 1, di);
264 (*di->memory_error_func) (err, pc, di);
265 fprintf_filtered (opcode_stream, "%s%02x",
266 spacer, (unsigned) data);
270 ui_out_field_stream (uiout, "opcodes", opcode_stream);
271 ui_out_text (uiout, "\t");
273 do_cleanups (cleanups);
276 size = gdbarch_print_insn (gdbarch, pc, di);
278 ui_out_field_stream (uiout, "inst", stb);
279 ui_file_rewind (stb);
280 do_cleanups (ui_out_chain);
281 ui_out_text (uiout, "\n");
287 dump_insns (struct gdbarch *gdbarch, struct ui_out *uiout,
288 struct disassemble_info * di,
289 CORE_ADDR low, CORE_ADDR high,
290 int how_many, int flags, struct ui_file *stb,
293 struct disasm_insn insn;
294 int num_displayed = 0;
296 memset (&insn, 0, sizeof (insn));
299 while (insn.addr < high && (how_many < 0 || num_displayed < how_many))
303 size = gdb_pretty_print_insn (gdbarch, uiout, di, &insn, flags, stb);
310 /* Allow user to bail out with ^C. */
317 return num_displayed;
320 /* The idea here is to present a source-O-centric view of a
321 function to the user. This means that things are presented
322 in source order, with (possibly) out of order assembly
323 immediately following.
325 N.B. This view is deprecated. */
328 do_mixed_source_and_assembly_deprecated
329 (struct gdbarch *gdbarch, struct ui_out *uiout,
330 struct disassemble_info *di, struct symtab *symtab,
331 CORE_ADDR low, CORE_ADDR high,
332 int how_many, int flags, struct ui_file *stb)
336 struct linetable_entry *le;
337 struct deprecated_dis_line_entry *mle;
338 struct symtab_and_line sal;
340 int out_of_order = 0;
342 int num_displayed = 0;
343 print_source_lines_flags psl_flags = 0;
344 struct cleanup *ui_out_chain;
345 struct cleanup *ui_out_tuple_chain = make_cleanup (null_cleanup, 0);
346 struct cleanup *ui_out_list_chain = make_cleanup (null_cleanup, 0);
348 gdb_assert (symtab != NULL && SYMTAB_LINETABLE (symtab) != NULL);
350 nlines = SYMTAB_LINETABLE (symtab)->nitems;
351 le = SYMTAB_LINETABLE (symtab)->item;
353 if (flags & DISASSEMBLY_FILENAME)
354 psl_flags |= PRINT_SOURCE_LINES_FILENAME;
356 mle = (struct deprecated_dis_line_entry *)
357 alloca (nlines * sizeof (struct deprecated_dis_line_entry));
359 /* Copy linetable entries for this function into our data
360 structure, creating end_pc's and setting out_of_order as
363 /* First, skip all the preceding functions. */
365 for (i = 0; i < nlines - 1 && le[i].pc < low; i++);
367 /* Now, copy all entries before the end of this function. */
369 for (; i < nlines - 1 && le[i].pc < high; i++)
371 if (le[i].line == le[i + 1].line && le[i].pc == le[i + 1].pc)
372 continue; /* Ignore duplicates. */
374 /* Skip any end-of-function markers. */
378 mle[newlines].line = le[i].line;
379 if (le[i].line > le[i + 1].line)
381 mle[newlines].start_pc = le[i].pc;
382 mle[newlines].end_pc = le[i + 1].pc;
386 /* If we're on the last line, and it's part of the function,
387 then we need to get the end pc in a special way. */
389 if (i == nlines - 1 && le[i].pc < high)
391 mle[newlines].line = le[i].line;
392 mle[newlines].start_pc = le[i].pc;
393 sal = find_pc_line (le[i].pc, 0);
394 mle[newlines].end_pc = sal.end;
398 /* Now, sort mle by line #s (and, then by addresses within lines). */
401 qsort (mle, newlines, sizeof (struct deprecated_dis_line_entry),
404 /* Now, for each line entry, emit the specified lines (unless
405 they have been emitted before), followed by the assembly code
408 ui_out_chain = make_cleanup_ui_out_list_begin_end (uiout, "asm_insns");
410 for (i = 0; i < newlines; i++)
412 /* Print out everything from next_line to the current line. */
413 if (mle[i].line >= next_line)
417 /* Just one line to print. */
418 if (next_line == mle[i].line)
421 = make_cleanup_ui_out_tuple_begin_end (uiout,
423 print_source_lines (symtab, next_line, mle[i].line + 1, psl_flags);
427 /* Several source lines w/o asm instructions associated. */
428 for (; next_line < mle[i].line; next_line++)
430 struct cleanup *ui_out_list_chain_line;
431 struct cleanup *ui_out_tuple_chain_line;
433 ui_out_tuple_chain_line
434 = make_cleanup_ui_out_tuple_begin_end (uiout,
436 print_source_lines (symtab, next_line, next_line + 1,
438 ui_out_list_chain_line
439 = make_cleanup_ui_out_list_begin_end (uiout,
441 do_cleanups (ui_out_list_chain_line);
442 do_cleanups (ui_out_tuple_chain_line);
444 /* Print the last line and leave list open for
445 asm instructions to be added. */
447 = make_cleanup_ui_out_tuple_begin_end (uiout,
449 print_source_lines (symtab, next_line, mle[i].line + 1, psl_flags);
455 = make_cleanup_ui_out_tuple_begin_end (uiout,
457 print_source_lines (symtab, mle[i].line, mle[i].line + 1, psl_flags);
460 next_line = mle[i].line + 1;
462 = make_cleanup_ui_out_list_begin_end (uiout, "line_asm_insn");
465 num_displayed += dump_insns (gdbarch, uiout, di,
466 mle[i].start_pc, mle[i].end_pc,
467 how_many, flags, stb, NULL);
469 /* When we've reached the end of the mle array, or we've seen the last
470 assembly range for this source line, close out the list/tuple. */
471 if (i == (newlines - 1) || mle[i + 1].line > mle[i].line)
473 do_cleanups (ui_out_list_chain);
474 do_cleanups (ui_out_tuple_chain);
475 ui_out_tuple_chain = make_cleanup (null_cleanup, 0);
476 ui_out_list_chain = make_cleanup (null_cleanup, 0);
477 ui_out_text (uiout, "\n");
479 if (how_many >= 0 && num_displayed >= how_many)
482 do_cleanups (ui_out_chain);
485 /* The idea here is to present a source-O-centric view of a
486 function to the user. This means that things are presented
487 in source order, with (possibly) out of order assembly
488 immediately following. */
491 do_mixed_source_and_assembly (struct gdbarch *gdbarch, struct ui_out *uiout,
492 struct disassemble_info *di,
493 struct symtab *main_symtab,
494 CORE_ADDR low, CORE_ADDR high,
495 int how_many, int flags, struct ui_file *stb)
498 const struct linetable_entry *le, *first_le;
499 struct symtab_and_line sal;
501 int out_of_order = 0;
503 int num_displayed = 0;
504 print_source_lines_flags psl_flags = 0;
505 struct cleanup *cleanups;
506 struct cleanup *ui_out_chain;
507 struct cleanup *ui_out_tuple_chain;
508 struct cleanup *ui_out_list_chain;
510 struct symtab *last_symtab;
512 htab_t dis_line_table;
514 gdb_assert (main_symtab != NULL && SYMTAB_LINETABLE (main_symtab) != NULL);
516 /* First pass: collect the list of all source files and lines.
517 We do this so that we can only print lines containing code once.
518 We try to print the source text leading up to the next instruction,
519 but if that text is for code that will be disassembled later, then
520 we'll want to defer printing it until later with its associated code. */
522 dis_line_table = allocate_dis_line_table ();
523 cleanups = make_cleanup_htab_delete (dis_line_table);
527 /* The prologue may be empty, but there may still be a line number entry
528 for the opening brace which is distinct from the first line of code.
529 If the prologue has been eliminated find_pc_line may return the source
530 line after the opening brace. We still want to print this opening brace.
531 first_le is used to implement this. */
533 nlines = SYMTAB_LINETABLE (main_symtab)->nitems;
534 le = SYMTAB_LINETABLE (main_symtab)->item;
537 /* Skip all the preceding functions. */
538 for (i = 0; i < nlines && le[i].pc < low; i++)
541 if (i < nlines && le[i].pc < high)
544 /* Add lines for every pc value. */
547 struct symtab_and_line sal;
550 sal = find_pc_line (pc, 0);
551 length = gdb_insn_length (gdbarch, pc);
554 if (sal.symtab != NULL)
555 maybe_add_dis_line_entry (dis_line_table, sal.symtab, sal.line);
558 /* Second pass: print the disassembly.
560 Output format, from an MI perspective:
561 The result is a ui_out list, field name "asm_insns", where elements have
562 name "src_and_asm_line".
563 Each element is a tuple of source line specs (field names line, file,
564 fullname), and field "line_asm_insn" which contains the disassembly.
565 Field "line_asm_insn" is a list of tuples: address, func-name, offset,
568 CLI output works on top of this because MI ignores ui_out_text output,
569 which is where we put file name and source line contents output.
573 For things created at the beginning of this function and need to be
574 kept until the end of this function.
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 linetable_entry *le = NULL;
597 struct symtab_and_line sal;
599 int start_preceding_line_to_display = 0;
600 int end_preceding_line_to_display = 0;
601 int new_source_line = 0;
603 sal = find_pc_line (pc, 0);
605 if (sal.symtab != last_symtab)
607 /* New source file. */
610 /* If this is the first line of output, check for any preceding
614 && first_le->line < sal.line)
616 start_preceding_line_to_display = first_le->line;
617 end_preceding_line_to_display = sal.line;
622 /* Same source file as last time. */
623 if (sal.symtab != NULL)
625 if (sal.line > last_line + 1 && last_line != 0)
629 /* Several preceding source lines. Print the trailing ones
630 not associated with code that we'll print later. */
631 for (l = sal.line - 1; l > last_line; --l)
633 if (line_has_code_p (dis_line_table, sal.symtab, l))
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. */
656 ui_out_text (uiout, "\n");
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)
672 symtab_to_filename_for_display (sal.symtab));
675 ui_out_text (uiout, "unknown");
676 ui_out_text (uiout, ":\n");
678 if (start_preceding_line_to_display > 0)
680 /* Several source lines w/o asm instructions associated.
681 We need to preserve the structure of the output, so output
682 a bunch of line tuples with no asm entries. */
684 struct cleanup *ui_out_list_chain_line;
685 struct cleanup *ui_out_tuple_chain_line;
687 gdb_assert (sal.symtab != NULL);
688 for (l = start_preceding_line_to_display;
689 l < end_preceding_line_to_display;
692 ui_out_tuple_chain_line
693 = make_cleanup_ui_out_tuple_begin_end (uiout,
695 print_source_lines (sal.symtab, l, l + 1, psl_flags);
696 ui_out_list_chain_line
697 = make_cleanup_ui_out_list_begin_end (uiout,
699 do_cleanups (ui_out_list_chain_line);
700 do_cleanups (ui_out_tuple_chain_line);
704 = make_cleanup_ui_out_tuple_begin_end (uiout, "src_and_asm_line");
705 if (sal.symtab != NULL)
706 print_source_lines (sal.symtab, sal.line, sal.line + 1, psl_flags);
708 ui_out_text (uiout, _("--- no source info for this pc ---\n"));
710 = make_cleanup_ui_out_list_begin_end (uiout, "line_asm_insn");
714 /* Here we're appending instructions to an existing line.
715 By construction the very first insn will have a symtab
716 and follow the new_source_line path above. */
717 gdb_assert (ui_out_tuple_chain != NULL);
718 gdb_assert (ui_out_list_chain != NULL);
722 end_pc = min (sal.end, high);
725 num_displayed += dump_insns (gdbarch, uiout, di, pc, end_pc,
726 how_many, flags, stb, &end_pc);
729 if (how_many >= 0 && num_displayed >= how_many)
732 last_symtab = sal.symtab;
733 last_line = sal.line;
736 do_cleanups (ui_out_chain);
737 do_cleanups (cleanups);
741 do_assembly_only (struct gdbarch *gdbarch, struct ui_out *uiout,
742 struct disassemble_info * di,
743 CORE_ADDR low, CORE_ADDR high,
744 int how_many, int flags, struct ui_file *stb)
746 int num_displayed = 0;
747 struct cleanup *ui_out_chain;
749 ui_out_chain = make_cleanup_ui_out_list_begin_end (uiout, "asm_insns");
751 num_displayed = dump_insns (gdbarch, uiout, di, low, high, how_many,
754 do_cleanups (ui_out_chain);
757 /* Initialize the disassemble info struct ready for the specified
760 static int ATTRIBUTE_PRINTF (2, 3)
761 fprintf_disasm (void *stream, const char *format, ...)
765 va_start (args, format);
766 vfprintf_filtered ((struct ui_file *) stream, format, args);
768 /* Something non -ve. */
772 struct disassemble_info
773 gdb_disassemble_info (struct gdbarch *gdbarch, struct ui_file *file)
775 struct disassemble_info di;
777 init_disassemble_info (&di, file, fprintf_disasm);
778 di.flavour = bfd_target_unknown_flavour;
779 di.memory_error_func = dis_asm_memory_error;
780 di.print_address_func = dis_asm_print_address;
781 /* NOTE: cagney/2003-04-28: The original code, from the old Insight
782 disassembler had a local optomization here. By default it would
783 access the executable file, instead of the target memory (there
784 was a growing list of exceptions though). Unfortunately, the
785 heuristic was flawed. Commands like "disassemble &variable"
786 didn't work as they relied on the access going to the target.
787 Further, it has been supperseeded by trust-read-only-sections
788 (although that should be superseeded by target_trust..._p()). */
789 di.read_memory_func = dis_asm_read_memory;
790 di.arch = gdbarch_bfd_arch_info (gdbarch)->arch;
791 di.mach = gdbarch_bfd_arch_info (gdbarch)->mach;
792 di.endian = gdbarch_byte_order (gdbarch);
793 di.endian_code = gdbarch_byte_order_for_code (gdbarch);
794 di.application_data = gdbarch;
795 disassemble_init_for_target (&di);
800 gdb_disassembly (struct gdbarch *gdbarch, struct ui_out *uiout,
801 char *file_string, int flags, int how_many,
802 CORE_ADDR low, CORE_ADDR high)
804 struct ui_file *stb = mem_fileopen ();
805 struct cleanup *cleanups = make_cleanup_ui_file_delete (stb);
806 struct disassemble_info di = gdb_disassemble_info (gdbarch, stb);
807 struct symtab *symtab;
808 struct linetable_entry *le = NULL;
811 /* Assume symtab is valid for whole PC range. */
812 symtab = find_pc_line_symtab (low);
814 if (symtab != NULL && SYMTAB_LINETABLE (symtab) != NULL)
815 nlines = SYMTAB_LINETABLE (symtab)->nitems;
817 if (!(flags & (DISASSEMBLY_SOURCE_DEPRECATED | DISASSEMBLY_SOURCE))
819 do_assembly_only (gdbarch, uiout, &di, low, high, how_many, flags, stb);
821 else if (flags & DISASSEMBLY_SOURCE)
822 do_mixed_source_and_assembly (gdbarch, uiout, &di, symtab, low, high,
823 how_many, flags, stb);
825 else if (flags & DISASSEMBLY_SOURCE_DEPRECATED)
826 do_mixed_source_and_assembly_deprecated (gdbarch, uiout, &di, symtab,
827 low, high, how_many, flags, stb);
829 do_cleanups (cleanups);
830 gdb_flush (gdb_stdout);
833 /* Print the instruction at address MEMADDR in debugged memory,
834 on STREAM. Returns the length of the instruction, in bytes,
835 and, if requested, the number of branch delay slot instructions. */
838 gdb_print_insn (struct gdbarch *gdbarch, CORE_ADDR memaddr,
839 struct ui_file *stream, int *branch_delay_insns)
841 struct disassemble_info di;
844 di = gdb_disassemble_info (gdbarch, stream);
845 length = gdbarch_print_insn (gdbarch, memaddr, &di);
846 if (branch_delay_insns)
848 if (di.insn_info_valid)
849 *branch_delay_insns = di.branch_delay_insns;
851 *branch_delay_insns = 0;
857 do_ui_file_delete (void *arg)
859 ui_file_delete ((struct ui_file *) arg);
862 /* Return the length in bytes of the instruction at address MEMADDR in
866 gdb_insn_length (struct gdbarch *gdbarch, CORE_ADDR addr)
868 static struct ui_file *null_stream = NULL;
870 /* Dummy file descriptor for the disassembler. */
873 null_stream = ui_file_new ();
874 make_final_cleanup (do_ui_file_delete, null_stream);
877 return gdb_print_insn (gdbarch, addr, null_stream, NULL);
880 /* fprintf-function for gdb_buffered_insn_length. This function is a
881 nop, we don't want to print anything, we just want to compute the
882 length of the insn. */
884 static int ATTRIBUTE_PRINTF (2, 3)
885 gdb_buffered_insn_length_fprintf (void *stream, const char *format, ...)
890 /* Initialize a struct disassemble_info for gdb_buffered_insn_length. */
893 gdb_buffered_insn_length_init_dis (struct gdbarch *gdbarch,
894 struct disassemble_info *di,
895 const gdb_byte *insn, int max_len,
898 init_disassemble_info (di, NULL, gdb_buffered_insn_length_fprintf);
900 /* init_disassemble_info installs buffer_read_memory, etc.
901 so we don't need to do that here.
902 The cast is necessary until disassemble_info is const-ified. */
903 di->buffer = (gdb_byte *) insn;
904 di->buffer_length = max_len;
905 di->buffer_vma = addr;
907 di->arch = gdbarch_bfd_arch_info (gdbarch)->arch;
908 di->mach = gdbarch_bfd_arch_info (gdbarch)->mach;
909 di->endian = gdbarch_byte_order (gdbarch);
910 di->endian_code = gdbarch_byte_order_for_code (gdbarch);
912 disassemble_init_for_target (di);
915 /* Return the length in bytes of INSN. MAX_LEN is the size of the
916 buffer containing INSN. */
919 gdb_buffered_insn_length (struct gdbarch *gdbarch,
920 const gdb_byte *insn, int max_len, CORE_ADDR addr)
922 struct disassemble_info di;
924 gdb_buffered_insn_length_init_dis (gdbarch, &di, insn, max_len, addr);
926 return gdbarch_print_insn (gdbarch, addr, &di);