ModuleBuilder.cpp revision 288943
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; 35288943Sdim const HeaderSearchOptions &HeaderSearchOpts; // Only used for debug info. 36288943Sdim const PreprocessorOptions &PreprocessorOpts; // Only used for debug info. 37199482Srdivacky const CodeGenOptions CodeGenOpts; // Intentionally copied in. 38280031Sdim 39280031Sdim unsigned HandlingTopLevelDecls; 40280031Sdim struct HandlingTopLevelDeclRAII { 41280031Sdim CodeGeneratorImpl &Self; 42280031Sdim HandlingTopLevelDeclRAII(CodeGeneratorImpl &Self) : Self(Self) { 43280031Sdim ++Self.HandlingTopLevelDecls; 44280031Sdim } 45280031Sdim ~HandlingTopLevelDeclRAII() { 46280031Sdim if (--Self.HandlingTopLevelDecls == 0) 47280031Sdim Self.EmitDeferredDecls(); 48280031Sdim } 49280031Sdim }; 50280031Sdim 51280031Sdim CoverageSourceInfo *CoverageInfo; 52280031Sdim 53193326Sed protected: 54276479Sdim std::unique_ptr<llvm::Module> M; 55276479Sdim std::unique_ptr<CodeGen::CodeGenModule> Builder; 56276479Sdim 57280031Sdim private: 58280031Sdim SmallVector<CXXMethodDecl *, 8> DeferredInlineMethodDefinitions; 59280031Sdim 60193326Sed public: 61288943Sdim CodeGeneratorImpl(DiagnosticsEngine &diags, const std::string &ModuleName, 62288943Sdim const HeaderSearchOptions &HSO, 63288943Sdim const PreprocessorOptions &PPO, const CodeGenOptions &CGO, 64288943Sdim llvm::LLVMContext &C, 65280031Sdim CoverageSourceInfo *CoverageInfo = nullptr) 66288943Sdim : Diags(diags), Ctx(nullptr), HeaderSearchOpts(HSO), 67288943Sdim PreprocessorOpts(PPO), CodeGenOpts(CGO), HandlingTopLevelDecls(0), 68288943Sdim CoverageInfo(CoverageInfo), 69288943Sdim M(new llvm::Module(ModuleName, C)) {} 70198092Srdivacky 71288943Sdim ~CodeGeneratorImpl() override { 72280031Sdim // There should normally not be any leftover inline method definitions. 73280031Sdim assert(DeferredInlineMethodDefinitions.empty() || 74280031Sdim Diags.hasErrorOccurred()); 75280031Sdim } 76198092Srdivacky 77276479Sdim llvm::Module* GetModule() override { 78193326Sed return M.get(); 79193326Sed } 80198092Srdivacky 81276479Sdim const Decl *GetDeclForMangledName(StringRef MangledName) override { 82276479Sdim GlobalDecl Result; 83276479Sdim if (!Builder->lookupRepresentativeDecl(MangledName, Result)) 84276479Sdim return nullptr; 85276479Sdim const Decl *D = Result.getCanonicalDecl().getDecl(); 86276479Sdim if (auto FD = dyn_cast<FunctionDecl>(D)) { 87276479Sdim if (FD->hasBody(FD)) 88276479Sdim return FD; 89276479Sdim } else if (auto TD = dyn_cast<TagDecl>(D)) { 90276479Sdim if (auto Def = TD->getDefinition()) 91276479Sdim return Def; 92276479Sdim } 93276479Sdim return D; 94193326Sed } 95198092Srdivacky 96276479Sdim llvm::Module *ReleaseModule() override { return M.release(); } 97276479Sdim 98276479Sdim void Initialize(ASTContext &Context) override { 99193326Sed Ctx = &Context; 100198092Srdivacky 101226633Sdim M->setTargetTriple(Ctx->getTargetInfo().getTriple().getTriple()); 102226633Sdim M->setDataLayout(Ctx->getTargetInfo().getTargetDescription()); 103288943Sdim TD.reset( 104288943Sdim new llvm::DataLayout(Ctx->getTargetInfo().getTargetDescription())); 105288943Sdim Builder.reset(new CodeGen::CodeGenModule(Context, 106288943Sdim HeaderSearchOpts, 107288943Sdim PreprocessorOpts, 108288943Sdim CodeGenOpts, *M, *TD, 109280031Sdim Diags, CoverageInfo)); 110261991Sdim 111261991Sdim for (size_t i = 0, e = CodeGenOpts.DependentLibraries.size(); i < e; ++i) 112261991Sdim HandleDependentLibrary(CodeGenOpts.DependentLibraries[i]); 113193326Sed } 114198092Srdivacky 115276479Sdim void HandleCXXStaticMemberVarInstantiation(VarDecl *VD) override { 116261991Sdim if (Diags.hasErrorOccurred()) 117261991Sdim return; 118261991Sdim 119234353Sdim Builder->HandleCXXStaticMemberVarInstantiation(VD); 120234353Sdim } 121234353Sdim 122276479Sdim bool HandleTopLevelDecl(DeclGroupRef DG) override { 123261991Sdim if (Diags.hasErrorOccurred()) 124261991Sdim return true; 125261991Sdim 126280031Sdim HandlingTopLevelDeclRAII HandlingDecl(*this); 127280031Sdim 128193326Sed // Make sure to emit all elements of a Decl. 129193326Sed for (DeclGroupRef::iterator I = DG.begin(), E = DG.end(); I != E; ++I) 130193326Sed Builder->EmitTopLevelDecl(*I); 131276479Sdim 132234353Sdim return true; 133193326Sed } 134193326Sed 135280031Sdim void EmitDeferredDecls() { 136280031Sdim if (DeferredInlineMethodDefinitions.empty()) 137280031Sdim return; 138280031Sdim 139280031Sdim // Emit any deferred inline method definitions. Note that more deferred 140280031Sdim // methods may be added during this loop, since ASTConsumer callbacks 141280031Sdim // can be invoked if AST inspection results in declarations being added. 142280031Sdim HandlingTopLevelDeclRAII HandlingDecl(*this); 143280031Sdim for (unsigned I = 0; I != DeferredInlineMethodDefinitions.size(); ++I) 144280031Sdim Builder->EmitTopLevelDecl(DeferredInlineMethodDefinitions[I]); 145280031Sdim DeferredInlineMethodDefinitions.clear(); 146280031Sdim } 147280031Sdim 148276479Sdim void HandleInlineMethodDefinition(CXXMethodDecl *D) override { 149276479Sdim if (Diags.hasErrorOccurred()) 150276479Sdim return; 151276479Sdim 152276479Sdim assert(D->doesThisDeclarationHaveABody()); 153276479Sdim 154276479Sdim // We may want to emit this definition. However, that decision might be 155276479Sdim // based on computing the linkage, and we have to defer that in case we 156276479Sdim // are inside of something that will change the method's final linkage, 157276479Sdim // e.g. 158276479Sdim // typedef struct { 159276479Sdim // void bar(); 160276479Sdim // void foo() { bar(); } 161276479Sdim // } A; 162276479Sdim DeferredInlineMethodDefinitions.push_back(D); 163280031Sdim 164280031Sdim // Provide some coverage mapping even for methods that aren't emitted. 165280031Sdim // Don't do this for templated classes though, as they may not be 166280031Sdim // instantiable. 167280031Sdim if (!D->getParent()->getDescribedClassTemplate()) 168280031Sdim Builder->AddDeferredUnusedCoverageMapping(D); 169276479Sdim } 170276479Sdim 171193326Sed /// HandleTagDeclDefinition - This callback is invoked each time a TagDecl 172193326Sed /// to (e.g. struct, union, enum, class) is completed. This allows the 173193326Sed /// client hack on the type, which can occur at any point in the file 174193326Sed /// (because these can be defined in declspecs). 175276479Sdim void HandleTagDeclDefinition(TagDecl *D) override { 176261991Sdim if (Diags.hasErrorOccurred()) 177261991Sdim return; 178261991Sdim 179193326Sed Builder->UpdateCompletedType(D); 180276479Sdim 181276479Sdim // For MSVC compatibility, treat declarations of static data members with 182276479Sdim // inline initializers as definitions. 183276479Sdim if (Ctx->getLangOpts().MSVCCompat) { 184276479Sdim for (Decl *Member : D->decls()) { 185276479Sdim if (VarDecl *VD = dyn_cast<VarDecl>(Member)) { 186276479Sdim if (Ctx->isMSStaticDataMemberInlineDefinition(VD) && 187276479Sdim Ctx->DeclMustBeEmitted(VD)) { 188276479Sdim Builder->EmitGlobal(VD); 189276479Sdim } 190276479Sdim } 191276479Sdim } 192218893Sdim } 193193326Sed } 194193326Sed 195276479Sdim void HandleTagDeclRequiredDefinition(const TagDecl *D) override { 196261991Sdim if (Diags.hasErrorOccurred()) 197261991Sdim return; 198261991Sdim 199261991Sdim if (CodeGen::CGDebugInfo *DI = Builder->getModuleDebugInfo()) 200261991Sdim if (const RecordDecl *RD = dyn_cast<RecordDecl>(D)) 201261991Sdim DI->completeRequiredType(RD); 202261991Sdim } 203261991Sdim 204276479Sdim void HandleTranslationUnit(ASTContext &Ctx) override { 205193326Sed if (Diags.hasErrorOccurred()) { 206276479Sdim if (Builder) 207276479Sdim Builder->clear(); 208193326Sed M.reset(); 209193326Sed return; 210193326Sed } 211193326Sed 212193326Sed if (Builder) 213193326Sed Builder->Release(); 214201361Srdivacky } 215193326Sed 216276479Sdim void CompleteTentativeDefinition(VarDecl *D) override { 217193326Sed if (Diags.hasErrorOccurred()) 218193326Sed return; 219193326Sed 220193326Sed Builder->EmitTentativeDefinition(D); 221193326Sed } 222208600Srdivacky 223288943Sdim void HandleVTable(CXXRecordDecl *RD) override { 224208600Srdivacky if (Diags.hasErrorOccurred()) 225208600Srdivacky return; 226208600Srdivacky 227288943Sdim Builder->EmitVTable(RD); 228208600Srdivacky } 229261991Sdim 230276479Sdim void HandleLinkerOptionPragma(llvm::StringRef Opts) override { 231261991Sdim Builder->AppendLinkerOptions(Opts); 232261991Sdim } 233261991Sdim 234276479Sdim void HandleDetectMismatch(llvm::StringRef Name, 235276479Sdim llvm::StringRef Value) override { 236261991Sdim Builder->AddDetectMismatch(Name, Value); 237261991Sdim } 238261991Sdim 239276479Sdim void HandleDependentLibrary(llvm::StringRef Lib) override { 240261991Sdim Builder->AddDependentLib(Lib); 241261991Sdim } 242193326Sed }; 243193326Sed} 244193326Sed 245234353Sdimvoid CodeGenerator::anchor() { } 246234353Sdim 247288943SdimCodeGenerator *clang::CreateLLVMCodeGen( 248288943Sdim DiagnosticsEngine &Diags, const std::string &ModuleName, 249288943Sdim const HeaderSearchOptions &HeaderSearchOpts, 250288943Sdim const PreprocessorOptions &PreprocessorOpts, const CodeGenOptions &CGO, 251288943Sdim llvm::LLVMContext &C, CoverageSourceInfo *CoverageInfo) { 252288943Sdim return new CodeGeneratorImpl(Diags, ModuleName, HeaderSearchOpts, 253288943Sdim PreprocessorOpts, CGO, C, CoverageInfo); 254193326Sed} 255