[llvm] r351448 - Move demangling function from llvm-objdump to Demangle library

James Henderson via llvm-commits llvm-commits at lists.llvm.org
Thu Jan 17 07:18:45 PST 2019


Author: jhenderson
Date: Thu Jan 17 07:18:44 2019
New Revision: 351448

URL: http://llvm.org/viewvc/llvm-project?rev=351448&view=rev
Log:
Move demangling function from llvm-objdump to Demangle library

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

Added:
    llvm/trunk/lib/Demangle/Demangle.cpp
    llvm/trunk/unittests/Demangle/DemangleTest.cpp
Modified:
    llvm/trunk/include/llvm/Demangle/Demangle.h
    llvm/trunk/lib/Demangle/CMakeLists.txt
    llvm/trunk/tools/llvm-objdump/llvm-objdump.cpp
    llvm/trunk/tools/llvm-undname/llvm-undname.cpp
    llvm/trunk/unittests/Demangle/CMakeLists.txt

Modified: llvm/trunk/include/llvm/Demangle/Demangle.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Demangle/Demangle.h?rev=351448&r1=351447&r2=351448&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Demangle/Demangle.h (original)
+++ llvm/trunk/include/llvm/Demangle/Demangle.h Thu Jan 17 07:18:44 2019
@@ -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, MS
 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.

Modified: llvm/trunk/lib/Demangle/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Demangle/CMakeLists.txt?rev=351448&r1=351447&r2=351448&view=diff
==============================================================================
--- llvm/trunk/lib/Demangle/CMakeLists.txt (original)
+++ llvm/trunk/lib/Demangle/CMakeLists.txt Thu Jan 17 07:18:44 2019
@@ -1,4 +1,5 @@
 add_llvm_library(LLVMDemangle
+  Demangle.cpp
   ItaniumDemangle.cpp
   MicrosoftDemangle.cpp
   MicrosoftDemangleNodes.cpp

Added: llvm/trunk/lib/Demangle/Demangle.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Demangle/Demangle.cpp?rev=351448&view=auto
==============================================================================
--- llvm/trunk/lib/Demangle/Demangle.cpp (added)
+++ llvm/trunk/lib/Demangle/Demangle.cpp Thu Jan 17 07:18:44 2019
@@ -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;
+}

Modified: llvm/trunk/tools/llvm-objdump/llvm-objdump.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-objdump/llvm-objdump.cpp?rev=351448&r1=351447&r2=351448&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-objdump/llvm-objdump.cpp (original)
+++ llvm/trunk/tools/llvm-objdump/llvm-objdump.cpp Thu Jan 17 07:18:44 2019
@@ -463,21 +463,6 @@ bool llvm::isRelocAddressLess(Relocation
   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,

Modified: llvm/trunk/tools/llvm-undname/llvm-undname.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-undname/llvm-undname.cpp?rev=351448&r1=351447&r2=351448&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-undname/llvm-undname.cpp (original)
+++ llvm/trunk/tools/llvm-undname/llvm-undname.cpp Thu Jan 17 07:18:44 2019
@@ -33,7 +33,7 @@ cl::opt<bool> DumpBackReferences("backre
 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";
     }
   }

Modified: llvm/trunk/unittests/Demangle/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/Demangle/CMakeLists.txt?rev=351448&r1=351447&r2=351448&view=diff
==============================================================================
--- llvm/trunk/unittests/Demangle/CMakeLists.txt (original)
+++ llvm/trunk/unittests/Demangle/CMakeLists.txt Thu Jan 17 07:18:44 2019
@@ -4,6 +4,7 @@ set(LLVM_LINK_COMPONENTS
 )
 
 add_llvm_unittest(DemangleTests
+  DemangleTest.cpp
   ItaniumDemangleTest.cpp
   PartialDemangleTest.cpp
 )

Added: llvm/trunk/unittests/Demangle/DemangleTest.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/Demangle/DemangleTest.cpp?rev=351448&view=auto
==============================================================================
--- llvm/trunk/unittests/Demangle/DemangleTest.cpp (added)
+++ llvm/trunk/unittests/Demangle/DemangleTest.cpp Thu Jan 17 07:18:44 2019
@@ -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 at Z"), "void __cdecl foo(int)");
+  EXPECT_EQ(demangle("foo"), "foo");
+}




More information about the llvm-commits mailing list