llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang Author: Peter Rong (DataCorrupted) <details> <summary>Changes</summary> When implementing `@<!-- -->objcDirect` in Swfit, Swift needs to mangle a `Decl` that is not a clang Node. Rewriting the ObjC's mangling logic in swift is redundant, we can just call clang API since swift depends on clang already. We are separating this from #<!-- -->126639 so we can draft the proposal on the swift side. #<!-- -->126639 will be worked to depend on this PR. Tests: No new tests, old ones should pass with no problem. --- Full diff: https://github.com/llvm/llvm-project/pull/137884.diff 2 Files Affected: - (modified) clang/include/clang/AST/Mangle.h (+7) - (modified) clang/lib/AST/Mangle.cpp (+27-10) ``````````diff diff --git a/clang/include/clang/AST/Mangle.h b/clang/include/clang/AST/Mangle.h index a0162fb7125fe..1afbf80df40cf 100644 --- a/clang/include/clang/AST/Mangle.h +++ b/clang/include/clang/AST/Mangle.h @@ -40,6 +40,13 @@ struct ThisAdjustment; struct ThunkInfo; class VarDecl; +/// Extract mangling function name from MangleContext such that swift can call +/// it to prepare for ObjCDirect in swift. +void mangleObjCMethodName(raw_ostream &OS, bool includePrefixByte, + bool isInstanceMethod, StringRef ClassName, + std::optional<StringRef> CategoryName, + StringRef MethodName); + /// MangleContext - Context for tracking state which persists across multiple /// calls to the C++ name mangler. class MangleContext { diff --git a/clang/lib/AST/Mangle.cpp b/clang/lib/AST/Mangle.cpp index 741c031a40385..9652fdbc4e125 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, `````````` </details> https://github.com/llvm/llvm-project/pull/137884 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits