[PATCH] D50586: [Demangle] Add itaniumFindTypesInMangledName()

Stefan Gränitz via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Fri Aug 10 16:19:03 PDT 2018


sgraenitz created this revision.
sgraenitz added a reviewer: erik.pilkington.

This enables parameter type substitutions for mangled names in LLDB.
Thanks Erik for the patch!


Repository:
  rL LLVM

https://reviews.llvm.org/D50586

Files:
  include/llvm/Demangle/Demangle.h
  lib/Demangle/ItaniumDemangle.cpp


Index: lib/Demangle/ItaniumDemangle.cpp
===================================================================
--- lib/Demangle/ItaniumDemangle.cpp
+++ lib/Demangle/ItaniumDemangle.cpp
@@ -1965,6 +1965,9 @@
   // 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::parseType() {
   Node *Result = nullptr;
 
+  if (TypeCallback != nullptr)
+    TypeCallback(TypeCallbackContext, First);
+
   switch (look()) {
   //             ::= <qualified-type>
   case 'r':
@@ -4986,6 +4992,15 @@
   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();
+}
+
 namespace llvm {
 
 ItaniumPartialDemangler::ItaniumPartialDemangler()
@@ -5206,5 +5221,4 @@
 bool ItaniumPartialDemangler::isData() const {
   return !isFunction() && !isSpecialName();
 }
-
 }
Index: include/llvm/Demangle/Demangle.h
===================================================================
--- include/llvm/Demangle/Demangle.h
+++ include/llvm/Demangle/Demangle.h
@@ -31,6 +31,12 @@
 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 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);


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D50586.160201.patch
Type: text/x-patch
Size: 2315 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180810/ec7b5093/attachment-0001.bin>


More information about the llvm-commits mailing list