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