aboutsummaryrefslogtreecommitdiff
path: root/contrib/llvm-project/llvm/lib/Support/ItaniumManglingCanonicalizer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/llvm-project/llvm/lib/Support/ItaniumManglingCanonicalizer.cpp')
-rw-r--r--contrib/llvm-project/llvm/lib/Support/ItaniumManglingCanonicalizer.cpp39
1 files changed, 17 insertions, 22 deletions
diff --git a/contrib/llvm-project/llvm/lib/Support/ItaniumManglingCanonicalizer.cpp b/contrib/llvm-project/llvm/lib/Support/ItaniumManglingCanonicalizer.cpp
index bbc06d186fba..da6514f7170b 100644
--- a/contrib/llvm-project/llvm/lib/Support/ItaniumManglingCanonicalizer.cpp
+++ b/contrib/llvm-project/llvm/lib/Support/ItaniumManglingCanonicalizer.cpp
@@ -36,6 +36,17 @@ struct FoldingSetNodeIDBuilder {
operator()(T V) {
ID.AddInteger((unsigned long long)V);
}
+ void operator()(itanium_demangle::NodeOrString NS) {
+ if (NS.isNode()) {
+ ID.AddInteger(0);
+ (*this)(NS.asNode());
+ } else if (NS.isString()) {
+ ID.AddInteger(1);
+ (*this)(NS.asString());
+ } else {
+ ID.AddInteger(2);
+ }
+ }
void operator()(itanium_demangle::NodeArray A) {
ID.AddInteger(A.size());
for (const Node *N : A)
@@ -296,32 +307,16 @@ ItaniumManglingCanonicalizer::addEquivalence(FragmentKind Kind, StringRef First,
return EquivalenceError::Success;
}
-static ItaniumManglingCanonicalizer::Key
-parseMaybeMangledName(CanonicalizingDemangler &Demangler, StringRef Mangling,
- bool CreateNewNodes) {
- Demangler.ASTAllocator.setCreateNewNodes(CreateNewNodes);
- Demangler.reset(Mangling.begin(), Mangling.end());
- // Attempt demangling only for names that look like C++ mangled names.
- // Otherwise, treat them as extern "C" names. We permit the latter to
- // be remapped by (eg)
- // encoding 6memcpy 7memmove
- // consistent with how they are encoded as local-names inside a C++ mangling.
- Node *N;
- if (Mangling.startswith("_Z") || Mangling.startswith("__Z") ||
- Mangling.startswith("___Z") || Mangling.startswith("____Z"))
- N = Demangler.parse();
- else
- N = Demangler.make<itanium_demangle::NameType>(
- StringView(Mangling.data(), Mangling.size()));
- return reinterpret_cast<ItaniumManglingCanonicalizer::Key>(N);
-}
-
ItaniumManglingCanonicalizer::Key
ItaniumManglingCanonicalizer::canonicalize(StringRef Mangling) {
- return parseMaybeMangledName(P->Demangler, Mangling, true);
+ P->Demangler.ASTAllocator.setCreateNewNodes(true);
+ P->Demangler.reset(Mangling.begin(), Mangling.end());
+ return reinterpret_cast<Key>(P->Demangler.parse());
}
ItaniumManglingCanonicalizer::Key
ItaniumManglingCanonicalizer::lookup(StringRef Mangling) {
- return parseMaybeMangledName(P->Demangler, Mangling, false);
+ P->Demangler.ASTAllocator.setCreateNewNodes(false);
+ P->Demangler.reset(Mangling.begin(), Mangling.end());
+ return reinterpret_cast<Key>(P->Demangler.parse());
}