diff options
Diffstat (limited to 'llvm/lib/Demangle/ItaniumDemangle.cpp')
-rw-r--r-- | llvm/lib/Demangle/ItaniumDemangle.cpp | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/llvm/lib/Demangle/ItaniumDemangle.cpp b/llvm/lib/Demangle/ItaniumDemangle.cpp index 98b92b04a26..887e9be9b49 100644 --- a/llvm/lib/Demangle/ItaniumDemangle.cpp +++ b/llvm/lib/Demangle/ItaniumDemangle.cpp @@ -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 *MangledName, char *Buf, 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::isSpecialName() const { bool ItaniumPartialDemangler::isData() const { return !isFunction() && !isSpecialName(); } - } |