aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Burgess <aburgess@redhat.com>2024-11-18 10:58:26 +0000
committerAndrew Burgess <aburgess@redhat.com>2024-11-22 16:36:07 +0000
commit26522e34802f32406eb653d91a3bbb509f919b30 (patch)
tree0c974af46ea3ffbafbee4c8be864e125348c4025
parent[gdb/python] Ensure locale is restored in do_start_initialization (diff)
downloadbinutils-gdb-26522e34802f32406eb653d91a3bbb509f919b30.tar.gz
binutils-gdb-26522e34802f32406eb653d91a3bbb509f919b30.tar.bz2
binutils-gdb-26522e34802f32406eb653d91a3bbb509f919b30.zip
gdb/disasm: fix demangling when disassembling the current function
When disassembling function symbols in C++ code, if GDB is asked to disassemble a function by name then the function name in the header line can be demangled by turning on `set print asm-demangle on`, e.g.: (gdb) disassemble foo_type::some_function Dump of assembler code for function _ZN8foo_type13some_functionE7my_type: 0x0000000000401142 <+0>: push %rbp ... etc ... End of assembler dump. (gdb) set print asm-demangle on (gdb) disassemble foo_type::some_function Dump of assembler code for function foo_type::some_function(my_type): 0x0000000000401142 <+0>: push %rbp ... etc ... │ End of assembler dump. │ However, if GDB is disassembling the current function, then this demangling doesn't work, e.g.: (gdb) break foo_type::some_function Breakpoint 1 at 0x401152: file mangle.cc, line 16. (gdb) run Starting program: /tmp/mangle Breakpoint 1, foo_type::some_function (this=0x7fffffffa597, obj=...) at mangle.cc:16 16 obj.update (); (gdb) disassemble Dump of assembler code for function _ZN8foo_type13some_functionE7my_type: 0x0000000000401142 <+0>: push %rbp ... etc ... End of assembler dump. (gdb) set print asm-demangle on (gdb) disassemble Dump of assembler code for function _ZN8foo_type13some_functionE7my_type: 0x0000000000401142 <+0>: push %rbp ... etc ... End of assembler dump. This commit fixes this issue, and extends gdb.cp/disasm-func-name.exp, which was already testing the first case (disassemble by name) to also cover disassembling the current function. Approved-By: Tom Tromey <tom@tromey.com>
-rw-r--r--gdb/cli/cli-cmds.c20
-rw-r--r--gdb/testsuite/gdb.cp/disasm-func-name.exp23
2 files changed, 34 insertions, 9 deletions
diff --git a/gdb/cli/cli-cmds.c b/gdb/cli/cli-cmds.c
index 299064f5802..bc6cb5813f9 100644
--- a/gdb/cli/cli-cmds.c
+++ b/gdb/cli/cli-cmds.c
@@ -1551,17 +1551,19 @@ print_disassembly (struct gdbarch *gdbarch, const char *name,
static void
disassemble_current_function (gdb_disassembly_flags flags)
{
- frame_info_ptr frame;
- struct gdbarch *gdbarch;
- CORE_ADDR low, high, pc;
- const char *name;
- const struct block *block;
+ frame_info_ptr frame = get_selected_frame (_("No frame selected."));
+ struct gdbarch *gdbarch = get_frame_arch (frame);
+ CORE_ADDR pc = get_frame_address_in_block (frame);
- frame = get_selected_frame (_("No frame selected."));
- gdbarch = get_frame_arch (frame);
- pc = get_frame_address_in_block (frame);
- if (find_pc_partial_function (pc, &name, &low, &high, &block) == 0)
+ const general_symbol_info *gsi;
+ const struct block *block;
+ CORE_ADDR low, high;
+ if (find_pc_partial_function_sym (pc, &gsi, &low, &high, &block) == 0)
error (_("No function contains program counter for selected frame."));
+
+ gdb_assert (gsi != nullptr);
+ const char *name = asm_demangle ? gsi->print_name () : gsi->linkage_name ();
+
#if defined(TUI)
/* NOTE: cagney/2003-02-13 The `tui_active' was previously
`tui_version'. */
diff --git a/gdb/testsuite/gdb.cp/disasm-func-name.exp b/gdb/testsuite/gdb.cp/disasm-func-name.exp
index 0d37fbd200a..0b5dd15115f 100644
--- a/gdb/testsuite/gdb.cp/disasm-func-name.exp
+++ b/gdb/testsuite/gdb.cp/disasm-func-name.exp
@@ -43,3 +43,26 @@ check_disassembly_header "process" "process\\(A\\*, int\\)"
check_disassembly_header "A::A" "A::A\\(int\\)"
check_disassembly_header "A::get_i" "A::get_i\\(\\) const"
check_disassembly_header "A::set_i" "A::set_i\\(int\\)"
+
+# Place a breakpoint at STOP_LOC and then continue until a breakpoint
+# is hit (we assume this is the breakpoint we just created.
+#
+# Then disassemble the current function, EXPECT should appear in the
+# disassembly header as the name of the current function.
+proc continue_and_check { stop_loc expected } {
+ gdb_breakpoint $stop_loc
+ gdb_continue_to_breakpoint "continue to $stop_loc"
+
+ with_test_prefix "at $stop_loc" {
+ check_disassembly_header "" $expected
+ }
+}
+
+# Initially we are already in main.
+check_disassembly_header "" "main\\(\\)"
+
+# Now move forward and check the disassembly at various locations.
+continue_and_check "A::A" "A::A\\(int\\)"
+continue_and_check "process" "process\\(A\\*, int\\)"
+continue_and_check "A::set_i" "A::set_i\\(int\\)"
+continue_and_check "A::get_i" "A::get_i\\(\\) const"