aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Support/ItaniumManglingCanonicalizer.cpp
diff options
context:
space:
mode:
authorRichard Smith <richard@metafoo.co.uk>2019-12-18 10:44:29 -0800
committerRichard Smith <richard@metafoo.co.uk>2019-12-18 10:47:02 -0800
commitb6e90a1a1093210784ed3614b51ebcc31c2a1dcf (patch)
treecdbfdf3f040b04eb151b5b92952db95ed6a3487d /llvm/lib/Support/ItaniumManglingCanonicalizer.cpp
parentcfe316007fb8492535d697717c24ce72621a8d5e (diff)
downloadllvm-b6e90a1a1093210784ed3614b51ebcc31c2a1dcf.zip
llvm-b6e90a1a1093210784ed3614b51ebcc31c2a1dcf.tar.gz
llvm-b6e90a1a1093210784ed3614b51ebcc31c2a1dcf.tar.bz2
llvm-cxxmap: fix support for remapping non-mangled names.
Remappings involving extern "C" names were already supported in the context of <local-name>s, but this support didn't work for remapping the complete mangling itself. (Eg, we would remap X<foo> but not foo itself, if foo is an extern "C" function.)
Diffstat (limited to 'llvm/lib/Support/ItaniumManglingCanonicalizer.cpp')
-rw-r--r--llvm/lib/Support/ItaniumManglingCanonicalizer.cpp28
1 files changed, 22 insertions, 6 deletions
diff --git a/llvm/lib/Support/ItaniumManglingCanonicalizer.cpp b/llvm/lib/Support/ItaniumManglingCanonicalizer.cpp
index 3db27c3..bbc06d1 100644
--- a/llvm/lib/Support/ItaniumManglingCanonicalizer.cpp
+++ b/llvm/lib/Support/ItaniumManglingCanonicalizer.cpp
@@ -296,16 +296,32 @@ 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) {
- P->Demangler.ASTAllocator.setCreateNewNodes(true);
- P->Demangler.reset(Mangling.begin(), Mangling.end());
- return reinterpret_cast<Key>(P->Demangler.parse());
+ return parseMaybeMangledName(P->Demangler, Mangling, true);
}
ItaniumManglingCanonicalizer::Key
ItaniumManglingCanonicalizer::lookup(StringRef Mangling) {
- P->Demangler.ASTAllocator.setCreateNewNodes(false);
- P->Demangler.reset(Mangling.begin(), Mangling.end());
- return reinterpret_cast<Key>(P->Demangler.parse());
+ return parseMaybeMangledName(P->Demangler, Mangling, false);
}