[patch] msvc demangling binutils

Eddy Pronk epronk@muftor.com
Wed Jun 23 06:13:00 GMT 2004


The patch below adds msvc demangling to binutils.
It enables --demangle=msvc in nm.

It uses a win32 API call to UnDecorateSymbolName.

I managed to link manually to libimagehlp.a, but failed to
integrate it in the build.

Eddy


diff -aurw binutils-20040312-1/binutils/nm.c
binutils-20040312-1-modified/binutils/nm.c
--- binutils-20040312-1/binutils/nm.c	2003-11-17 04:09:21.000000000 +0100
+++ binutils-20040312-1-modified/binutils/nm.c	2004-06-20
22:28:29.539843200 +0200
@@ -253,7 +253,7 @@
   -C, --demangle[=STYLE] Decode low-level symbol names into user-level
names\n\
                           The STYLE, if specified, can be `auto' (the
default),\n\
                           `gnu', `lucid', `arm', `hp', `edg', `gnu-v3',
`java'\n\
-                          or `gnat'\n\
+                          `gnat' or 'msvc'\n\
       --no-demangle      Do not demangle low-level symbol names\n\
   -D, --dynamic          Display dynamic symbols instead of normal
symbols\n\
       --defined-only     Display only defined symbols\n\
diff -aurw binutils-20040312-1/include/demangle.h
binutils-20040312-1-modified/include/demangle.h
--- binutils-20040312-1/include/demangle.h	2004-02-05 01:51:42.000000000
+0100
+++ binutils-20040312-1-modified/include/demangle.h	2004-06-20
19:26:11.000000000 +0200
@@ -46,9 +46,10 @@
 #define DMGL_EDG	 (1 << 13)
 #define DMGL_GNU_V3	 (1 << 14)
 #define DMGL_GNAT	 (1 << 15)
+#define DMGL_MSVC	 (1 << 16)

 /* If none of these are set, use 'current_demangling_style' as the
default. */
-#define DMGL_STYLE_MASK
(DMGL_AUTO|DMGL_GNU|DMGL_LUCID|DMGL_ARM|DMGL_HP|DMGL_EDG|DMGL_GNU_V3|DMGL_JAVA|DMGL_GNAT)
+#define DMGL_STYLE_MASK
(DMGL_AUTO|DMGL_GNU|DMGL_LUCID|DMGL_ARM|DMGL_HP|DMGL_EDG|DMGL_GNU_V3|DMGL_JAVA|DMGL_GNAT|DMGL_MSVC)

 /* Enumeration of possible demangling styles.

@@ -70,7 +71,8 @@
   edg_demangling = DMGL_EDG,
   gnu_v3_demangling = DMGL_GNU_V3,
   java_demangling = DMGL_JAVA,
-  gnat_demangling = DMGL_GNAT
+  gnat_demangling = DMGL_GNAT,
+  msvc_demangling = DMGL_MSVC
 } current_demangling_style;

 /* Define string names for the various demangling styles. */
@@ -85,6 +87,7 @@
 #define GNU_V3_DEMANGLING_STYLE_STRING        "gnu-v3"
 #define JAVA_DEMANGLING_STYLE_STRING          "java"
 #define GNAT_DEMANGLING_STYLE_STRING          "gnat"
+#define MSVC_DEMANGLING_STYLE_STRING          "msvc"

 /* Some macros to test what demangling style is active. */

@@ -98,6 +101,7 @@
 #define GNU_V3_DEMANGLING (((int) CURRENT_DEMANGLING_STYLE) & DMGL_GNU_V3)
 #define JAVA_DEMANGLING (((int) CURRENT_DEMANGLING_STYLE) & DMGL_JAVA)
 #define GNAT_DEMANGLING (((int) CURRENT_DEMANGLING_STYLE) & DMGL_GNAT)
+#define MSVC_DEMANGLING (((int) CURRENT_DEMANGLING_STYLE) & DMGL_MSVC)

 /* Provide information about the available demangle styles. This code is
    pulled from gdb into libiberty because it is useful to binutils also.  */
diff -aurw binutils-20040312-1/libiberty/cplus-dem.c
binutils-20040312-1-modified/libiberty/cplus-dem.c
--- binutils-20040312-1/libiberty/cplus-dem.c	2004-02-05
01:52:07.000000000 +0100
+++ binutils-20040312-1-modified/libiberty/cplus-dem.c	2004-06-22
19:15:33.410699200 +0200
@@ -56,12 +56,18 @@
 char * realloc ();
 #endif

+#if defined(__CYGWIN__)
+#include <windows.h>
+#include "imagehlp.h"
+#endif
+
 #include <demangle.h>
 #undef CURRENT_DEMANGLING_STYLE
 #define CURRENT_DEMANGLING_STYLE work->options

 #include "libiberty.h"

+static char *msvc_demangle  PARAMS ((const char *));
 static char *ada_demangle  PARAMS ((const char *, int));

 #define min(X,Y) (((X) < (Y)) ? (X) : (Y))
@@ -309,6 +315,12 @@
   }
   ,
   {
+    MSVC_DEMANGLING_STYLE_STRING,
+    msvc_demangling,
+    "MSVC style demangling"
+  }
+  ,
+  {
     NULL, unknown_demangling, NULL
   }
 };
@@ -933,6 +945,9 @@
   if (GNAT_DEMANGLING)
     return ada_demangle(mangled,options);

+  if (MSVC_DEMANGLING)
+     return msvc_demangle(mangled);
+
   ret = internal_cplus_demangle (work, mangled);
   squangle_mop_up (work);
   return (ret);
@@ -1070,6 +1085,32 @@
   return demangled;
 }

+static char*
+msvc_demangle (mangled)
+     const char *mangled;
+{
+   char *demangled;
+   int l;
+   char* prefix = "_imp_";
+   const char* p;
+   char* q;
+
+   l = 1000;
+   demangled = malloc(l);
+   p = mangled;
+   q = demangled;
+   if(!strncmp(mangled, prefix, strlen(prefix)))
+   {
+      sprintf(demangled, "%s ",prefix);
+      p = mangled + strlen(prefix);
+      q = demangled + strlen(demangled);
+      l -= strlen(demangled);
+   }
+
+   UnDecorateSymbolName(p, q, l, UNDNAME_COMPLETE);
+   return demangled;
+}
+
 /* This function performs most of what cplus_demangle use to do, but
    to be able to demangle a name with a B, K or n code, we need to
    have a longer term memory of what types have been seen. The original



More information about the Binutils mailing list