forked from OSchip/llvm-project
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
This commit is contained in:
parent
bc868da0e7
commit
98ef7e29b0
|
@ -123,8 +123,11 @@ public:
|
|||
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;
|
||||
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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 @@ public:
|
|||
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);
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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 @@ protected:
|
|||
|
||||
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();
|
||||
|
||||
|
|
Loading…
Reference in New Issue