summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Demangle
diff options
context:
space:
mode:
authorZachary Turner <zturner@google.com>2018-08-08 00:43:31 +0000
committerZachary Turner <zturner@google.com>2018-08-08 00:43:31 +0000
commit58d29cf590fa7d404f38ecd874f3342d13abbed4 (patch)
tree79641bbc156816c919797b28b3498a017d671222 /llvm/lib/Demangle
parent2e34bbd8e842c6c0fb5adaaafcbf90d971d3c114 (diff)
downloadbcm5719-llvm-58d29cf590fa7d404f38ecd874f3342d13abbed4.tar.gz
bcm5719-llvm-58d29cf590fa7d404f38ecd874f3342d13abbed4.zip
[MS Demangler] Properly handle backreferencing of special names.
Function template names are not stored in the backref table, but non-template function names are. The general pattern seems to be that when you are demangling a symbol name, if the name starts with '?' it does not go into the backreference table, otherwise it does. Note that this even handles the general case of operator names (template or otherwise) not going into the back-reference table, anonymous namespaces not going into the backreference table, etc. It's important that we apply this check *only* for the unqualified portion of a name, and only for symbol names. For example, this does not apply to type names (such as class templates) and we need to make sure that these still do go into the backref table. Differential Revision: https://reviews.llvm.org/D50394 llvm-svn: 339211
Diffstat (limited to 'llvm/lib/Demangle')
-rw-r--r--llvm/lib/Demangle/MicrosoftDemangle.cpp56
1 files changed, 36 insertions, 20 deletions
diff --git a/llvm/lib/Demangle/MicrosoftDemangle.cpp b/llvm/lib/Demangle/MicrosoftDemangle.cpp
index f5a54cae500..3db3d8f0b39 100644
--- a/llvm/lib/Demangle/MicrosoftDemangle.cpp
+++ b/llvm/lib/Demangle/MicrosoftDemangle.cpp
@@ -205,6 +205,12 @@ enum FuncClass : uint8_t {
Far = 1 << 6,
};
+enum NameBackrefBehavior : uint8_t {
+ NBB_None = 0, // don't save any names as backrefs.
+ NBB_Template = 1 << 0, // save template instanations.
+ NBB_Simple = 1 << 1, // save simple names.
+};
+
enum class SymbolCategory { Function, Variable };
namespace {
@@ -931,13 +937,15 @@ private:
Name *demangleFullyQualifiedSymbolName(StringView &MangledName);
Name *demangleUnqualifiedTypeName(StringView &MangledName, bool Memorize);
- Name *demangleUnqualifiedSymbolName(StringView &MangledName, bool Memorize);
+ Name *demangleUnqualifiedSymbolName(StringView &MangledName,
+ NameBackrefBehavior NBB);
Name *demangleNameScopeChain(StringView &MangledName, Name *UnqualifiedName);
Name *demangleNameScopePiece(StringView &MangledName);
Name *demangleBackRefName(StringView &MangledName);
- Name *demangleTemplateInstantiationName(StringView &MangledName);
+ Name *demangleTemplateInstantiationName(StringView &MangledName,
+ NameBackrefBehavior NBB);
Name *demangleOperatorName(StringView &MangledName);
Name *demangleSimpleName(StringView &MangledName, bool Memorize);
Name *demangleAnonymousNamespaceName(StringView &MangledName);
@@ -1124,11 +1132,12 @@ Name *Demangler::demangleBackRefName(StringView &MangledName) {
return Node;
}
-Name *Demangler::demangleTemplateInstantiationName(StringView &MangledName) {
+Name *Demangler::demangleTemplateInstantiationName(StringView &MangledName,
+ NameBackrefBehavior NBB) {
assert(MangledName.startsWith("?$"));
MangledName.consumeFront("?$");
- Name *Node = demangleUnqualifiedSymbolName(MangledName, false);
+ Name *Node = demangleUnqualifiedSymbolName(MangledName, NBB_None);
if (Error)
return nullptr;
@@ -1138,16 +1147,18 @@ Name *Demangler::demangleTemplateInstantiationName(StringView &MangledName) {
Node->IsTemplateInstantiation = true;
- // Render this class template name into a string buffer so that we can
- // memorize it for the purpose of back-referencing.
- OutputStream OS = OutputStream::create(nullptr, nullptr, 1024);
- outputName(OS, Node, *this);
- OS << '\0';
- char *Name = OS.getBuffer();
-
- StringView Owned = copyString(Name);
- memorizeString(Owned);
- std::free(Name);
+ if (NBB & NBB_Template) {
+ // Render this class template name into a string buffer so that we can
+ // memorize it for the purpose of back-referencing.
+ OutputStream OS = OutputStream::create(nullptr, nullptr, 1024);
+ outputName(OS, Node, *this);
+ OS << '\0';
+ char *Name = OS.getBuffer();
+
+ StringView Owned = copyString(Name);
+ memorizeString(Owned);
+ std::free(Name);
+ }
return Node;
}
@@ -1367,7 +1378,12 @@ Name *Demangler::demangleFullyQualifiedTypeName(StringView &MangledName) {
// Symbol names have slightly different rules regarding what can appear
// so we separate out the implementations for flexibility.
Name *Demangler::demangleFullyQualifiedSymbolName(StringView &MangledName) {
- Name *SymbolName = demangleUnqualifiedSymbolName(MangledName, true);
+ // This is the final component of a symbol name (i.e. the leftmost component
+ // of a mangled name. Since the only possible template instantiation that
+ // can appear in this context is a function template, and since those are
+ // not saved for the purposes of name backreferences, only backref simple
+ // names.
+ Name *SymbolName = demangleUnqualifiedSymbolName(MangledName, NBB_Simple);
if (Error)
return nullptr;
assert(SymbolName);
@@ -1389,20 +1405,20 @@ Name *Demangler::demangleUnqualifiedTypeName(StringView &MangledName,
return demangleBackRefName(MangledName);
if (MangledName.startsWith("?$"))
- return demangleTemplateInstantiationName(MangledName);
+ return demangleTemplateInstantiationName(MangledName, NBB_Template);
return demangleSimpleName(MangledName, Memorize);
}
Name *Demangler::demangleUnqualifiedSymbolName(StringView &MangledName,
- bool Memorize) {
+ NameBackrefBehavior NBB) {
if (startsWithDigit(MangledName))
return demangleBackRefName(MangledName);
if (MangledName.startsWith("?$"))
- return demangleTemplateInstantiationName(MangledName);
+ return demangleTemplateInstantiationName(MangledName, NBB);
if (MangledName.startsWith('?'))
return demangleOperatorName(MangledName);
- return demangleSimpleName(MangledName, Memorize);
+ return demangleSimpleName(MangledName, (NBB & NBB_Simple) != 0);
}
Name *Demangler::demangleNameScopePiece(StringView &MangledName) {
@@ -1410,7 +1426,7 @@ Name *Demangler::demangleNameScopePiece(StringView &MangledName) {
return demangleBackRefName(MangledName);
if (MangledName.startsWith("?$"))
- return demangleTemplateInstantiationName(MangledName);
+ return demangleTemplateInstantiationName(MangledName, NBB_Template);
if (MangledName.startsWith("?A"))
return demangleAnonymousNamespaceName(MangledName);
OpenPOWER on IntegriCloud