1*7330f729Sjoerg //===--- ModuleBuilder.cpp - Emit LLVM Code from ASTs ---------------------===// 2*7330f729Sjoerg // 3*7330f729Sjoerg // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*7330f729Sjoerg // See https://llvm.org/LICENSE.txt for license information. 5*7330f729Sjoerg // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*7330f729Sjoerg // 7*7330f729Sjoerg //===----------------------------------------------------------------------===// 8*7330f729Sjoerg // 9*7330f729Sjoerg // This builds an AST and converts it to LLVM Code. 10*7330f729Sjoerg // 11*7330f729Sjoerg //===----------------------------------------------------------------------===// 12*7330f729Sjoerg 13*7330f729Sjoerg #include "clang/CodeGen/ModuleBuilder.h" 14*7330f729Sjoerg #include "CGDebugInfo.h" 15*7330f729Sjoerg #include "CodeGenModule.h" 16*7330f729Sjoerg #include "clang/AST/ASTContext.h" 17*7330f729Sjoerg #include "clang/AST/DeclObjC.h" 18*7330f729Sjoerg #include "clang/AST/Expr.h" 19*7330f729Sjoerg #include "clang/Basic/CodeGenOptions.h" 20*7330f729Sjoerg #include "clang/Basic/Diagnostic.h" 21*7330f729Sjoerg #include "clang/Basic/TargetInfo.h" 22*7330f729Sjoerg #include "llvm/ADT/StringRef.h" 23*7330f729Sjoerg #include "llvm/IR/DataLayout.h" 24*7330f729Sjoerg #include "llvm/IR/LLVMContext.h" 25*7330f729Sjoerg #include "llvm/IR/Module.h" 26*7330f729Sjoerg #include <memory> 27*7330f729Sjoerg 28*7330f729Sjoerg using namespace clang; 29*7330f729Sjoerg using namespace CodeGen; 30*7330f729Sjoerg 31*7330f729Sjoerg namespace { 32*7330f729Sjoerg class CodeGeneratorImpl : public CodeGenerator { 33*7330f729Sjoerg DiagnosticsEngine &Diags; 34*7330f729Sjoerg ASTContext *Ctx; 35*7330f729Sjoerg const HeaderSearchOptions &HeaderSearchOpts; // Only used for debug info. 36*7330f729Sjoerg const PreprocessorOptions &PreprocessorOpts; // Only used for debug info. 37*7330f729Sjoerg const CodeGenOptions CodeGenOpts; // Intentionally copied in. 38*7330f729Sjoerg 39*7330f729Sjoerg unsigned HandlingTopLevelDecls; 40*7330f729Sjoerg 41*7330f729Sjoerg /// Use this when emitting decls to block re-entrant decl emission. It will 42*7330f729Sjoerg /// emit all deferred decls on scope exit. Set EmitDeferred to false if decl 43*7330f729Sjoerg /// emission must be deferred longer, like at the end of a tag definition. 44*7330f729Sjoerg struct HandlingTopLevelDeclRAII { 45*7330f729Sjoerg CodeGeneratorImpl &Self; 46*7330f729Sjoerg bool EmitDeferred; 47*7330f729Sjoerg HandlingTopLevelDeclRAII(CodeGeneratorImpl &Self, 48*7330f729Sjoerg bool EmitDeferred = true) 49*7330f729Sjoerg : Self(Self), EmitDeferred(EmitDeferred) { 50*7330f729Sjoerg ++Self.HandlingTopLevelDecls; 51*7330f729Sjoerg } 52*7330f729Sjoerg ~HandlingTopLevelDeclRAII() { 53*7330f729Sjoerg unsigned Level = --Self.HandlingTopLevelDecls; 54*7330f729Sjoerg if (Level == 0 && EmitDeferred) 55*7330f729Sjoerg Self.EmitDeferredDecls(); 56*7330f729Sjoerg } 57*7330f729Sjoerg }; 58*7330f729Sjoerg 59*7330f729Sjoerg CoverageSourceInfo *CoverageInfo; 60*7330f729Sjoerg 61*7330f729Sjoerg protected: 62*7330f729Sjoerg std::unique_ptr<llvm::Module> M; 63*7330f729Sjoerg std::unique_ptr<CodeGen::CodeGenModule> Builder; 64*7330f729Sjoerg 65*7330f729Sjoerg private: 66*7330f729Sjoerg SmallVector<FunctionDecl *, 8> DeferredInlineMemberFuncDefs; 67*7330f729Sjoerg 68*7330f729Sjoerg static llvm::StringRef ExpandModuleName(llvm::StringRef ModuleName, 69*7330f729Sjoerg const CodeGenOptions &CGO) { 70*7330f729Sjoerg if (ModuleName == "-" && !CGO.MainFileName.empty()) 71*7330f729Sjoerg return CGO.MainFileName; 72*7330f729Sjoerg return ModuleName; 73*7330f729Sjoerg } 74*7330f729Sjoerg 75*7330f729Sjoerg public: 76*7330f729Sjoerg CodeGeneratorImpl(DiagnosticsEngine &diags, llvm::StringRef ModuleName, 77*7330f729Sjoerg const HeaderSearchOptions &HSO, 78*7330f729Sjoerg const PreprocessorOptions &PPO, const CodeGenOptions &CGO, 79*7330f729Sjoerg llvm::LLVMContext &C, 80*7330f729Sjoerg CoverageSourceInfo *CoverageInfo = nullptr) 81*7330f729Sjoerg : Diags(diags), Ctx(nullptr), HeaderSearchOpts(HSO), 82*7330f729Sjoerg PreprocessorOpts(PPO), CodeGenOpts(CGO), HandlingTopLevelDecls(0), 83*7330f729Sjoerg CoverageInfo(CoverageInfo), 84*7330f729Sjoerg M(new llvm::Module(ExpandModuleName(ModuleName, CGO), C)) { 85*7330f729Sjoerg C.setDiscardValueNames(CGO.DiscardValueNames); 86*7330f729Sjoerg } 87*7330f729Sjoerg 88*7330f729Sjoerg ~CodeGeneratorImpl() override { 89*7330f729Sjoerg // There should normally not be any leftover inline method definitions. 90*7330f729Sjoerg assert(DeferredInlineMemberFuncDefs.empty() || 91*7330f729Sjoerg Diags.hasErrorOccurred()); 92*7330f729Sjoerg } 93*7330f729Sjoerg 94*7330f729Sjoerg CodeGenModule &CGM() { 95*7330f729Sjoerg return *Builder; 96*7330f729Sjoerg } 97*7330f729Sjoerg 98*7330f729Sjoerg llvm::Module *GetModule() { 99*7330f729Sjoerg return M.get(); 100*7330f729Sjoerg } 101*7330f729Sjoerg 102*7330f729Sjoerg CGDebugInfo *getCGDebugInfo() { 103*7330f729Sjoerg return Builder->getModuleDebugInfo(); 104*7330f729Sjoerg } 105*7330f729Sjoerg 106*7330f729Sjoerg llvm::Module *ReleaseModule() { 107*7330f729Sjoerg return M.release(); 108*7330f729Sjoerg } 109*7330f729Sjoerg 110*7330f729Sjoerg const Decl *GetDeclForMangledName(StringRef MangledName) { 111*7330f729Sjoerg GlobalDecl Result; 112*7330f729Sjoerg if (!Builder->lookupRepresentativeDecl(MangledName, Result)) 113*7330f729Sjoerg return nullptr; 114*7330f729Sjoerg const Decl *D = Result.getCanonicalDecl().getDecl(); 115*7330f729Sjoerg if (auto FD = dyn_cast<FunctionDecl>(D)) { 116*7330f729Sjoerg if (FD->hasBody(FD)) 117*7330f729Sjoerg return FD; 118*7330f729Sjoerg } else if (auto TD = dyn_cast<TagDecl>(D)) { 119*7330f729Sjoerg if (auto Def = TD->getDefinition()) 120*7330f729Sjoerg return Def; 121*7330f729Sjoerg } 122*7330f729Sjoerg return D; 123*7330f729Sjoerg } 124*7330f729Sjoerg 125*7330f729Sjoerg llvm::Constant *GetAddrOfGlobal(GlobalDecl global, bool isForDefinition) { 126*7330f729Sjoerg return Builder->GetAddrOfGlobal(global, ForDefinition_t(isForDefinition)); 127*7330f729Sjoerg } 128*7330f729Sjoerg 129*7330f729Sjoerg llvm::Module *StartModule(llvm::StringRef ModuleName, 130*7330f729Sjoerg llvm::LLVMContext &C) { 131*7330f729Sjoerg assert(!M && "Replacing existing Module?"); 132*7330f729Sjoerg M.reset(new llvm::Module(ExpandModuleName(ModuleName, CodeGenOpts), C)); 133*7330f729Sjoerg Initialize(*Ctx); 134*7330f729Sjoerg return M.get(); 135*7330f729Sjoerg } 136*7330f729Sjoerg 137*7330f729Sjoerg void Initialize(ASTContext &Context) override { 138*7330f729Sjoerg Ctx = &Context; 139*7330f729Sjoerg 140*7330f729Sjoerg M->setTargetTriple(Ctx->getTargetInfo().getTriple().getTriple()); 141*7330f729Sjoerg M->setDataLayout(Ctx->getTargetInfo().getDataLayout()); 142*7330f729Sjoerg const auto &SDKVersion = Ctx->getTargetInfo().getSDKVersion(); 143*7330f729Sjoerg if (!SDKVersion.empty()) 144*7330f729Sjoerg M->setSDKVersion(SDKVersion); 145*7330f729Sjoerg Builder.reset(new CodeGen::CodeGenModule(Context, HeaderSearchOpts, 146*7330f729Sjoerg PreprocessorOpts, CodeGenOpts, 147*7330f729Sjoerg *M, Diags, CoverageInfo)); 148*7330f729Sjoerg 149*7330f729Sjoerg for (auto &&Lib : CodeGenOpts.DependentLibraries) 150*7330f729Sjoerg Builder->AddDependentLib(Lib); 151*7330f729Sjoerg for (auto &&Opt : CodeGenOpts.LinkerOptions) 152*7330f729Sjoerg Builder->AppendLinkerOptions(Opt); 153*7330f729Sjoerg } 154*7330f729Sjoerg 155*7330f729Sjoerg void HandleCXXStaticMemberVarInstantiation(VarDecl *VD) override { 156*7330f729Sjoerg if (Diags.hasErrorOccurred()) 157*7330f729Sjoerg return; 158*7330f729Sjoerg 159*7330f729Sjoerg Builder->HandleCXXStaticMemberVarInstantiation(VD); 160*7330f729Sjoerg } 161*7330f729Sjoerg 162*7330f729Sjoerg bool HandleTopLevelDecl(DeclGroupRef DG) override { 163*7330f729Sjoerg if (Diags.hasErrorOccurred()) 164*7330f729Sjoerg return true; 165*7330f729Sjoerg 166*7330f729Sjoerg HandlingTopLevelDeclRAII HandlingDecl(*this); 167*7330f729Sjoerg 168*7330f729Sjoerg // Make sure to emit all elements of a Decl. 169*7330f729Sjoerg for (DeclGroupRef::iterator I = DG.begin(), E = DG.end(); I != E; ++I) 170*7330f729Sjoerg Builder->EmitTopLevelDecl(*I); 171*7330f729Sjoerg 172*7330f729Sjoerg return true; 173*7330f729Sjoerg } 174*7330f729Sjoerg 175*7330f729Sjoerg void EmitDeferredDecls() { 176*7330f729Sjoerg if (DeferredInlineMemberFuncDefs.empty()) 177*7330f729Sjoerg return; 178*7330f729Sjoerg 179*7330f729Sjoerg // Emit any deferred inline method definitions. Note that more deferred 180*7330f729Sjoerg // methods may be added during this loop, since ASTConsumer callbacks 181*7330f729Sjoerg // can be invoked if AST inspection results in declarations being added. 182*7330f729Sjoerg HandlingTopLevelDeclRAII HandlingDecl(*this); 183*7330f729Sjoerg for (unsigned I = 0; I != DeferredInlineMemberFuncDefs.size(); ++I) 184*7330f729Sjoerg Builder->EmitTopLevelDecl(DeferredInlineMemberFuncDefs[I]); 185*7330f729Sjoerg DeferredInlineMemberFuncDefs.clear(); 186*7330f729Sjoerg } 187*7330f729Sjoerg 188*7330f729Sjoerg void HandleInlineFunctionDefinition(FunctionDecl *D) override { 189*7330f729Sjoerg if (Diags.hasErrorOccurred()) 190*7330f729Sjoerg return; 191*7330f729Sjoerg 192*7330f729Sjoerg assert(D->doesThisDeclarationHaveABody()); 193*7330f729Sjoerg 194*7330f729Sjoerg // We may want to emit this definition. However, that decision might be 195*7330f729Sjoerg // based on computing the linkage, and we have to defer that in case we 196*7330f729Sjoerg // are inside of something that will change the method's final linkage, 197*7330f729Sjoerg // e.g. 198*7330f729Sjoerg // typedef struct { 199*7330f729Sjoerg // void bar(); 200*7330f729Sjoerg // void foo() { bar(); } 201*7330f729Sjoerg // } A; 202*7330f729Sjoerg DeferredInlineMemberFuncDefs.push_back(D); 203*7330f729Sjoerg 204*7330f729Sjoerg // Provide some coverage mapping even for methods that aren't emitted. 205*7330f729Sjoerg // Don't do this for templated classes though, as they may not be 206*7330f729Sjoerg // instantiable. 207*7330f729Sjoerg if (!D->getLexicalDeclContext()->isDependentContext()) 208*7330f729Sjoerg Builder->AddDeferredUnusedCoverageMapping(D); 209*7330f729Sjoerg } 210*7330f729Sjoerg 211*7330f729Sjoerg /// HandleTagDeclDefinition - This callback is invoked each time a TagDecl 212*7330f729Sjoerg /// to (e.g. struct, union, enum, class) is completed. This allows the 213*7330f729Sjoerg /// client hack on the type, which can occur at any point in the file 214*7330f729Sjoerg /// (because these can be defined in declspecs). 215*7330f729Sjoerg void HandleTagDeclDefinition(TagDecl *D) override { 216*7330f729Sjoerg if (Diags.hasErrorOccurred()) 217*7330f729Sjoerg return; 218*7330f729Sjoerg 219*7330f729Sjoerg // Don't allow re-entrant calls to CodeGen triggered by PCH 220*7330f729Sjoerg // deserialization to emit deferred decls. 221*7330f729Sjoerg HandlingTopLevelDeclRAII HandlingDecl(*this, /*EmitDeferred=*/false); 222*7330f729Sjoerg 223*7330f729Sjoerg Builder->UpdateCompletedType(D); 224*7330f729Sjoerg 225*7330f729Sjoerg // For MSVC compatibility, treat declarations of static data members with 226*7330f729Sjoerg // inline initializers as definitions. 227*7330f729Sjoerg if (Ctx->getTargetInfo().getCXXABI().isMicrosoft()) { 228*7330f729Sjoerg for (Decl *Member : D->decls()) { 229*7330f729Sjoerg if (VarDecl *VD = dyn_cast<VarDecl>(Member)) { 230*7330f729Sjoerg if (Ctx->isMSStaticDataMemberInlineDefinition(VD) && 231*7330f729Sjoerg Ctx->DeclMustBeEmitted(VD)) { 232*7330f729Sjoerg Builder->EmitGlobal(VD); 233*7330f729Sjoerg } 234*7330f729Sjoerg } 235*7330f729Sjoerg } 236*7330f729Sjoerg } 237*7330f729Sjoerg // For OpenMP emit declare reduction functions, if required. 238*7330f729Sjoerg if (Ctx->getLangOpts().OpenMP) { 239*7330f729Sjoerg for (Decl *Member : D->decls()) { 240*7330f729Sjoerg if (auto *DRD = dyn_cast<OMPDeclareReductionDecl>(Member)) { 241*7330f729Sjoerg if (Ctx->DeclMustBeEmitted(DRD)) 242*7330f729Sjoerg Builder->EmitGlobal(DRD); 243*7330f729Sjoerg } else if (auto *DMD = dyn_cast<OMPDeclareMapperDecl>(Member)) { 244*7330f729Sjoerg if (Ctx->DeclMustBeEmitted(DMD)) 245*7330f729Sjoerg Builder->EmitGlobal(DMD); 246*7330f729Sjoerg } 247*7330f729Sjoerg } 248*7330f729Sjoerg } 249*7330f729Sjoerg } 250*7330f729Sjoerg 251*7330f729Sjoerg void HandleTagDeclRequiredDefinition(const TagDecl *D) override { 252*7330f729Sjoerg if (Diags.hasErrorOccurred()) 253*7330f729Sjoerg return; 254*7330f729Sjoerg 255*7330f729Sjoerg // Don't allow re-entrant calls to CodeGen triggered by PCH 256*7330f729Sjoerg // deserialization to emit deferred decls. 257*7330f729Sjoerg HandlingTopLevelDeclRAII HandlingDecl(*this, /*EmitDeferred=*/false); 258*7330f729Sjoerg 259*7330f729Sjoerg if (CodeGen::CGDebugInfo *DI = Builder->getModuleDebugInfo()) 260*7330f729Sjoerg if (const RecordDecl *RD = dyn_cast<RecordDecl>(D)) 261*7330f729Sjoerg DI->completeRequiredType(RD); 262*7330f729Sjoerg } 263*7330f729Sjoerg 264*7330f729Sjoerg void HandleTranslationUnit(ASTContext &Ctx) override { 265*7330f729Sjoerg // Release the Builder when there is no error. 266*7330f729Sjoerg if (!Diags.hasErrorOccurred() && Builder) 267*7330f729Sjoerg Builder->Release(); 268*7330f729Sjoerg 269*7330f729Sjoerg // If there are errors before or when releasing the Builder, reset 270*7330f729Sjoerg // the module to stop here before invoking the backend. 271*7330f729Sjoerg if (Diags.hasErrorOccurred()) { 272*7330f729Sjoerg if (Builder) 273*7330f729Sjoerg Builder->clear(); 274*7330f729Sjoerg M.reset(); 275*7330f729Sjoerg return; 276*7330f729Sjoerg } 277*7330f729Sjoerg } 278*7330f729Sjoerg 279*7330f729Sjoerg void AssignInheritanceModel(CXXRecordDecl *RD) override { 280*7330f729Sjoerg if (Diags.hasErrorOccurred()) 281*7330f729Sjoerg return; 282*7330f729Sjoerg 283*7330f729Sjoerg Builder->RefreshTypeCacheForClass(RD); 284*7330f729Sjoerg } 285*7330f729Sjoerg 286*7330f729Sjoerg void CompleteTentativeDefinition(VarDecl *D) override { 287*7330f729Sjoerg if (Diags.hasErrorOccurred()) 288*7330f729Sjoerg return; 289*7330f729Sjoerg 290*7330f729Sjoerg Builder->EmitTentativeDefinition(D); 291*7330f729Sjoerg } 292*7330f729Sjoerg 293*7330f729Sjoerg void HandleVTable(CXXRecordDecl *RD) override { 294*7330f729Sjoerg if (Diags.hasErrorOccurred()) 295*7330f729Sjoerg return; 296*7330f729Sjoerg 297*7330f729Sjoerg Builder->EmitVTable(RD); 298*7330f729Sjoerg } 299*7330f729Sjoerg }; 300*7330f729Sjoerg } 301*7330f729Sjoerg 302*7330f729Sjoerg void CodeGenerator::anchor() { } 303*7330f729Sjoerg 304*7330f729Sjoerg CodeGenModule &CodeGenerator::CGM() { 305*7330f729Sjoerg return static_cast<CodeGeneratorImpl*>(this)->CGM(); 306*7330f729Sjoerg } 307*7330f729Sjoerg 308*7330f729Sjoerg llvm::Module *CodeGenerator::GetModule() { 309*7330f729Sjoerg return static_cast<CodeGeneratorImpl*>(this)->GetModule(); 310*7330f729Sjoerg } 311*7330f729Sjoerg 312*7330f729Sjoerg llvm::Module *CodeGenerator::ReleaseModule() { 313*7330f729Sjoerg return static_cast<CodeGeneratorImpl*>(this)->ReleaseModule(); 314*7330f729Sjoerg } 315*7330f729Sjoerg 316*7330f729Sjoerg CGDebugInfo *CodeGenerator::getCGDebugInfo() { 317*7330f729Sjoerg return static_cast<CodeGeneratorImpl*>(this)->getCGDebugInfo(); 318*7330f729Sjoerg } 319*7330f729Sjoerg 320*7330f729Sjoerg const Decl *CodeGenerator::GetDeclForMangledName(llvm::StringRef name) { 321*7330f729Sjoerg return static_cast<CodeGeneratorImpl*>(this)->GetDeclForMangledName(name); 322*7330f729Sjoerg } 323*7330f729Sjoerg 324*7330f729Sjoerg llvm::Constant *CodeGenerator::GetAddrOfGlobal(GlobalDecl global, 325*7330f729Sjoerg bool isForDefinition) { 326*7330f729Sjoerg return static_cast<CodeGeneratorImpl*>(this) 327*7330f729Sjoerg ->GetAddrOfGlobal(global, isForDefinition); 328*7330f729Sjoerg } 329*7330f729Sjoerg 330*7330f729Sjoerg llvm::Module *CodeGenerator::StartModule(llvm::StringRef ModuleName, 331*7330f729Sjoerg llvm::LLVMContext &C) { 332*7330f729Sjoerg return static_cast<CodeGeneratorImpl*>(this)->StartModule(ModuleName, C); 333*7330f729Sjoerg } 334*7330f729Sjoerg 335*7330f729Sjoerg CodeGenerator *clang::CreateLLVMCodeGen( 336*7330f729Sjoerg DiagnosticsEngine &Diags, llvm::StringRef ModuleName, 337*7330f729Sjoerg const HeaderSearchOptions &HeaderSearchOpts, 338*7330f729Sjoerg const PreprocessorOptions &PreprocessorOpts, const CodeGenOptions &CGO, 339*7330f729Sjoerg llvm::LLVMContext &C, CoverageSourceInfo *CoverageInfo) { 340*7330f729Sjoerg return new CodeGeneratorImpl(Diags, ModuleName, HeaderSearchOpts, 341*7330f729Sjoerg PreprocessorOpts, CGO, C, CoverageInfo); 342*7330f729Sjoerg } 343