diff options
Diffstat (limited to 'clang/lib/AST/Mangle.cpp')
-rw-r--r-- | clang/lib/AST/Mangle.cpp | 37 |
1 files changed, 27 insertions, 10 deletions
diff --git a/clang/lib/AST/Mangle.cpp b/clang/lib/AST/Mangle.cpp index 741c031..9652fdb 100644 --- a/clang/lib/AST/Mangle.cpp +++ b/clang/lib/AST/Mangle.cpp @@ -29,6 +29,23 @@ using namespace clang; +void clang::mangleObjCMethodName(raw_ostream &OS, bool includePrefixByte, + bool isInstanceMethod, StringRef ClassName, + std::optional<StringRef> CategoryName, + StringRef MethodName) { + // \01+[ContainerName(CategoryName) SelectorName] + if (includePrefixByte) + OS << "\01"; + OS << (isInstanceMethod ? '-' : '+'); + OS << '['; + OS << ClassName; + if (CategoryName) + OS << "(" << *CategoryName << ")"; + OS << " "; + OS << MethodName; + OS << ']'; +} + // FIXME: For blocks we currently mimic GCC's mangling scheme, which leaves // much to be desired. Come up with a better mangling scheme. @@ -362,26 +379,26 @@ void MangleContext::mangleObjCMethodName(const ObjCMethodDecl *MD, } // \01+[ContainerName(CategoryName) SelectorName] - if (includePrefixByte) { - OS << '\01'; - } - OS << (MD->isInstanceMethod() ? '-' : '+') << '['; + auto CategoryName = std::optional<StringRef>(); + StringRef ClassName = ""; if (const auto *CID = MD->getCategory()) { if (const auto *CI = CID->getClassInterface()) { - OS << CI->getName(); + ClassName = CI->getName(); if (includeCategoryNamespace) { - OS << '(' << *CID << ')'; + CategoryName = CID->getName(); } } } else if (const auto *CD = dyn_cast<ObjCContainerDecl>(MD->getDeclContext())) { - OS << CD->getName(); + ClassName = CD->getName(); } else { llvm_unreachable("Unexpected ObjC method decl context"); } - OS << ' '; - MD->getSelector().print(OS); - OS << ']'; + std::string MethodName; + llvm::raw_string_ostream MethodNameOS(MethodName); + MD->getSelector().print(MethodNameOS); + clang::mangleObjCMethodName(OS, includePrefixByte, MD->isInstanceMethod(), + ClassName, CategoryName, MethodName); } void MangleContext::mangleObjCMethodNameAsSourceName(const ObjCMethodDecl *MD, |