diff options
author | Peter Rong <peterrong96@gmail.com> | 2025-04-30 09:37:55 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-04-30 09:37:55 -0700 |
commit | 0bd992a8d7193e15191f14a4bd39fd4dd181dbdb (patch) | |
tree | 06c4b5b3a3b225dcd6d7bf0100b4a094365f8ef2 /clang/lib/AST/Mangle.cpp | |
parent | d7f096e3fe611ae2cc7403c3cf2f88255a47b61d (diff) | |
download | llvm-0bd992a8d7193e15191f14a4bd39fd4dd181dbdb.zip llvm-0bd992a8d7193e15191f14a4bd39fd4dd181dbdb.tar.gz llvm-0bd992a8d7193e15191f14a4bd39fd4dd181dbdb.tar.bz2 |
[clang AST] move mangling API to namespace clang to allow calls from swift-frontend (#137884)
When implementing `@objcDirect` in Swift, Swift needs to mangle a native
`Decl` that is not a clang Node, which in turn don't have access to
`clang::MangleContext`. Reimplementing mangling logic in Swift is
redundant.
This patch moves mangling logic from `clang::MangleContext` to `clang`
using only basic types (`StringRef`, `std::optional`, etc.), such that
Swift can we can just call Clang API: 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.
---------
Signed-off-by: Peter Rong <PeterRong@meta.com>
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, |