30 #include "safe-ctype.h" 73 return htab_hash_pointer (dle->
symtab) + dle->
line;
93 return htab_create_alloc (41,
108 slot = htab_find_slot (table, &dle, INSERT);
127 return htab_find (table, &dle) != NULL;
135 struct disassemble_info *info)
144 struct disassemble_info *info)
156 struct disassemble_info *info)
175 if (mle1->
line == 0 || mle2->
line == 0)
195 gdb_disassembly_flags
flags)
202 char *filename = NULL;
250 uiout->
text (
">:\t");
255 if (filename != NULL)
266 const char *spacer =
"";
275 for (;pc < end_pc; ++pc)
301 int num_displayed = 0;
303 memset (&insn, 0,
sizeof (insn));
308 while (insn.
addr < high && (how_many < 0 || num_displayed < how_many))
326 return num_displayed;
341 int how_many, gdb_disassembly_flags
flags)
349 int out_of_order = 0;
351 int num_displayed = 0;
352 print_source_lines_flags psl_flags = 0;
371 for (i = 0; i < nlines - 1 && le[i].
pc < low; i++);
375 for (; i < nlines - 1 && le[i].
pc < high; i++)
377 if (le[i].
line == le[i + 1].
line && le[i].pc == le[i + 1].pc)
388 mle[newlines].
end_pc = le[i + 1].
pc;
395 if (i == nlines - 1 && le[i].pc < high)
419 for (i = 0; i < newlines; i++)
422 if (mle[i].
line >= next_line)
427 if (next_line == mle[i].
line)
429 outer_tuple_emitter.
emplace (uiout,
"src_and_asm_line");
435 for (; next_line < mle[i].
line; next_line++)
446 outer_tuple_emitter.
emplace (uiout,
"src_and_asm_line");
452 outer_tuple_emitter.
emplace (uiout,
"src_and_asm_line");
456 next_line = mle[i].
line + 1;
457 inner_list_emitter.
emplace (uiout,
"line_asm_insn");
462 how_many,
flags, NULL);
466 if (i == (newlines - 1) || mle[i + 1].
line > mle[i].
line)
468 inner_list_emitter.
reset ();
469 outer_tuple_emitter.
reset ();
472 if (how_many >= 0 && num_displayed >= how_many)
485 struct symtab *main_symtab,
487 int how_many, gdb_disassembly_flags
flags)
491 int num_displayed = 0;
492 print_source_lines_flags psl_flags = 0;
494 struct symtab *last_symtab;
520 for (i = 0; i <
nlines && le[i].
pc < low; i++)
523 if (i <
nlines && le[i].pc < high)
577 int start_preceding_line_to_display = 0;
578 int end_preceding_line_to_display = 0;
579 int new_source_line = 0;
583 if (sal.
symtab != last_symtab)
594 start_preceding_line_to_display = first_le->
line;
595 end_preceding_line_to_display = sal.
line;
603 if (sal.
line > last_line + 1 && last_line != 0)
609 for (l = sal.
line - 1; l > last_line; --l)
615 if (l < sal.
line - 1)
617 start_preceding_line_to_display = l + 1;
618 end_preceding_line_to_display = sal.
line;
621 if (sal.
line != last_line)
639 list_emitter.
reset ();
640 tuple_emitter.
reset ();
642 if (sal.
symtab != last_symtab
653 uiout->
text (
"unknown");
656 if (start_preceding_line_to_display > 0)
664 for (l = start_preceding_line_to_display;
665 l < end_preceding_line_to_display;
673 tuple_emitter.
emplace (uiout,
"src_and_asm_line");
677 uiout->
text (
_(
"--- no source info for this pc ---\n"));
678 list_emitter.
emplace (uiout,
"line_asm_insn");
690 end_pc = std::min (sal.
end, high);
694 how_many,
flags, &end_pc);
697 if (how_many >= 0 && num_displayed >= how_many)
701 last_line = sal.
line;
708 int how_many, gdb_disassembly_flags
flags)
719 fprintf_disasm (
void *stream, const
char *format, ...)
723 va_start (args, format);
736 init_disassemble_info (&
m_di, file, fprintf_disasm);
737 m_di.flavour = bfd_target_unknown_flavour;
748 m_di.read_memory_func = read_memory_func;
753 m_di.application_data =
this;
755 disassemble_init_for_target (&
m_di);
771 if (
m_di.insn_info_valid)
781 gdb_disassembly_flags
flags,
int how_many,
803 low, high, how_many,
flags);
836 gdb_buffered_insn_length_fprintf (
void *stream, const
char *format, ...)
845 struct disassemble_info *di,
849 init_disassemble_info (di, NULL, gdb_buffered_insn_length_fprintf);
855 di->buffer_length = max_len;
856 di->buffer_vma = addr;
864 disassemble_init_for_target (di);
874 struct disassemble_info di;
885 if (disassembler_options == NULL)
887 return *disassembler_options;
895 const disasm_options_t *valid_options;
912 if (valid_options == NULL)
915 'set disassembler-options ...' is not supported on this architecture.\n"));
920 FOR_EACH_DISASSEMBLER_OPTION (opt, options)
923 for (i = 0; valid_options->name[i] != NULL; i++)
924 if (disassembler_options_cmp (opt, valid_options->name[i]) == 0)
926 if (valid_options->name[i] == NULL)
929 _(
"Invalid disassembler option value: '%s'.\n"),
951 const disasm_options_t *valid_options;
962 if (valid_options == NULL)
966 The following disassembler options are supported for use with the\n\ 967 'set disassembler-options <option>[,<option>...]' command:\n"));
969 if (valid_options->description != NULL)
971 size_t i, max_len = 0;
974 for (i = 0; valid_options->name[i] != NULL; i++)
976 size_t len = strlen (valid_options->name[i]);
981 for (i = 0, max_len++; valid_options->name[i] != NULL; i++)
984 if (valid_options->description[i] != NULL)
986 (
int)(max_len - strlen (valid_options->name[i])),
' ',
987 valid_options->description[i]);
995 for (i = 0; valid_options->name[i] != NULL; i++)
998 if (valid_options->name[i + 1] != NULL)
1011 const char *text,
const char *word)
1019 const char *separator = strrchr (text,
',');
1020 if (separator != NULL)
1021 text = separator + 1;
1038 Set the disassembler options.\n\ 1039 Usage: set disassembler-options <option>[,<option>...]\n\n\ 1040 See: 'show disassembler-options' for valid option values.\n"),
_(
"\ 1041 Show the disassembler options."), NULL,
mach_port_t mach_port_t name mach_port_t mach_port_t name kern_return_t err
static void dis_asm_memory_error(int err, bfd_vma memaddr, struct disassemble_info *info)
const char * symtab_to_filename_for_display(struct symtab *symtab)
void field_core_addr(const char *fldname, struct gdbarch *gdbarch, CORE_ADDR address)
void field_string(const char *fldname, const char *string)
static int dis_asm_read_memory(bfd_vma memaddr, gdb_byte *myaddr, unsigned int len, struct disassemble_info *info)
void print_address(struct gdbarch *, CORE_ADDR, struct ui_file *)
static int branch_delay_insns
int gdb_insn_length(struct gdbarch *gdbarch, CORE_ADDR addr)
int print_insn(CORE_ADDR memaddr, int *branch_delay_insns=NULL)
void complete_on_enum(completion_tracker &tracker, const char *const *enumlist, const char *text, const char *word)
void * memset(T *s, int c, size_t n)=delete
static void do_assembly_only(struct gdbarch *gdbarch, struct ui_out *uiout, CORE_ADDR low, CORE_ADDR high, int how_many, gdb_disassembly_flags flags)
char * skip_spaces(char *chp)
static int ATTRIBUTE_PRINTF(2, 3)
const char * pc_prefix(CORE_ADDR)
void text(const char *string)
static int dump_insns(struct gdbarch *gdbarch, struct ui_out *uiout, CORE_ADDR low, CORE_ADDR high, int how_many, gdb_disassembly_flags flags, CORE_ADDR *end_pc)
int target_read_code(CORE_ADDR memaddr, gdb_byte *myaddr, ssize_t len)
mach_port_t kern_return_t mach_port_t msgports mach_port_t kern_return_t pid_t pid mach_port_t kern_return_t mach_port_t task mach_port_t kern_return_t int flags
void _initialize_disasm(void)
void memory_error(enum target_xfer_status err, CORE_ADDR memaddr)
struct cmd_list_element * setlist
static void do_mixed_source_and_assembly(struct gdbarch *gdbarch, struct ui_out *uiout, struct symtab *main_symtab, CORE_ADDR low, CORE_ADDR high, int how_many, gdb_disassembly_flags flags)
static int compare_lines(const void *mle1p, const void *mle2p)
struct symtab_and_line find_pc_line(CORE_ADDR pc, int notcurrent)
void fprintf_filtered(struct ui_file *stream, const char *format,...)
static void show_disassembler_options_sfunc(struct ui_file *file, int from_tty, struct cmd_list_element *c, const char *value)
void set_cmd_completer(struct cmd_list_element *cmd, completer_ftype *completer)
std::unique_ptr< htab, htab_deleter > htab_up
void vfprintf_filtered(struct ui_file *stream, const char *format, va_list args)
static htab_t allocate_dis_line_table(void)
int pretty_print_insn(struct ui_out *uiout, const struct disasm_insn *insn, gdb_disassembly_flags flags)
decltype(disassemble_info::read_memory_func) di_read_memory_ftype
int gdb_print_insn(struct gdbarch *gdbarch, CORE_ADDR memaddr, struct ui_file *stream, int *branch_delay_insns)
struct cmd_list_element * showlist
char * get_disassembler_options(struct gdbarch *gdbarch)
struct cmd_list_element * add_setshow_string_noescape_cmd(const char *name, enum command_class theclass, char **var, const char *set_doc, const char *show_doc, const char *help_doc, cmd_const_sfunc_ftype *set_func, show_value_ftype *show_func, struct cmd_list_element **set_list, struct cmd_list_element **show_list)
enum bfd_endian gdbarch_byte_order(struct gdbarch *gdbarch)
char ** disassembler_options
void read_code(CORE_ADDR memaddr, gdb_byte *myaddr, ssize_t len)
struct gdbarch * get_current_arch(void)
void field_stream(const char *fldname, string_file &stream)
static void add_dis_line_entry(htab_t table, struct symtab *symtab, int line)
static void disassembler_options_completer(struct cmd_list_element *ignore, completion_tracker &tracker, const char *text, const char *word)
void wrap_here(const char *indent)
int build_address_symbolic(struct gdbarch *, CORE_ADDR addr, int do_demangle, char **name, int *offset, char **filename, int *line, int *unmapped)
void printf(const char *,...) ATTRIBUTE_PRINTF(2
T & emplace(Args &&... args)
void gdb_disassembly(struct gdbarch *gdbarch, struct ui_out *uiout, gdb_disassembly_flags flags, int how_many, CORE_ADDR low, CORE_ADDR high)
void field_int(const char *fldname, int value)
struct disassemble_info m_di
static void gdb_buffered_insn_length_init_dis(struct gdbarch *gdbarch, struct disassemble_info *di, const gdb_byte *insn, int max_len, CORE_ADDR addr)
static int eq_dis_line_entry(const void *item_lhs, const void *item_rhs)
void print_source_lines(struct symtab *s, int line, int stopline, print_source_lines_flags flags)
const disasm_options_t * gdbarch_valid_disassembler_options(struct gdbarch *gdbarch)
static int line_has_code_p(htab_t table, struct symtab *symtab, int line)
static int ignore(struct target_ops *ops, struct gdbarch *gdbarch, struct bp_target_info *bp_tgt)
unsigned int is_speculative
gdb_disassembler(struct gdbarch *gdbarch, struct ui_file *file)
static void set_disassembler_options_sfunc(const char *args, int from_tty, struct cmd_list_element *c)
const struct bfd_arch_info * gdbarch_bfd_arch_info(struct gdbarch *gdbarch)
constexpr bool has_value() const noexcept
char ** gdbarch_disassembler_options(struct gdbarch *gdbarch)
void gdb_flush(struct ui_file *file)
static char * prospective_options
struct symtab * find_pc_line_symtab(CORE_ADDR pc)
static hashval_t hash_dis_line_entry(const void *item)
PTR xcalloc(size_t number, size_t size)
static void dis_asm_print_address(bfd_vma addr, struct disassemble_info *info)
int gdbarch_print_insn(struct gdbarch *gdbarch, bfd_vma vma, struct disassemble_info *info)
enum bfd_endian gdbarch_byte_order_for_code(struct gdbarch *gdbarch)
#define SYMTAB_LINETABLE(symtab)
void set_disassembler_options(char *prospective_options)
static void do_mixed_source_and_assembly_deprecated(struct gdbarch *gdbarch, struct ui_out *uiout, struct symtab *symtab, CORE_ADDR low, CORE_ADDR high, int how_many, gdb_disassembly_flags flags)
int gdb_buffered_insn_length(struct gdbarch *gdbarch, const gdb_byte *insn, int max_len, CORE_ADDR addr)
void field_fmt(const char *fldname, const char *format,...) ATTRIBUTE_PRINTF(3