diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2017-12-20 14:26:54 +0000 |
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2017-12-20 14:26:54 +0000 |
| commit | 9a199699c2fd227dae8c1ff60a70c819e9d4fdfe (patch) | |
| tree | 1953a1b292c4637ca2a5ede1494d3a5b84cccac3 /contrib/llvm/tools/clang/lib/Index/CodegenNameGenerator.cpp | |
| parent | 2cab237b5dbfe1b3e9c7aa7a3c02d2b98fcf7462 (diff) | |
| parent | 461a67fa15370a9ec88f8f8a240bf7c123bb2029 (diff) | |
Notes
Diffstat (limited to 'contrib/llvm/tools/clang/lib/Index/CodegenNameGenerator.cpp')
| -rw-r--r-- | contrib/llvm/tools/clang/lib/Index/CodegenNameGenerator.cpp | 39 |
1 files changed, 36 insertions, 3 deletions
diff --git a/contrib/llvm/tools/clang/lib/Index/CodegenNameGenerator.cpp b/contrib/llvm/tools/clang/lib/Index/CodegenNameGenerator.cpp index 92740b05703b..bf52e2108baa 100644 --- a/contrib/llvm/tools/clang/lib/Index/CodegenNameGenerator.cpp +++ b/contrib/llvm/tools/clang/lib/Index/CodegenNameGenerator.cpp @@ -68,7 +68,38 @@ struct CodegenNameGenerator::Implementation { return Name; } + enum ObjCKind { + ObjCClass, + ObjCMetaclass, + }; + + std::vector<std::string> getAllManglings(const ObjCContainerDecl *OCD) { + StringRef ClassName; + if (const auto *OID = dyn_cast<ObjCInterfaceDecl>(OCD)) + ClassName = OID->getObjCRuntimeNameAsString(); + else if (const auto *OID = dyn_cast<ObjCImplementationDecl>(OCD)) + ClassName = OID->getObjCRuntimeNameAsString(); + + if (ClassName.empty()) + return {}; + + auto Mangle = [&](ObjCKind Kind, StringRef ClassName) -> std::string { + SmallString<40> Mangled; + auto Prefix = getClassSymbolPrefix(Kind, OCD->getASTContext()); + llvm::Mangler::getNameWithPrefix(Mangled, Prefix + ClassName, DL); + return Mangled.str(); + }; + + return { + Mangle(ObjCClass, ClassName), + Mangle(ObjCMetaclass, ClassName), + }; + } + std::vector<std::string> getAllManglings(const Decl *D) { + if (const auto *OCD = dyn_cast<ObjCContainerDecl>(D)) + return getAllManglings(OCD); + if (!(isa<CXXRecordDecl>(D) || isa<CXXMethodDecl>(D))) return {}; @@ -135,12 +166,14 @@ private: } void writeObjCClassName(const ObjCInterfaceDecl *D, raw_ostream &OS) { - OS << getClassSymbolPrefix(); + OS << getClassSymbolPrefix(ObjCClass, D->getASTContext()); OS << D->getObjCRuntimeNameAsString(); } - static StringRef getClassSymbolPrefix() { - return "OBJC_CLASS_$_"; + static StringRef getClassSymbolPrefix(ObjCKind Kind, const ASTContext &Context) { + if (Context.getLangOpts().ObjCRuntime.isGNUFamily()) + return Kind == ObjCMetaclass ? "_OBJC_METACLASS_" : "_OBJC_CLASS_"; + return Kind == ObjCMetaclass ? "OBJC_METACLASS_$_" : "OBJC_CLASS_$_"; } std::string getMangledStructor(const NamedDecl *ND, unsigned StructorType) { |
