[clang] 98ef7e2 - This reduces code duplication between CGObjCMac.cpp and Mangle.cpp
John McCall via cfe-commits
cfe-commits at lists.llvm.org
Mon Sep 28 23:26:59 PDT 2020
Author: Ellis Hoag
Date: 2020-09-29T02:26:51-04:00
New Revision: 98ef7e29b0fe03da77fa6ef5c86bea9e31c178d0
URL: https://github.com/llvm/llvm-project/commit/98ef7e29b0fe03da77fa6ef5c86bea9e31c178d0
DIFF: https://github.com/llvm/llvm-project/commit/98ef7e29b0fe03da77fa6ef5c86bea9e31c178d0.diff
LOG: 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.
https://reviews.llvm.org/D88329
Added:
Modified:
clang/include/clang/AST/Mangle.h
clang/lib/AST/ItaniumMangle.cpp
clang/lib/AST/Mangle.cpp
clang/lib/AST/MicrosoftMangle.cpp
clang/lib/CodeGen/CGObjCMac.cpp
Removed:
################################################################################
diff --git a/clang/include/clang/AST/Mangle.h b/clang/include/clang/AST/Mangle.h
index 011d1faab8ea..f7c412283a8b 100644
--- a/clang/include/clang/AST/Mangle.h
+++ b/clang/include/clang/AST/Mangle.h
@@ -123,8 +123,11 @@ class MangleContext {
void mangleBlock(const DeclContext *DC, const BlockDecl *BD,
raw_ostream &Out);
- void mangleObjCMethodNameWithoutSize(const ObjCMethodDecl *MD, raw_ostream &);
- void mangleObjCMethodName(const ObjCMethodDecl *MD, raw_ostream &);
+ void mangleObjCMethodName(const ObjCMethodDecl *MD, raw_ostream &OS,
+ bool includePrefixByte = true,
+ bool includeCategoryNamespace = true);
+ void mangleObjCMethodNameAsSourceName(const ObjCMethodDecl *MD,
+ raw_ostream &);
virtual void mangleStaticGuardVariable(const VarDecl *D, raw_ostream &) = 0;
diff --git a/clang/lib/AST/ItaniumMangle.cpp b/clang/lib/AST/ItaniumMangle.cpp
index eb3aa807f63a..076d40dd6c58 100644
--- a/clang/lib/AST/ItaniumMangle.cpp
+++ b/clang/lib/AST/ItaniumMangle.cpp
@@ -2516,7 +2516,7 @@ void CXXNameMangler::mangleRefQualifier(RefQualifierKind RefQualifier) {
}
void CXXNameMangler::mangleObjCMethodName(const ObjCMethodDecl *MD) {
- Context.mangleObjCMethodName(MD, Out);
+ Context.mangleObjCMethodNameAsSourceName(MD, Out);
}
static bool isTypeSubstitutable(Qualifiers Quals, const Type *Ty,
diff --git a/clang/lib/AST/Mangle.cpp b/clang/lib/AST/Mangle.cpp
index a732325006c6..a67f57688e30 100644
--- a/clang/lib/AST/Mangle.cpp
+++ b/clang/lib/AST/Mangle.cpp
@@ -175,7 +175,7 @@ void MangleContext::mangleName(GlobalDecl GD, raw_ostream &Out) {
const TargetInfo &TI = Context.getTargetInfo();
if (CC == CCM_Other || (MCXX && TI.getCXXABI() == TargetCXXABI::Microsoft)) {
if (const ObjCMethodDecl *OMD = dyn_cast<ObjCMethodDecl>(D))
- mangleObjCMethodName(OMD, Out);
+ mangleObjCMethodNameAsSourceName(OMD, Out);
else
mangleCXXName(GD, Out);
return;
@@ -192,7 +192,7 @@ void MangleContext::mangleName(GlobalDecl GD, raw_ostream &Out) {
if (!MCXX)
Out << D->getIdentifier()->getName();
else if (const ObjCMethodDecl *OMD = dyn_cast<ObjCMethodDecl>(D))
- mangleObjCMethodName(OMD, Out);
+ mangleObjCMethodNameAsSourceName(OMD, Out);
else
mangleCXXName(GD, Out);
@@ -275,7 +275,7 @@ void MangleContext::mangleBlock(const DeclContext *DC, const BlockDecl *BD,
SmallString<64> Buffer;
llvm::raw_svector_ostream Stream(Buffer);
if (const ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(DC)) {
- mangleObjCMethodName(Method, Stream);
+ mangleObjCMethodNameAsSourceName(Method, Stream);
} else {
assert((isa<NamedDecl>(DC) || isa<BlockDecl>(DC)) &&
"expected a NamedDecl or BlockDecl");
@@ -304,29 +304,38 @@ void MangleContext::mangleBlock(const DeclContext *DC, const BlockDecl *BD,
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::mangleObjCMethodName(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 (const auto *CID = dyn_cast<ObjCCategoryImplDecl>(MD->getDeclContext())) {
OS << CID->getClassInterface()->getName();
- OS << '(' << *CID << ')';
- } else {
+ if (includeCategoryNamespace) {
+ OS << '(' << *CID << ')';
+ }
+ } else if (const auto *CD =
+ dyn_cast<ObjCContainerDecl>(MD->getDeclContext())) {
OS << CD->getName();
+ } else {
+ llvm_unreachable("Unexpected ObjC method decl context");
}
OS << ' ';
MD->getSelector().print(OS);
OS << ']';
}
-void MangleContext::mangleObjCMethodName(const ObjCMethodDecl *MD,
- raw_ostream &Out) {
+void MangleContext::mangleObjCMethodNameAsSourceName(const ObjCMethodDecl *MD,
+ raw_ostream &Out) {
SmallString<64> Name;
llvm::raw_svector_ostream OS(Name);
- mangleObjCMethodNameWithoutSize(MD, OS);
+ mangleObjCMethodName(MD, OS, /*includePrefixByte=*/false,
+ /*includeCategoryNamespace=*/true);
Out << OS.str().size() << OS.str();
}
@@ -352,7 +361,8 @@ class ASTNameGenerator::Implementation {
if (writeFuncOrVarName(VD, FrontendBufOS))
return true;
} else if (auto *MD = dyn_cast<ObjCMethodDecl>(D)) {
- MC->mangleObjCMethodNameWithoutSize(MD, OS);
+ MC->mangleObjCMethodName(MD, OS, /*includePrefixByte=*/false,
+ /*includeCategoryNamespace=*/true);
return false;
} else if (auto *ID = dyn_cast<ObjCInterfaceDecl>(D)) {
writeObjCClassName(ID, FrontendBufOS);
diff --git a/clang/lib/AST/MicrosoftMangle.cpp b/clang/lib/AST/MicrosoftMangle.cpp
index 376b17dc7995..f6e6fefe98d2 100644
--- a/clang/lib/AST/MicrosoftMangle.cpp
+++ b/clang/lib/AST/MicrosoftMangle.cpp
@@ -1323,7 +1323,7 @@ void MicrosoftCXXNameMangler::mangleSourceName(StringRef Name) {
}
void MicrosoftCXXNameMangler::mangleObjCMethodName(const ObjCMethodDecl *MD) {
- Context.mangleObjCMethodName(MD, Out);
+ Context.mangleObjCMethodNameAsSourceName(MD, Out);
}
void MicrosoftCXXNameMangler::mangleTemplateInstantiationName(
diff --git a/clang/lib/CodeGen/CGObjCMac.cpp b/clang/lib/CodeGen/CGObjCMac.cpp
index 5922c63e0116..e2f4cabce278 100644
--- a/clang/lib/CodeGen/CGObjCMac.cpp
+++ b/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 @@ class CGObjCCommonMac : public CodeGen::CGObjCRuntime {
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 @@ llvm::Function *CGObjCCommonMac::GenerateMethod(const ObjCMethodDecl *OMD,
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->mangleObjCMethodName(OMD, OS, /*includePrefixByte=*/true,
+ /*includeCategoryNamespace=*/true);
CodeGenTypes &Types = CGM.getTypes();
llvm::FunctionType *MethodTy =
@@ -4061,7 +4058,10 @@ CGObjCCommonMac::GenerateDirectMethod(const ObjCMethodDecl *OMD,
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->mangleObjCMethodName(OMD, OS, /*includePrefixByte=*/true,
+ /*includeCategoryNamespace=*/false);
Fn = llvm::Function::Create(MethodTy, llvm::GlobalValue::ExternalLinkage,
Name.str(), &CGM.getModule());
@@ -5715,21 +5715,6 @@ CGObjCCommonMac::GetPropertyTypeString(const ObjCPropertyDecl *PD,
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();
More information about the cfe-commits
mailing list