]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
Add "maint canonicalize" command
authorTom Tromey <tromey@adacore.com>
Tue, 1 Nov 2022 18:48:27 +0000 (12:48 -0600)
committerTom Tromey <tom@tromey.com>
Sat, 26 Apr 2025 21:03:00 +0000 (15:03 -0600)
This adds a new "maint canonicalize" command that can be used to see
the canonical form of a C++ name.  I've needed this a few times when
debugging gdb.

Reviewed-By: Eli Zaretskii <eliz@gnu.org>
Reviewed-By: Tom de Vries <tdevries@suse.de>
gdb/NEWS
gdb/doc/gdb.texinfo
gdb/maint.c
gdb/testsuite/gdb.base/maint.exp

index 14d30631a2c3e00dd4b04154fc603e3dafcef434..077d28a33e4b2161e5d8abbef543cfbcc2f7a3fe 100644 (file)
--- a/gdb/NEWS
+++ b/gdb/NEWS
@@ -56,6 +56,9 @@ maintenance check psymtabs
 maintenance check symtabs
   Renamed from maintenance check-symtabs
 
+maintenance canonicalize
+  Show the canonical form of a C++ name.
+
 set riscv numeric-register-names on|off
 show riscv numeric-register-names
   Controls whether GDB refers to risc-v registers by their numeric names
index 362e6e752ef37be7c77e36d7c87fb99b47c69240..9b4aa5b47b2efe09e667aed0987ee96573216618 100644 (file)
@@ -41632,6 +41632,13 @@ into remote agent bytecodes and display them as a disassembled list.
 This command is useful for debugging the agent version of dynamic
 printf (@pxref{Dynamic Printf}).
 
+@kindex maint canonicalize
+@item maint canonicalize @var{name}
+Print the canonical form of @var{name}, a C@t{++} name.  Because a
+C@t{++} name may have multiple possible spellings, @value{GDBN}
+computes a canonical form of a name for internal use.  For example,
+@code{short int} and @code{short} are two ways to name the same type.
+
 @kindex maint info breakpoints
 @anchor{maint info breakpoints}
 @item maint info breakpoints
index f5977ecd919466319693e50bca15d247f50480e2..766ab74e6d5125ec4e20b16b8e8adae34b686d87 100644 (file)
@@ -39,6 +39,7 @@
 #include "inferior.h"
 #include "gdbsupport/thread-pool.h"
 #include "event-top.h"
+#include "cp-support.h"
 
 #include "cli/cli-decode.h"
 #include "cli/cli-utils.h"
@@ -108,6 +109,18 @@ maintenance_demangle (const char *args, int from_tty)
              styled_string (command_style.style (), "demangle"));
 }
 
+/* Print the canonical form of a name.  */
+
+static void
+maintenance_canonicalize (const char *args, int from_tty)
+{
+  gdb::unique_xmalloc_ptr<char> canon = cp_canonicalize_string (args);
+  if (canon == nullptr)
+    gdb_printf ("No change.\n");
+  else
+    gdb_printf ("canonical = %s\n", canon.get ());
+}
+
 static void
 maintenance_time_display (const char *args, int from_tty)
 {
@@ -1343,6 +1356,12 @@ This command has been moved to \"demangle\"."),
                 &maintenancelist);
   deprecate_cmd (cmd, "demangle");
 
+  cmd = add_cmd ("canonicalize", class_maintenance, maintenance_canonicalize,
+                _("\
+Show the canonical form of a C++ name.\n\
+Usage: maintenance canonicalize NAME"),
+                &maintenancelist);
+
   add_prefix_cmd ("per-command", class_maintenance, set_per_command_cmd, _("\
 Per-command statistics settings."),
                    &per_command_setlist,
index e006d55c53bb6fb9fe29378882c9fafb846aff96..52282bc32b3788a291d21f642f635dd44823fdcc 100644 (file)
@@ -513,4 +513,9 @@ gdb_test_no_output "maint print symbols"
 gdb_test_no_output "maint print msymbols"
 gdb_test_no_output "maint print psymbols"
 
+gdb_test "maint canonicalize int short" "canonical = short"
+gdb_test "maint canonicalize fn<ty<int>>" \
+    "canonical = fn<ty<int> >"
+gdb_test "maint canonical unsigned int" "No change\\."
+
 gdb_exit