summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Demangle/ItaniumDemangle.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/Demangle/ItaniumDemangle.cpp')
-rw-r--r--llvm/lib/Demangle/ItaniumDemangle.cpp16
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();
}
-
}
OpenPOWER on IntegriCloud