ellis created this revision.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.
ellis requested review of this revision.
This reduces code duplication between CGObjCMac.cpp and Mangle.cpp for
generating the mangled name of an Objective-C method.
This has no intended functionality change.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D88329
Files:
clang/include/clang/AST/Mangle.h
clang/lib/AST/Mangle.cpp
clang/lib/CodeGen/CGObjCMac.cpp
Index: clang/lib/CodeGen/CGObjCMac.cpp
===================================================================
--- clang/lib/CodeGen/CGObjCMac.cpp
+++ clang/lib/CodeGen/CGObjCMac.cpp
@@ -20,6 +20,7 @@
#include "clang/AST/Attr.h"
#include "clang/AST/Decl.h"
#include "clang/AST/DeclObjC.h"
+#include "clang/AST/Mangle.h"
#include "clang/AST/RecordLayout.h"
#include "clang/AST/StmtObjC.h"
#include "clang/Basic/CodeGenOptions.h"
@@ -924,13 +925,6 @@
llvm::StringMap<llvm::GlobalVariable *> NSConstantStringMap;
- /// GetNameForMethod - Return a name for the given method.
- /// \param[out] NameOut - The return value.
- void GetNameForMethod(const ObjCMethodDecl *OMD,
- const ObjCContainerDecl *CD,
- SmallVectorImpl<char> &NameOut,
- bool ignoreCategoryNamespace = false);
-
/// GetMethodVarName - Return a unique constant for the given
/// selector's name. The return value has type char *.
llvm::Constant *GetMethodVarName(Selector Sel);
@@ -4008,7 +4002,10 @@
Method = GenerateDirectMethod(OMD, CD);
} else {
SmallString<256> Name;
- GetNameForMethod(OMD, CD, Name);
+ llvm::raw_svector_ostream OS(Name);
+ const auto &MC = CGM.getContext().createMangleContext();
+ MC->mangleObjCMethodNameWithoutSize(OMD, OS, /*includePrefixByte=*/true,
+ /*includeCategoryNamespace=*/true);
CodeGenTypes &Types = CGM.getTypes();
llvm::FunctionType *MethodTy =
@@ -4061,7 +4058,10 @@
I->second = Fn;
} else {
SmallString<256> Name;
- GetNameForMethod(OMD, CD, Name, /*ignoreCategoryNamespace*/ true);
+ llvm::raw_svector_ostream OS(Name);
+ const auto &MC = CGM.getContext().createMangleContext();
+ MC->mangleObjCMethodNameWithoutSize(OMD, OS, /*includePrefixByte=*/true,
+ /*includeCategoryNamespace=*/false);
Fn = llvm::Function::Create(MethodTy, llvm::GlobalValue::ExternalLinkage,
Name.str(), &CGM.getModule());
@@ -5715,21 +5715,6 @@
return GetPropertyName(&CGM.getContext().Idents.get(TypeStr));
}
-void CGObjCCommonMac::GetNameForMethod(const ObjCMethodDecl *D,
- const ObjCContainerDecl *CD,
- SmallVectorImpl<char> &Name,
- bool ignoreCategoryNamespace) {
- llvm::raw_svector_ostream OS(Name);
- assert (CD && "Missing container decl in GetNameForMethod");
- OS << '\01' << (D->isInstanceMethod() ? '-' : '+')
- << '[' << CD->getName();
- if (!ignoreCategoryNamespace)
- if (const ObjCCategoryImplDecl *CID =
- dyn_cast<ObjCCategoryImplDecl>(D->getDeclContext()))
- OS << '(' << *CID << ')';
- OS << ' ' << D->getSelector().getAsString() << ']';
-}
-
void CGObjCMac::FinishModule() {
EmitModuleInfo();
Index: clang/lib/AST/Mangle.cpp
===================================================================
--- clang/lib/AST/Mangle.cpp
+++ clang/lib/AST/Mangle.cpp
@@ -304,17 +304,23 @@
mangleFunctionBlock(*this, Buffer, BD, Out);
}
-void MangleContext::mangleObjCMethodNameWithoutSize(const ObjCMethodDecl *MD,
- raw_ostream &OS) {
- const ObjCContainerDecl *CD =
- dyn_cast<ObjCContainerDecl>(MD->getDeclContext());
- assert (CD && "Missing container decl in GetNameForMethod");
+void MangleContext::mangleObjCMethodNameWithoutSize(
+ const ObjCMethodDecl *MD, raw_ostream &OS, bool includePrefixByte,
+ bool includeCategoryNamespace) {
+ // \01+[ContainerName(CategoryName) SelectorName]
+ if (includePrefixByte) {
+ OS << '\01';
+ }
OS << (MD->isInstanceMethod() ? '-' : '+') << '[';
- if (const ObjCCategoryImplDecl *CID = dyn_cast<ObjCCategoryImplDecl>(CD)) {
+ if (auto *CID = dyn_cast<ObjCCategoryImplDecl>(MD->getDeclContext())) {
OS << CID->getClassInterface()->getName();
- OS << '(' << *CID << ')';
- } else {
+ if (includeCategoryNamespace) {
+ OS << '(' << *CID << ')';
+ }
+ } else if (auto *CD = dyn_cast<ObjCContainerDecl>(MD->getDeclContext())) {
OS << CD->getName();
+ } else {
+ assert(false && "Unexpected ObjC method decl context");
}
OS << ' ';
MD->getSelector().print(OS);
@@ -326,7 +332,8 @@
SmallString<64> Name;
llvm::raw_svector_ostream OS(Name);
- mangleObjCMethodNameWithoutSize(MD, OS);
+ mangleObjCMethodNameWithoutSize(MD, OS, /*includePrefixByte=*/false,
+ /*includeCategoryNamespace=*/true);
Out << OS.str().size() << OS.str();
}
@@ -352,7 +359,8 @@
if (writeFuncOrVarName(VD, FrontendBufOS))
return true;
} else if (auto *MD = dyn_cast<ObjCMethodDecl>(D)) {
- MC->mangleObjCMethodNameWithoutSize(MD, OS);
+ MC->mangleObjCMethodNameWithoutSize(MD, OS, /*includePrefixByte=*/false,
+ /*includeCategoryNamespace=*/true);
return false;
} else if (auto *ID = dyn_cast<ObjCInterfaceDecl>(D)) {
writeObjCClassName(ID, FrontendBufOS);
Index: clang/include/clang/AST/Mangle.h
===================================================================
--- clang/include/clang/AST/Mangle.h
+++ clang/include/clang/AST/Mangle.h
@@ -123,7 +123,10 @@
void mangleBlock(const DeclContext *DC, const BlockDecl *BD,
raw_ostream &Out);
- void mangleObjCMethodNameWithoutSize(const ObjCMethodDecl *MD, raw_ostream &);
+ void mangleObjCMethodNameWithoutSize(const ObjCMethodDecl *Method,
+ raw_ostream &OS,
+ bool includePrefixByte = true,
+ bool includeCategoryNamespace = true);
void mangleObjCMethodName(const ObjCMethodDecl *MD, raw_ostream &);
virtual void mangleStaticGuardVariable(const VarDecl *D, raw_ostream &) = 0;
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits