llvm-undname: Extract demangleMD5Name() method; no behavior change

llvm-svn: 361783
This commit is contained in:
Nico Weber 2019-05-27 23:10:42 +00:00
parent 23343c5d90
commit 82dc06c340
2 changed files with 35 additions and 30 deletions

View File

@ -157,6 +157,7 @@ private:
SymbolNode *demangleEncodedSymbol(StringView &MangledName,
QualifiedNameNode *QN);
SymbolNode *demangleDeclarator(StringView &MangledName);
SymbolNode *demangleMD5Name(StringView &MangledName);
VariableSymbolNode *demangleVariableEncoding(StringView &MangledName,
StorageClass SC);

View File

@ -745,38 +745,42 @@ SymbolNode *Demangler::demangleDeclarator(StringView &MangledName) {
return Symbol;
}
SymbolNode *Demangler::demangleMD5Name(StringView &MangledName) {
assert(MangledName.startsWith("??@"));
// This is an MD5 mangled name. We can't demangle it, just return the
// mangled name.
// An MD5 mangled name is ??@ followed by 32 characters and a terminating @.
size_t MD5Last = MangledName.find('@', strlen("??@"));
if (MD5Last == StringView::npos) {
Error = true;
return nullptr;
}
const char *Start = MangledName.begin();
MangledName = MangledName.dropFront(MD5Last + 1);
// There are two additional special cases for MD5 names:
// 1. For complete object locators where the object name is long enough
// for the object to have an MD5 name, the complete object locator is
// called ??@...@??_R4@ (with a trailing "??_R4@" instead of the usual
// leading "??_R4". This is handled here.
// 2. For catchable types, in versions of MSVC before 2015 (<1900) or after
// 2017.2 (>= 1914), the catchable type mangling is _CT??@...@??@...@8
// instead of_CT??@...@8 with just one MD5 name. Since we don't yet
// demangle catchable types anywhere, this isn't handled for MD5 names
// either.
MangledName.consumeFront("??_R4@");
StringView MD5(Start, MangledName.begin());
SymbolNode *S = Arena.alloc<SymbolNode>(NodeKind::Md5Symbol);
S->Name = synthesizeQualifiedName(Arena, MD5);
return S;
}
// Parser entry point.
SymbolNode *Demangler::parse(StringView &MangledName) {
if (MangledName.startsWith("??@")) {
// This is an MD5 mangled name. We can't demangle it, just return the
// mangled name.
// An MD5 mangled name is ??@ followed by 32 characters and a terminating @.
size_t MD5Last = MangledName.find('@', strlen("??@"));
if (MD5Last == StringView::npos) {
Error = true;
return nullptr;
}
const char* Start = MangledName.begin();
MangledName = MangledName.dropFront(MD5Last + 1);
// There are two additional special cases for MD5 names:
// 1. For complete object locators where the object name is long enough
// for the object to have an MD5 name, the complete object locator is
// called ??@...@??_R4@ (with a trailing "??_R4@" instead of the usual
// leading "??_R4". This is handled here.
// 2. For catchable types, in versions of MSVC before 2015 (<1900) or after
// 2017.2 (>= 1914), the catchable type mangling is _CT??@...@??@...@8
// instead of_CT??@...@8 with just one MD5 name. Since we don't yet
// demangle catchable types anywhere, this isn't handled for MD5 names
// either.
MangledName.consumeFront("??_R4@");
StringView MD5(Start, MangledName.begin());
SymbolNode *S = Arena.alloc<SymbolNode>(NodeKind::Md5Symbol);
S->Name = synthesizeQualifiedName(Arena, MD5);
return S;
}
if (MangledName.startsWith("??@"))
return demangleMD5Name(MangledName);
// MSVC-style mangled symbols must start with '?'.
if (!MangledName.startsWith('?')) {