This is the mail archive of the binutils@sources.redhat.com mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[patch] msvc demangling binutils


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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]