aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/AST/Mangle.cpp
diff options
context:
space:
mode:
authorPeter Rong <peterrong96@gmail.com>2025-04-30 09:37:55 -0700
committerGitHub <noreply@github.com>2025-04-30 09:37:55 -0700
commit0bd992a8d7193e15191f14a4bd39fd4dd181dbdb (patch)
tree06c4b5b3a3b225dcd6d7bf0100b4a094365f8ef2 /clang/lib/AST/Mangle.cpp
parentd7f096e3fe611ae2cc7403c3cf2f88255a47b61d (diff)
downloadllvm-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.cpp37
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,