]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
gdb/disasm: fix demangling when disassembling the current function
authorAndrew Burgess <aburgess@redhat.com>
Mon, 18 Nov 2024 10:58:26 +0000 (10:58 +0000)
committerAndrew Burgess <aburgess@redhat.com>
Fri, 22 Nov 2024 16:36:07 +0000 (16:36 +0000)
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>
gdb/cli/cli-cmds.c
gdb/testsuite/gdb.cp/disasm-func-name.exp

index 299064f5802a4b313247d70001597b2428cb7d2c..bc6cb5813f96e150fbcb9aee23fa2bf41fcfdb0b 100644 (file)
@@ -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'.  */
index 0d37fbd200aa2153d15e9b1440559cf173e6b7ad..0b5dd15115f09285dafd64acf3465a91a87d5b40 100644 (file)
@@ -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"