]> granicus.if.org Git - llvm/commitdiff
Move demangling function from llvm-objdump to Demangle library
authorJames Henderson <jh7370@my.bristol.ac.uk>
Thu, 17 Jan 2019 15:18:44 +0000 (15:18 +0000)
committerJames Henderson <jh7370@my.bristol.ac.uk>
Thu, 17 Jan 2019 15:18:44 +0000 (15:18 +0000)
This allows it to be used in an upcoming llvm-readobj change.

A small change in internal behaviour of the function is to always call
the microsoftDemangle function if the string does not have an itanium
encoding prefix, rather than only if it starts with '?'. This is
harmless because the microsoftDemangle function does the same check
already.

Reviewed by: grimar, erik.pilkington

Differential Revision: https://reviews.llvm.org/D56721

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@351448 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Demangle/Demangle.h
lib/Demangle/CMakeLists.txt
lib/Demangle/Demangle.cpp [new file with mode: 0644]
tools/llvm-objdump/llvm-objdump.cpp
tools/llvm-undname/llvm-undname.cpp
unittests/Demangle/CMakeLists.txt
unittests/Demangle/DemangleTest.cpp [new file with mode: 0644]

index 4c9dc9569e18835621ff6f924867bc734138dd12..9f3136cfcf4b0f96b6187d4500b22dadaf009d09 100644 (file)
@@ -11,6 +11,7 @@
 #define LLVM_DEMANGLE_DEMANGLE_H
 
 #include <cstddef>
+#include <string>
 
 namespace llvm {
 /// This is a llvm local version of __cxa_demangle. Other than the name and
@@ -36,6 +37,13 @@ enum MSDemangleFlags { MSDF_None = 0, MSDF_DumpBackrefs = 1 << 0 };
 char *microsoftDemangle(const char *mangled_name, char *buf, size_t *n,
                         int *status, MSDemangleFlags Flags = MSDF_None);
 
+/// Attempt to demangle a string using different demangling schemes.
+/// The function uses heuristics to determine which demangling scheme to use.
+/// \param MangledName - reference to string to demangle.
+/// \returns - the demangled string, or a copy of the input string if no
+/// demangling occurred.
+std::string demangle(const std::string &MangledName);
+
 /// "Partial" demangler. This supports demangling a string into an AST
 /// (typically an intermediate stage in itaniumDemangle) and querying certain
 /// properties or partially printing the demangled name.
index a681af979e45a07b087a7870e7915e2b6b6fdfa3..cde1a4c5c28f56d378d89db8dfc082e31e2c3a9b 100644 (file)
@@ -1,4 +1,5 @@
 add_llvm_library(LLVMDemangle
+  Demangle.cpp
   ItaniumDemangle.cpp
   MicrosoftDemangle.cpp
   MicrosoftDemangleNodes.cpp
diff --git a/lib/Demangle/Demangle.cpp b/lib/Demangle/Demangle.cpp
new file mode 100644 (file)
index 0000000..8a37b92
--- /dev/null
@@ -0,0 +1,30 @@
+//===-- Demangle.cpp - Common demangling functions ------------------------===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+///
+/// \file This file contains definitions of common demangling functions.
+///
+//===----------------------------------------------------------------------===//
+
+#include "llvm/Demangle/Demangle.h"
+
+std::string llvm::demangle(const std::string &MangledName) {
+  char *Demangled;
+  if (MangledName.compare(0, 2, "_Z") == 0)
+    Demangled = itaniumDemangle(MangledName.c_str(), nullptr, nullptr, nullptr);
+  else
+    Demangled =
+        microsoftDemangle(MangledName.c_str(), nullptr, nullptr, nullptr);
+
+  if (!Demangled)
+    return MangledName;
+
+  std::string Ret = Demangled;
+  free(Demangled);
+  return Ret;
+}
index 449d10cbb9278f9545cfa0f74a18ad419ec58dd2..a4dbd07612f422e05b3ad385b5dea9e8762e2439 100644 (file)
@@ -463,21 +463,6 @@ bool llvm::isRelocAddressLess(RelocationRef A, RelocationRef B) {
   return A.getOffset() < B.getOffset();
 }
 
-static std::string demangle(StringRef Name) {
-  char *Demangled = nullptr;
-  if (Name.startswith("_Z"))
-    Demangled = itaniumDemangle(Name.data(), Demangled, nullptr, nullptr);
-  else if (Name.startswith("?"))
-    Demangled = microsoftDemangle(Name.data(), Demangled, nullptr, nullptr);
-
-  if (!Demangled)
-    return Name;
-
-  std::string Ret = Demangled;
-  free(Demangled);
-  return Ret;
-}
-
 template <class ELFT>
 static std::error_code getRelocationValueString(const ELFObjectFile<ELFT> *Obj,
                                                 const RelocationRef &RelRef,
index 60520c8f7be0c521bb4764432807a423e24e6568..5009b94352be28b2653bd700e0aa1be9d8579e23 100644 (file)
@@ -33,7 +33,7 @@ cl::opt<bool> DumpBackReferences("backrefs", cl::Optional,
 cl::list<std::string> Symbols(cl::Positional, cl::desc("<input symbols>"),
                               cl::ZeroOrMore);
 
-static void demangle(const std::string &S) {
+static void msDemangle(const std::string &S) {
   int Status;
   MSDemangleFlags Flags = MSDF_None;
   if (DumpBackReferences)
@@ -75,14 +75,14 @@ int main(int argc, char **argv) {
         outs() << Line << "\n";
         outs().flush();
       }
-      demangle(Line);
+      msDemangle(Line);
       outs() << "\n";
     }
   } else {
     for (StringRef S : Symbols) {
       outs() << S << "\n";
       outs().flush();
-      demangle(S);
+      msDemangle(S);
       outs() << "\n";
     }
   }
index 954f3d05eacb3a2d329e8000d1d7c3ac0ede1cb6..c6291bb2a9803d1c12dae2a3c822d4fcf515304e 100644 (file)
@@ -4,6 +4,7 @@ set(LLVM_LINK_COMPONENTS
 )
 
 add_llvm_unittest(DemangleTests
+  DemangleTest.cpp
   ItaniumDemangleTest.cpp
   PartialDemangleTest.cpp
 )
diff --git a/unittests/Demangle/DemangleTest.cpp b/unittests/Demangle/DemangleTest.cpp
new file mode 100644 (file)
index 0000000..f60122c
--- /dev/null
@@ -0,0 +1,19 @@
+//===-- DemangleTest.cpp --------------------------------------------------===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/Demangle/Demangle.h"
+#include "gmock/gmock.h"
+
+using namespace llvm;
+
+TEST(Demangle, demangleTest) {
+  EXPECT_EQ(demangle("_Z3fooi"), "foo(int)");
+  EXPECT_EQ(demangle("?foo@@YAXH@Z"), "void __cdecl foo(int)");
+  EXPECT_EQ(demangle("foo"), "foo");
+}