ModuleBuilder.cpp revision 280031
1193326Sed//===--- ModuleBuilder.cpp - Emit LLVM Code from ASTs ---------------------===// 2193326Sed// 3193326Sed// The LLVM Compiler Infrastructure 4193326Sed// 5193326Sed// This file is distributed under the University of Illinois Open Source 6193326Sed// License. See LICENSE.TXT for details. 7193326Sed// 8193326Sed//===----------------------------------------------------------------------===// 9193326Sed// 10193326Sed// This builds an AST and converts it to LLVM Code. 11193326Sed// 12193326Sed//===----------------------------------------------------------------------===// 13193326Sed 14193326Sed#include "clang/CodeGen/ModuleBuilder.h" 15276479Sdim#include "CGDebugInfo.h" 16193326Sed#include "CodeGenModule.h" 17193326Sed#include "clang/AST/ASTContext.h" 18193326Sed#include "clang/AST/DeclObjC.h" 19193326Sed#include "clang/AST/Expr.h" 20193326Sed#include "clang/Basic/Diagnostic.h" 21193326Sed#include "clang/Basic/TargetInfo.h" 22249423Sdim#include "clang/Frontend/CodeGenOptions.h" 23261991Sdim#include "llvm/ADT/StringRef.h" 24249423Sdim#include "llvm/IR/DataLayout.h" 25249423Sdim#include "llvm/IR/LLVMContext.h" 26249423Sdim#include "llvm/IR/Module.h" 27276479Sdim#include <memory> 28193326Sedusing namespace clang; 29193326Sed 30193326Sednamespace { 31199990Srdivacky class CodeGeneratorImpl : public CodeGenerator { 32226633Sdim DiagnosticsEngine &Diags; 33276479Sdim std::unique_ptr<const llvm::DataLayout> TD; 34193326Sed ASTContext *Ctx; 35199482Srdivacky const CodeGenOptions CodeGenOpts; // Intentionally copied in. 36280031Sdim 37280031Sdim unsigned HandlingTopLevelDecls; 38280031Sdim struct HandlingTopLevelDeclRAII { 39280031Sdim CodeGeneratorImpl &Self; 40280031Sdim HandlingTopLevelDeclRAII(CodeGeneratorImpl &Self) : Self(Self) { 41280031Sdim ++Self.HandlingTopLevelDecls; 42280031Sdim } 43280031Sdim ~HandlingTopLevelDeclRAII() { 44280031Sdim if (--Self.HandlingTopLevelDecls == 0) 45280031Sdim Self.EmitDeferredDecls(); 46280031Sdim } 47280031Sdim }; 48280031Sdim 49280031Sdim CoverageSourceInfo *CoverageInfo; 50280031Sdim 51193326Sed protected: 52276479Sdim std::unique_ptr<llvm::Module> M; 53276479Sdim std::unique_ptr<CodeGen::CodeGenModule> Builder; 54276479Sdim 55280031Sdim private: 56280031Sdim SmallVector<CXXMethodDecl *, 8> DeferredInlineMethodDefinitions; 57280031Sdim 58193326Sed public: 59226633Sdim CodeGeneratorImpl(DiagnosticsEngine &diags, const std::string& ModuleName, 60280031Sdim const CodeGenOptions &CGO, llvm::LLVMContext& C, 61280031Sdim CoverageSourceInfo *CoverageInfo = nullptr) 62280031Sdim : Diags(diags), Ctx(nullptr), CodeGenOpts(CGO), HandlingTopLevelDecls(0), 63280031Sdim CoverageInfo(CoverageInfo), 64249423Sdim M(new llvm::Module(ModuleName, C)) {} 65198092Srdivacky 66280031Sdim virtual ~CodeGeneratorImpl() { 67280031Sdim // There should normally not be any leftover inline method definitions. 68280031Sdim assert(DeferredInlineMethodDefinitions.empty() || 69280031Sdim Diags.hasErrorOccurred()); 70280031Sdim } 71198092Srdivacky 72276479Sdim llvm::Module* GetModule() override { 73193326Sed return M.get(); 74193326Sed } 75198092Srdivacky 76276479Sdim const Decl *GetDeclForMangledName(StringRef MangledName) override { 77276479Sdim GlobalDecl Result; 78276479Sdim if (!Builder->lookupRepresentativeDecl(MangledName, Result)) 79276479Sdim return nullptr; 80276479Sdim const Decl *D = Result.getCanonicalDecl().getDecl(); 81276479Sdim if (auto FD = dyn_cast<FunctionDecl>(D)) { 82276479Sdim if (FD->hasBody(FD)) 83276479Sdim return FD; 84276479Sdim } else if (auto TD = dyn_cast<TagDecl>(D)) { 85276479Sdim if (auto Def = TD->getDefinition()) 86276479Sdim return Def; 87276479Sdim } 88276479Sdim return D; 89193326Sed } 90198092Srdivacky 91276479Sdim llvm::Module *ReleaseModule() override { return M.release(); } 92276479Sdim 93276479Sdim void Initialize(ASTContext &Context) override { 94193326Sed Ctx = &Context; 95198092Srdivacky 96226633Sdim M->setTargetTriple(Ctx->getTargetInfo().getTriple().getTriple()); 97226633Sdim M->setDataLayout(Ctx->getTargetInfo().getTargetDescription()); 98243830Sdim TD.reset(new llvm::DataLayout(Ctx->getTargetInfo().getTargetDescription())); 99251662Sdim Builder.reset(new CodeGen::CodeGenModule(Context, CodeGenOpts, *M, *TD, 100280031Sdim Diags, CoverageInfo)); 101261991Sdim 102261991Sdim for (size_t i = 0, e = CodeGenOpts.DependentLibraries.size(); i < e; ++i) 103261991Sdim HandleDependentLibrary(CodeGenOpts.DependentLibraries[i]); 104193326Sed } 105198092Srdivacky 106276479Sdim void HandleCXXStaticMemberVarInstantiation(VarDecl *VD) override { 107261991Sdim if (Diags.hasErrorOccurred()) 108261991Sdim return; 109261991Sdim 110234353Sdim Builder->HandleCXXStaticMemberVarInstantiation(VD); 111234353Sdim } 112234353Sdim 113276479Sdim bool HandleTopLevelDecl(DeclGroupRef DG) override { 114261991Sdim if (Diags.hasErrorOccurred()) 115261991Sdim return true; 116261991Sdim 117280031Sdim HandlingTopLevelDeclRAII HandlingDecl(*this); 118280031Sdim 119193326Sed // Make sure to emit all elements of a Decl. 120193326Sed for (DeclGroupRef::iterator I = DG.begin(), E = DG.end(); I != E; ++I) 121193326Sed Builder->EmitTopLevelDecl(*I); 122276479Sdim 123234353Sdim return true; 124193326Sed } 125193326Sed 126280031Sdim void EmitDeferredDecls() { 127280031Sdim if (DeferredInlineMethodDefinitions.empty()) 128280031Sdim return; 129280031Sdim 130280031Sdim // Emit any deferred inline method definitions. Note that more deferred 131280031Sdim // methods may be added during this loop, since ASTConsumer callbacks 132280031Sdim // can be invoked if AST inspection results in declarations being added. 133280031Sdim HandlingTopLevelDeclRAII HandlingDecl(*this); 134280031Sdim for (unsigned I = 0; I != DeferredInlineMethodDefinitions.size(); ++I) 135280031Sdim Builder->EmitTopLevelDecl(DeferredInlineMethodDefinitions[I]); 136280031Sdim DeferredInlineMethodDefinitions.clear(); 137280031Sdim } 138280031Sdim 139276479Sdim void HandleInlineMethodDefinition(CXXMethodDecl *D) override { 140276479Sdim if (Diags.hasErrorOccurred()) 141276479Sdim return; 142276479Sdim 143276479Sdim assert(D->doesThisDeclarationHaveABody()); 144276479Sdim 145276479Sdim // We may want to emit this definition. However, that decision might be 146276479Sdim // based on computing the linkage, and we have to defer that in case we 147276479Sdim // are inside of something that will change the method's final linkage, 148276479Sdim // e.g. 149276479Sdim // typedef struct { 150276479Sdim // void bar(); 151276479Sdim // void foo() { bar(); } 152276479Sdim // } A; 153276479Sdim DeferredInlineMethodDefinitions.push_back(D); 154280031Sdim 155280031Sdim // Provide some coverage mapping even for methods that aren't emitted. 156280031Sdim // Don't do this for templated classes though, as they may not be 157280031Sdim // instantiable. 158280031Sdim if (!D->getParent()->getDescribedClassTemplate()) 159280031Sdim Builder->AddDeferredUnusedCoverageMapping(D); 160276479Sdim } 161276479Sdim 162193326Sed /// HandleTagDeclDefinition - This callback is invoked each time a TagDecl 163193326Sed /// to (e.g. struct, union, enum, class) is completed. This allows the 164193326Sed /// client hack on the type, which can occur at any point in the file 165193326Sed /// (because these can be defined in declspecs). 166276479Sdim void HandleTagDeclDefinition(TagDecl *D) override { 167261991Sdim if (Diags.hasErrorOccurred()) 168261991Sdim return; 169261991Sdim 170193326Sed Builder->UpdateCompletedType(D); 171276479Sdim 172276479Sdim // For MSVC compatibility, treat declarations of static data members with 173276479Sdim // inline initializers as definitions. 174276479Sdim if (Ctx->getLangOpts().MSVCCompat) { 175276479Sdim for (Decl *Member : D->decls()) { 176276479Sdim if (VarDecl *VD = dyn_cast<VarDecl>(Member)) { 177276479Sdim if (Ctx->isMSStaticDataMemberInlineDefinition(VD) && 178276479Sdim Ctx->DeclMustBeEmitted(VD)) { 179276479Sdim Builder->EmitGlobal(VD); 180276479Sdim } 181276479Sdim } 182276479Sdim } 183218893Sdim } 184193326Sed } 185193326Sed 186276479Sdim void HandleTagDeclRequiredDefinition(const TagDecl *D) override { 187261991Sdim if (Diags.hasErrorOccurred()) 188261991Sdim return; 189261991Sdim 190261991Sdim if (CodeGen::CGDebugInfo *DI = Builder->getModuleDebugInfo()) 191261991Sdim if (const RecordDecl *RD = dyn_cast<RecordDecl>(D)) 192261991Sdim DI->completeRequiredType(RD); 193261991Sdim } 194261991Sdim 195276479Sdim void HandleTranslationUnit(ASTContext &Ctx) override { 196193326Sed if (Diags.hasErrorOccurred()) { 197276479Sdim if (Builder) 198276479Sdim Builder->clear(); 199193326Sed M.reset(); 200193326Sed return; 201193326Sed } 202193326Sed 203193326Sed if (Builder) 204193326Sed Builder->Release(); 205201361Srdivacky } 206193326Sed 207276479Sdim void CompleteTentativeDefinition(VarDecl *D) override { 208193326Sed if (Diags.hasErrorOccurred()) 209193326Sed return; 210193326Sed 211193326Sed Builder->EmitTentativeDefinition(D); 212193326Sed } 213208600Srdivacky 214276479Sdim void HandleVTable(CXXRecordDecl *RD, bool DefinitionRequired) override { 215208600Srdivacky if (Diags.hasErrorOccurred()) 216208600Srdivacky return; 217208600Srdivacky 218208600Srdivacky Builder->EmitVTable(RD, DefinitionRequired); 219208600Srdivacky } 220261991Sdim 221276479Sdim void HandleLinkerOptionPragma(llvm::StringRef Opts) override { 222261991Sdim Builder->AppendLinkerOptions(Opts); 223261991Sdim } 224261991Sdim 225276479Sdim void HandleDetectMismatch(llvm::StringRef Name, 226276479Sdim llvm::StringRef Value) override { 227261991Sdim Builder->AddDetectMismatch(Name, Value); 228261991Sdim } 229261991Sdim 230276479Sdim void HandleDependentLibrary(llvm::StringRef Lib) override { 231261991Sdim Builder->AddDependentLib(Lib); 232261991Sdim } 233193326Sed }; 234193326Sed} 235193326Sed 236234353Sdimvoid CodeGenerator::anchor() { } 237234353Sdim 238226633SdimCodeGenerator *clang::CreateLLVMCodeGen(DiagnosticsEngine &Diags, 239193326Sed const std::string& ModuleName, 240199482Srdivacky const CodeGenOptions &CGO, 241251662Sdim const TargetOptions &/*TO*/, 242280031Sdim llvm::LLVMContext& C, 243280031Sdim CoverageSourceInfo *CoverageInfo) { 244280031Sdim return new CodeGeneratorImpl(Diags, ModuleName, CGO, C, CoverageInfo); 245193326Sed} 246