// What follows is a main symbol name. This may include
// namespaces or class BackReferences.
S->SymbolName = demangleFullyQualifiedSymbolName(MangledName);
-
+ if (Error)
+ return nullptr;
// Read a variable.
S->SymbolType = startsWithDigit(MangledName)
? demangleVariableEncoding(MangledName)
: demangleFunctionEncoding(MangledName);
+ if (Error)
+ return nullptr;
return S;
}
MangledName.consumeFront("?$");
Name *Node = demangleSimpleName(MangledName, false);
+ if (Error)
+ return nullptr;
+
Node->TParams = demangleTemplateParameterList(MangledName);
+ if (Error)
+ return nullptr;
// Render this class template name into a string buffer so that we can
// memorize it for the purpose of back-referencing.
// Parses a type name in the form of A@B@C@@ which represents C::B::A.
Name *Demangler::demangleFullyQualifiedTypeName(StringView &MangledName) {
Name *TypeName = demangleUnqualifiedTypeName(MangledName);
+ if (Error)
+ return nullptr;
assert(TypeName);
Name *QualName = demangleNameScopeChain(MangledName, TypeName);
+ if (Error)
+ return nullptr;
assert(QualName);
return QualName;
}
// so we separate out the implementations for flexibility.
Name *Demangler::demangleFullyQualifiedSymbolName(StringView &MangledName) {
Name *SymbolName = demangleUnqualifiedSymbolName(MangledName);
+ if (Error)
+ return nullptr;
assert(SymbolName);
Name *QualName = demangleNameScopeChain(MangledName, SymbolName);
+ if (Error)
+ return nullptr;
assert(QualName);
return QualName;
}
// Empty parameter pack.
if (MangledName.consumeFront("$S") || MangledName.consumeFront("$$V") ||
MangledName.consumeFront("$$$V")) {
- if (!MangledName.startsWith('@'))
- Error = true;
- continue;
+ break;
}
if (MangledName.consumeFront("$$Y")) {
(*Current)->ParamType =
demangleType(MangledName, QualifierMangleMode::Drop);
}
+ if (Error)
+ return nullptr;
Current = &(*Current)->Next;
}
if (Error)
- return {};
+ return nullptr;
// Template parameter lists cannot be variadic, so it can only be terminated
// by @.
if (MangledName.consumeFront('@'))
return Head;
Error = true;
- return {};
+ return nullptr;
}
void Demangler::output(const Symbol *S, OutputStream &OS) {
StringView Name{MangledName};
Symbol *S = D.parse(Name);
- if (D.Error)
+ OutputStream OS = OutputStream::create(Buf, N, 1024);
+ if (D.Error) {
+ OS << MangledName;
*Status = llvm::demangle_invalid_mangled_name;
- else
+ } else {
+ D.output(S, OS);
*Status = llvm::demangle_success;
+ }
- OutputStream OS = OutputStream::create(Buf, N, 1024);
- D.output(S, OS);
OS << '\0';
return OS.getBuffer();
}