[llvm] r339580 - [itanium demangler] Add llvm::itaniumFindTypesInMangledName()

Erik Pilkington via llvm-commits llvm-commits at lists.llvm.org
Mon Aug 13 09:37:47 PDT 2018


Author: epilk
Date: Mon Aug 13 09:37:47 2018
New Revision: 339580

URL: http://llvm.org/viewvc/llvm-project?rev=339580&view=rev
Log:
[itanium demangler] Add llvm::itaniumFindTypesInMangledName()

This function calls a callback whenever a <type> is parsed.

This is necessary to implement FindAlternateFunctionManglings in LLDB, which
uses a similar hack in FastDemangle. Once that function has been updated to use
this version, FastDemangle can finally be removed.

Differential revision: https://reviews.llvm.org/D50586

Added:
    llvm/trunk/unittests/Demangle/FindTypesInMangledNameTest.cpp
Modified:
    llvm/trunk/include/llvm/Demangle/Demangle.h
    llvm/trunk/lib/Demangle/ItaniumDemangle.cpp
    llvm/trunk/unittests/Demangle/CMakeLists.txt
    llvm/trunk/unittests/Demangle/PartialDemangleTest.cpp

Modified: llvm/trunk/include/llvm/Demangle/Demangle.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Demangle/Demangle.h?rev=339580&r1=339579&r2=339580&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Demangle/Demangle.h (original)
+++ llvm/trunk/include/llvm/Demangle/Demangle.h Mon Aug 13 09:37:47 2018
@@ -31,6 +31,12 @@ enum : int {
 char *itaniumDemangle(const char *mangled_name, char *buf, size_t *n,
                       int *status);
 
+/// Calls the callback \c Callback with \c Ctx as an argument whenever a type is
+/// encountered. Returns true if \c MangledName couldn't be parsed.
+bool itaniumFindTypesInMangledName(const char *MangledName, void *Ctx,
+                                   void (*Callback)(void *, const char *));
+
+
 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);

Modified: llvm/trunk/lib/Demangle/ItaniumDemangle.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Demangle/ItaniumDemangle.cpp?rev=339580&r1=339579&r2=339580&view=diff
==============================================================================
--- llvm/trunk/lib/Demangle/ItaniumDemangle.cpp (original)
+++ llvm/trunk/lib/Demangle/ItaniumDemangle.cpp Mon Aug 13 09:37:47 2018
@@ -1965,6 +1965,9 @@ struct Db {
   // conversion operator's type, and are resolved in the enclosing <encoding>.
   PODSmallVector<ForwardTemplateReference *, 4> ForwardTemplateRefs;
 
+  void (*TypeCallback)(void *, const char *) = nullptr;
+  void *TypeCallbackContext = nullptr;
+
   bool TryToParseTemplateArgs = true;
   bool PermitForwardTemplateReferences = false;
   bool ParsingLambdaParams = false;
@@ -3207,6 +3210,9 @@ Node *Db::parseQualifiedType() {
 Node *Db::parseType() {
   Node *Result = nullptr;
 
+  if (TypeCallback != nullptr)
+    TypeCallback(TypeCallbackContext, First);
+
   switch (look()) {
   //             ::= <qualified-type>
   case 'r':
@@ -4986,6 +4992,15 @@ char *llvm::itaniumDemangle(const char *
   return InternalStatus == demangle_success ? Buf : nullptr;
 }
 
+bool llvm::itaniumFindTypesInMangledName(const char *MangledName, void *Ctx,
+                                         void (*Callback)(void *,
+                                                          const char *)) {
+  Db Parser(MangledName, MangledName + std::strlen(MangledName));
+  Parser.TypeCallback = Callback;
+  Parser.TypeCallbackContext = Ctx;
+  return Parser.parse() == nullptr;
+}
+
 namespace llvm {
 
 ItaniumPartialDemangler::ItaniumPartialDemangler()
@@ -5206,5 +5221,4 @@ bool ItaniumPartialDemangler::isSpecialN
 bool ItaniumPartialDemangler::isData() const {
   return !isFunction() && !isSpecialName();
 }
-
 }

Modified: llvm/trunk/unittests/Demangle/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/Demangle/CMakeLists.txt?rev=339580&r1=339579&r2=339580&view=diff
==============================================================================
--- llvm/trunk/unittests/Demangle/CMakeLists.txt (original)
+++ llvm/trunk/unittests/Demangle/CMakeLists.txt Mon Aug 13 09:37:47 2018
@@ -4,4 +4,5 @@ set(LLVM_LINK_COMPONENTS
 
 add_llvm_unittest(DemangleTests
   PartialDemangleTest.cpp
+  FindTypesInMangledNameTest.cpp
 )

Added: llvm/trunk/unittests/Demangle/FindTypesInMangledNameTest.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/Demangle/FindTypesInMangledNameTest.cpp?rev=339580&view=auto
==============================================================================
--- llvm/trunk/unittests/Demangle/FindTypesInMangledNameTest.cpp (added)
+++ llvm/trunk/unittests/Demangle/FindTypesInMangledNameTest.cpp Mon Aug 13 09:37:47 2018
@@ -0,0 +1,34 @@
+//===------------------ FindTypesInMangledNameTest.cpp --------------------===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is dual licensed under the MIT and the University of Illinois Open
+// Source Licenses. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include <cstdlib>
+#include <vector>
+#include "llvm/Demangle/Demangle.h"
+#include "gtest/gtest.h"
+
+TEST(FindTypesInMangledNameTest, Test) {
+  std::vector<const char *> Types;
+  const char *Mangled = "_Z1fiv";
+  EXPECT_FALSE(llvm::itaniumFindTypesInMangledName(
+      Mangled, static_cast<void *>(&Types), +[](void *Ty, const char *P) {
+        static_cast<std::vector<const char *> *>(Ty)->push_back(P);
+      }));
+  EXPECT_EQ(Types.size(), size_t(2));
+  EXPECT_EQ(Mangled + 4, Types.front());
+  EXPECT_EQ(Mangled + 5, Types.back());
+
+  EXPECT_TRUE(llvm::itaniumFindTypesInMangledName(
+      "Not a mangled name!", nullptr, +[](void *, const char *) {}));
+
+  int TC = 0;
+  EXPECT_FALSE(llvm::itaniumFindTypesInMangledName(
+      "_Z1fPRic", static_cast<void *>(&TC),
+      +[](void *Ctx, const char *) { ++*static_cast<int *>(Ctx); }));
+  EXPECT_EQ(TC, 4); // pointer, reference, int, char.
+}

Modified: llvm/trunk/unittests/Demangle/PartialDemangleTest.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/Demangle/PartialDemangleTest.cpp?rev=339580&r1=339579&r2=339580&view=diff
==============================================================================
--- llvm/trunk/unittests/Demangle/PartialDemangleTest.cpp (original)
+++ llvm/trunk/unittests/Demangle/PartialDemangleTest.cpp Mon Aug 13 09:37:47 2018
@@ -58,7 +58,7 @@ static ChoppedName NamesToTest[] = {
    "mfn", "void", "(int, char, float, unsigned int, char, double)"},
 };
 
-TEST(PartialDemangleTest, TestNameChopping) {
+TEST(PartialDemanglerTest, TestNameChopping) {
   size_t Size = 1;
   char *Buf = static_cast<char *>(std::malloc(Size));
 
@@ -86,7 +86,7 @@ TEST(PartialDemangleTest, TestNameChoppi
   std::free(Buf);
 }
 
-TEST(PartialDemangleTest, TestNameMeta) {
+TEST(PartialDemanglerTest, TestNameMeta) {
   llvm::ItaniumPartialDemangler Demangler;
 
   EXPECT_FALSE(Demangler.partialDemangle("_ZNK1f1gEv"));




More information about the llvm-commits mailing list