r363908 - [clang][AST] Refactoring ASTNameGenerator to use pimpl pattern (NFC).
Puyan Lotfi via cfe-commits
cfe-commits at lists.llvm.org
Wed Jun 19 23:01:06 PDT 2019
Author: zer0
Date: Wed Jun 19 23:01:06 2019
New Revision: 363908
URL: http://llvm.org/viewvc/llvm-project?rev=363908&view=rev
Log:
[clang][AST] Refactoring ASTNameGenerator to use pimpl pattern (NFC).
The original pimpl pattern used between CodegenNameGenerator and
CodegenNameGeneratorImpl did a good job of hiding DataLayout making it so that
users of CodegenNameGenerator did not need to link with llvm core. This is an
NFC change to neatly wrap ASTNameGenerator in a pimpl.
Differential Revision: https://reviews.llvm.org/D63584
Modified:
cfe/trunk/include/clang/AST/Mangle.h
cfe/trunk/lib/AST/Mangle.cpp
Modified: cfe/trunk/include/clang/AST/Mangle.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/Mangle.h?rev=363908&r1=363907&r2=363908&view=diff
==============================================================================
--- cfe/trunk/include/clang/AST/Mangle.h (original)
+++ cfe/trunk/include/clang/AST/Mangle.h Wed Jun 19 23:01:06 2019
@@ -17,7 +17,6 @@
#include "clang/AST/Type.h"
#include "clang/Basic/ABI.h"
#include "llvm/ADT/DenseMap.h"
-#include "llvm/IR/DataLayout.h"
#include "llvm/Support/Casting.h"
namespace llvm {
@@ -246,21 +245,16 @@ public:
};
class ASTNameGenerator {
- std::unique_ptr<MangleContext> MC;
- llvm::DataLayout DL;
-
public:
explicit ASTNameGenerator(ASTContext &Ctx);
+ ~ASTNameGenerator();
bool writeName(const Decl *D, raw_ostream &OS);
std::string getName(const Decl *D);
std::vector<std::string> getAllManglings(const Decl *D);
private:
- std::vector<std::string> getAllManglings(const ObjCContainerDecl *OCD);
- bool writeFuncOrVarName(const NamedDecl *D, raw_ostream &OS);
- void writeObjCClassName(const ObjCInterfaceDecl *D, raw_ostream &OS);
- std::string getMangledStructor(const NamedDecl *ND, unsigned StructorType);
- std::string getMangledThunk(const CXXMethodDecl *MD, const ThunkInfo &T);
+ class Implementation;
+ std::unique_ptr<Implementation> Impl;
};
}
Modified: cfe/trunk/lib/AST/Mangle.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/Mangle.cpp?rev=363908&r1=363907&r2=363908&view=diff
==============================================================================
--- cfe/trunk/lib/AST/Mangle.cpp (original)
+++ cfe/trunk/lib/AST/Mangle.cpp Wed Jun 19 23:01:06 2019
@@ -22,6 +22,7 @@
#include "clang/Basic/SourceManager.h"
#include "clang/Basic/TargetInfo.h"
#include "llvm/ADT/StringExtras.h"
+#include "llvm/IR/DataLayout.h"
#include "llvm/IR/Mangler.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/raw_ostream.h"
@@ -283,183 +284,204 @@ void MangleContext::mangleObjCMethodName
Out << OS.str().size() << OS.str();
}
-ASTNameGenerator::ASTNameGenerator(ASTContext &Ctx)
- : MC(Ctx.createMangleContext()), DL(Ctx.getTargetInfo().getDataLayout()) {}
-
-bool ASTNameGenerator::writeName(const Decl *D, raw_ostream &OS) {
- // First apply frontend mangling.
- SmallString<128> FrontendBuf;
- llvm::raw_svector_ostream FrontendBufOS(FrontendBuf);
- if (auto *FD = dyn_cast<FunctionDecl>(D)) {
- if (FD->isDependentContext())
+class ASTNameGenerator::Implementation {
+ std::unique_ptr<MangleContext> MC;
+ llvm::DataLayout DL;
+
+public:
+ explicit Implementation(ASTContext &Ctx)
+ : MC(Ctx.createMangleContext()), DL(Ctx.getTargetInfo().getDataLayout()) {
+ }
+
+ bool writeName(const Decl *D, raw_ostream &OS) {
+ // First apply frontend mangling.
+ SmallString<128> FrontendBuf;
+ llvm::raw_svector_ostream FrontendBufOS(FrontendBuf);
+ if (auto *FD = dyn_cast<FunctionDecl>(D)) {
+ if (FD->isDependentContext())
+ return true;
+ if (writeFuncOrVarName(FD, FrontendBufOS))
+ return true;
+ } else if (auto *VD = dyn_cast<VarDecl>(D)) {
+ if (writeFuncOrVarName(VD, FrontendBufOS))
+ return true;
+ } else if (auto *MD = dyn_cast<ObjCMethodDecl>(D)) {
+ MC->mangleObjCMethodNameWithoutSize(MD, OS);
+ return false;
+ } else if (auto *ID = dyn_cast<ObjCInterfaceDecl>(D)) {
+ writeObjCClassName(ID, FrontendBufOS);
+ } else {
return true;
- if (writeFuncOrVarName(FD, FrontendBufOS))
- return true;
- } else if (auto *VD = dyn_cast<VarDecl>(D)) {
- if (writeFuncOrVarName(VD, FrontendBufOS))
- return true;
- } else if (auto *MD = dyn_cast<ObjCMethodDecl>(D)) {
- MC->mangleObjCMethodNameWithoutSize(MD, OS);
+ }
+
+ // Now apply backend mangling.
+ llvm::Mangler::getNameWithPrefix(OS, FrontendBufOS.str(), DL);
return false;
- } else if (auto *ID = dyn_cast<ObjCInterfaceDecl>(D)) {
- writeObjCClassName(ID, FrontendBufOS);
- } else {
- return true;
}
- // Now apply backend mangling.
- llvm::Mangler::getNameWithPrefix(OS, FrontendBufOS.str(), DL);
- return false;
-}
-
-std::string ASTNameGenerator::getName(const Decl *D) {
- std::string Name;
- {
- llvm::raw_string_ostream OS(Name);
- writeName(D, OS);
+ std::string getName(const Decl *D) {
+ std::string Name;
+ {
+ llvm::raw_string_ostream OS(Name);
+ writeName(D, OS);
+ }
+ return Name;
}
- return Name;
-}
-enum ObjCKind {
- ObjCClass,
- ObjCMetaclass,
-};
-
-static StringRef getClassSymbolPrefix(ObjCKind Kind,
- const ASTContext &Context) {
- if (Context.getLangOpts().ObjCRuntime.isGNUFamily())
- return Kind == ObjCMetaclass ? "_OBJC_METACLASS_" : "_OBJC_CLASS_";
- return Kind == ObjCMetaclass ? "OBJC_METACLASS_$_" : "OBJC_CLASS_$_";
-}
-
-std::vector<std::string>
-ASTNameGenerator::getAllManglings(const ObjCContainerDecl *OCD) {
- StringRef ClassName;
- if (const auto *OID = dyn_cast<ObjCInterfaceDecl>(OCD))
- ClassName = OID->getObjCRuntimeNameAsString();
- else if (const auto *OID = dyn_cast<ObjCImplementationDecl>(OCD))
- ClassName = OID->getObjCRuntimeNameAsString();
-
- if (ClassName.empty())
- return {};
-
- auto Mangle = [&](ObjCKind Kind, StringRef ClassName) -> std::string {
- SmallString<40> Mangled;
- auto Prefix = getClassSymbolPrefix(Kind, OCD->getASTContext());
- llvm::Mangler::getNameWithPrefix(Mangled, Prefix + ClassName, DL);
- return Mangled.str();
+ enum ObjCKind {
+ ObjCClass,
+ ObjCMetaclass,
};
- return {
- Mangle(ObjCClass, ClassName),
- Mangle(ObjCMetaclass, ClassName),
- };
-}
+ static StringRef getClassSymbolPrefix(ObjCKind Kind,
+ const ASTContext &Context) {
+ if (Context.getLangOpts().ObjCRuntime.isGNUFamily())
+ return Kind == ObjCMetaclass ? "_OBJC_METACLASS_" : "_OBJC_CLASS_";
+ return Kind == ObjCMetaclass ? "OBJC_METACLASS_$_" : "OBJC_CLASS_$_";
+ }
+
+ std::vector<std::string> getAllManglings(const ObjCContainerDecl *OCD) {
+ StringRef ClassName;
+ if (const auto *OID = dyn_cast<ObjCInterfaceDecl>(OCD))
+ ClassName = OID->getObjCRuntimeNameAsString();
+ else if (const auto *OID = dyn_cast<ObjCImplementationDecl>(OCD))
+ ClassName = OID->getObjCRuntimeNameAsString();
+
+ if (ClassName.empty())
+ return {};
+
+ auto Mangle = [&](ObjCKind Kind, StringRef ClassName) -> std::string {
+ SmallString<40> Mangled;
+ auto Prefix = getClassSymbolPrefix(Kind, OCD->getASTContext());
+ llvm::Mangler::getNameWithPrefix(Mangled, Prefix + ClassName, DL);
+ return Mangled.str();
+ };
+
+ return {
+ Mangle(ObjCClass, ClassName),
+ Mangle(ObjCMetaclass, ClassName),
+ };
+ }
+
+ std::vector<std::string> getAllManglings(const Decl *D) {
+ if (const auto *OCD = dyn_cast<ObjCContainerDecl>(D))
+ return getAllManglings(OCD);
+
+ if (!(isa<CXXRecordDecl>(D) || isa<CXXMethodDecl>(D)))
+ return {};
+
+ const NamedDecl *ND = cast<NamedDecl>(D);
+
+ ASTContext &Ctx = ND->getASTContext();
+ std::unique_ptr<MangleContext> M(Ctx.createMangleContext());
+
+ std::vector<std::string> Manglings;
+
+ auto hasDefaultCXXMethodCC = [](ASTContext &C, const CXXMethodDecl *MD) {
+ auto DefaultCC = C.getDefaultCallingConvention(/*IsVariadic=*/false,
+ /*IsCSSMethod=*/true);
+ auto CC = MD->getType()->getAs<FunctionProtoType>()->getCallConv();
+ return CC == DefaultCC;
+ };
+
+ if (const auto *CD = dyn_cast_or_null<CXXConstructorDecl>(ND)) {
+ Manglings.emplace_back(getMangledStructor(CD, Ctor_Base));
+
+ if (Ctx.getTargetInfo().getCXXABI().isItaniumFamily())
+ if (!CD->getParent()->isAbstract())
+ Manglings.emplace_back(getMangledStructor(CD, Ctor_Complete));
+
+ if (Ctx.getTargetInfo().getCXXABI().isMicrosoft())
+ if (CD->hasAttr<DLLExportAttr>() && CD->isDefaultConstructor())
+ if (!(hasDefaultCXXMethodCC(Ctx, CD) && CD->getNumParams() == 0))
+ Manglings.emplace_back(getMangledStructor(CD, Ctor_DefaultClosure));
+ } else if (const auto *DD = dyn_cast_or_null<CXXDestructorDecl>(ND)) {
+ Manglings.emplace_back(getMangledStructor(DD, Dtor_Base));
+ if (Ctx.getTargetInfo().getCXXABI().isItaniumFamily()) {
+ Manglings.emplace_back(getMangledStructor(DD, Dtor_Complete));
+ if (DD->isVirtual())
+ Manglings.emplace_back(getMangledStructor(DD, Dtor_Deleting));
+ }
+ } else if (const auto *MD = dyn_cast_or_null<CXXMethodDecl>(ND)) {
+ Manglings.emplace_back(getName(ND));
+ if (MD->isVirtual())
+ if (const auto *TIV = Ctx.getVTableContext()->getThunkInfo(MD))
+ for (const auto &T : *TIV)
+ Manglings.emplace_back(getMangledThunk(MD, T));
+ }
-std::vector<std::string> ASTNameGenerator::getAllManglings(const Decl *D) {
- if (const auto *OCD = dyn_cast<ObjCContainerDecl>(D))
- return getAllManglings(OCD);
+ return Manglings;
+ }
- if (!(isa<CXXRecordDecl>(D) || isa<CXXMethodDecl>(D)))
- return {};
+private:
+ bool writeFuncOrVarName(const NamedDecl *D, raw_ostream &OS) {
+ if (MC->shouldMangleDeclName(D)) {
+ if (const auto *CtorD = dyn_cast<CXXConstructorDecl>(D))
+ MC->mangleCXXCtor(CtorD, Ctor_Complete, OS);
+ else if (const auto *DtorD = dyn_cast<CXXDestructorDecl>(D))
+ MC->mangleCXXDtor(DtorD, Dtor_Complete, OS);
+ else
+ MC->mangleName(D, OS);
+ return false;
+ } else {
+ IdentifierInfo *II = D->getIdentifier();
+ if (!II)
+ return true;
+ OS << II->getName();
+ return false;
+ }
+ }
- const NamedDecl *ND = cast<NamedDecl>(D);
+ void writeObjCClassName(const ObjCInterfaceDecl *D, raw_ostream &OS) {
+ OS << getClassSymbolPrefix(ObjCClass, D->getASTContext());
+ OS << D->getObjCRuntimeNameAsString();
+ }
- ASTContext &Ctx = ND->getASTContext();
- std::unique_ptr<MangleContext> M(Ctx.createMangleContext());
+ std::string getMangledStructor(const NamedDecl *ND, unsigned StructorType) {
+ std::string FrontendBuf;
+ llvm::raw_string_ostream FOS(FrontendBuf);
- std::vector<std::string> Manglings;
+ if (const auto *CD = dyn_cast_or_null<CXXConstructorDecl>(ND))
+ MC->mangleCXXCtor(CD, static_cast<CXXCtorType>(StructorType), FOS);
+ else if (const auto *DD = dyn_cast_or_null<CXXDestructorDecl>(ND))
+ MC->mangleCXXDtor(DD, static_cast<CXXDtorType>(StructorType), FOS);
- auto hasDefaultCXXMethodCC = [](ASTContext &C, const CXXMethodDecl *MD) {
- auto DefaultCC = C.getDefaultCallingConvention(/*IsVariadic=*/false,
- /*IsCSSMethod=*/true);
- auto CC = MD->getType()->getAs<FunctionProtoType>()->getCallConv();
- return CC == DefaultCC;
- };
+ std::string BackendBuf;
+ llvm::raw_string_ostream BOS(BackendBuf);
- if (const auto *CD = dyn_cast_or_null<CXXConstructorDecl>(ND)) {
- Manglings.emplace_back(getMangledStructor(CD, Ctor_Base));
+ llvm::Mangler::getNameWithPrefix(BOS, FOS.str(), DL);
- if (Ctx.getTargetInfo().getCXXABI().isItaniumFamily())
- if (!CD->getParent()->isAbstract())
- Manglings.emplace_back(getMangledStructor(CD, Ctor_Complete));
-
- if (Ctx.getTargetInfo().getCXXABI().isMicrosoft())
- if (CD->hasAttr<DLLExportAttr>() && CD->isDefaultConstructor())
- if (!(hasDefaultCXXMethodCC(Ctx, CD) && CD->getNumParams() == 0))
- Manglings.emplace_back(getMangledStructor(CD, Ctor_DefaultClosure));
- } else if (const auto *DD = dyn_cast_or_null<CXXDestructorDecl>(ND)) {
- Manglings.emplace_back(getMangledStructor(DD, Dtor_Base));
- if (Ctx.getTargetInfo().getCXXABI().isItaniumFamily()) {
- Manglings.emplace_back(getMangledStructor(DD, Dtor_Complete));
- if (DD->isVirtual())
- Manglings.emplace_back(getMangledStructor(DD, Dtor_Deleting));
- }
- } else if (const auto *MD = dyn_cast_or_null<CXXMethodDecl>(ND)) {
- Manglings.emplace_back(getName(ND));
- if (MD->isVirtual())
- if (const auto *TIV = Ctx.getVTableContext()->getThunkInfo(MD))
- for (const auto &T : *TIV)
- Manglings.emplace_back(getMangledThunk(MD, T));
- }
-
- return Manglings;
-}
-
-bool ASTNameGenerator::writeFuncOrVarName(const NamedDecl *D, raw_ostream &OS) {
- if (MC->shouldMangleDeclName(D)) {
- if (const auto *CtorD = dyn_cast<CXXConstructorDecl>(D))
- MC->mangleCXXCtor(CtorD, Ctor_Complete, OS);
- else if (const auto *DtorD = dyn_cast<CXXDestructorDecl>(D))
- MC->mangleCXXDtor(DtorD, Dtor_Complete, OS);
- else
- MC->mangleName(D, OS);
- return false;
- } else {
- IdentifierInfo *II = D->getIdentifier();
- if (!II)
- return true;
- OS << II->getName();
- return false;
+ return BOS.str();
}
-}
-void ASTNameGenerator::writeObjCClassName(const ObjCInterfaceDecl *D,
- raw_ostream &OS) {
- OS << getClassSymbolPrefix(ObjCClass, D->getASTContext());
- OS << D->getObjCRuntimeNameAsString();
-}
-
-std::string ASTNameGenerator::getMangledStructor(const NamedDecl *ND,
- unsigned StructorType) {
- std::string FrontendBuf;
- llvm::raw_string_ostream FOS(FrontendBuf);
+ std::string getMangledThunk(const CXXMethodDecl *MD, const ThunkInfo &T) {
+ std::string FrontendBuf;
+ llvm::raw_string_ostream FOS(FrontendBuf);
- if (const auto *CD = dyn_cast_or_null<CXXConstructorDecl>(ND))
- MC->mangleCXXCtor(CD, static_cast<CXXCtorType>(StructorType), FOS);
- else if (const auto *DD = dyn_cast_or_null<CXXDestructorDecl>(ND))
- MC->mangleCXXDtor(DD, static_cast<CXXDtorType>(StructorType), FOS);
+ MC->mangleThunk(MD, T, FOS);
- std::string BackendBuf;
- llvm::raw_string_ostream BOS(BackendBuf);
+ std::string BackendBuf;
+ llvm::raw_string_ostream BOS(BackendBuf);
- llvm::Mangler::getNameWithPrefix(BOS, FOS.str(), DL);
+ llvm::Mangler::getNameWithPrefix(BOS, FOS.str(), DL);
- return BOS.str();
-}
+ return BOS.str();
+ }
+};
-std::string ASTNameGenerator::getMangledThunk(const CXXMethodDecl *MD,
- const ThunkInfo &T) {
- std::string FrontendBuf;
- llvm::raw_string_ostream FOS(FrontendBuf);
+ASTNameGenerator::ASTNameGenerator(ASTContext &Ctx)
+ : Impl(llvm::make_unique<Implementation>(Ctx)) {}
- MC->mangleThunk(MD, T, FOS);
+ASTNameGenerator::~ASTNameGenerator() {}
- std::string BackendBuf;
- llvm::raw_string_ostream BOS(BackendBuf);
+bool ASTNameGenerator::writeName(const Decl *D, raw_ostream &OS) {
+ return Impl->writeName(D, OS);
+}
- llvm::Mangler::getNameWithPrefix(BOS, FOS.str(), DL);
+std::string ASTNameGenerator::getName(const Decl *D) {
+ return Impl->getName(D);
+}
- return BOS.str();
+std::vector<std::string> ASTNameGenerator::getAllManglings(const Decl *D) {
+ return Impl->getAllManglings(D);
}
More information about the cfe-commits
mailing list