diff options
author | Tom Tromey <tom@tromey.com> | 2019-11-12 18:20:32 -0700 |
---|---|---|
committer | Tom Tromey <tom@tromey.com> | 2019-12-20 09:15:54 -0700 |
commit | 52469d7673d716a4811c8ccec8cc8ef605992b31 (patch) | |
tree | 584e7f9fe47088989ab3ff1145e1206ae1268856 | |
parent | 5d49bf1b698124fe21017105f84b18e29221b262 (diff) | |
download | gdb-52469d7673d716a4811c8ccec8cc8ef605992b31.zip gdb-52469d7673d716a4811c8ccec8cc8ef605992b31.tar.gz gdb-52469d7673d716a4811c8ccec8cc8ef605992b31.tar.bz2 |
Reimplement tui_get_begin_asm_address
tui_get_begin_asm_address looks for the inferior's "main" to display
it. I think this is incorrect in two ways.
First, it should probably instead use the user's most recent source
context, if one has been set.
Second, it uses a hard-coded list of "main" names, but gdb already has
a better approach to handling this.
This patch fixes both of these problems.
gdb/ChangeLog
2019-12-20 Tom Tromey <tom@tromey.com>
* tui/tui-disasm.c (tui_get_begin_asm_address): Use
get_current_source_symtab_and_line, and main_name.
Change-Id: I77dc13d49148e8dec5aa3eeb357ce3968a68d0bd
-rw-r--r-- | gdb/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/tui/tui-disasm.c | 31 |
2 files changed, 22 insertions, 14 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index f5d667e..e471536 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,10 @@ 2019-12-20 Tom Tromey <tom@tromey.com> + * tui/tui-disasm.c (tui_get_begin_asm_address): Use + get_current_source_symtab_and_line, and main_name. + +2019-12-20 Tom Tromey <tom@tromey.com> + * tui/tui.c (tui_show_source): Update. * tui/tui-winsource.h (tui_update_source_windows_with_line): Update. * tui/tui-winsource.c (tui_update_source_windows_with_line): Take diff --git a/gdb/tui/tui-disasm.c b/gdb/tui/tui-disasm.c index 376343b..d8f2d38 100644 --- a/gdb/tui/tui-disasm.c +++ b/gdb/tui/tui-disasm.c @@ -258,25 +258,28 @@ tui_get_begin_asm_address (struct gdbarch **gdbarch_p, CORE_ADDR *addr_p) { struct tui_locator_window *locator; struct gdbarch *gdbarch = get_current_arch (); - CORE_ADDR addr; + CORE_ADDR addr = 0; locator = tui_locator_win_info_ptr (); if (locator->addr == 0) { - struct bound_minimal_symbol main_symbol; - - /* Find address of the start of program. - Note: this should be language specific. */ - main_symbol = lookup_minimal_symbol ("main", NULL, NULL); - if (main_symbol.minsym == 0) - main_symbol = lookup_minimal_symbol ("MAIN", NULL, NULL); - if (main_symbol.minsym == 0) - main_symbol = lookup_minimal_symbol ("_start", NULL, NULL); - if (main_symbol.minsym) - addr = BMSYMBOL_VALUE_ADDRESS (main_symbol); - else - addr = 0; + if (have_full_symbols () || have_partial_symbols ()) + { + set_default_source_symtab_and_line (); + struct symtab_and_line sal = get_current_source_symtab_and_line (); + + if (sal.symtab != nullptr) + find_line_pc (sal.symtab, sal.line, &addr); + } + + if (addr == 0) + { + struct bound_minimal_symbol main_symbol + = lookup_minimal_symbol (main_name (), nullptr, nullptr); + if (main_symbol.minsym != nullptr) + addr = BMSYMBOL_VALUE_ADDRESS (main_symbol); + } } else /* The target is executing. */ { |