xref: /netbsd-src/external/apache2/llvm/dist/clang/lib/CodeGen/ModuleBuilder.cpp (revision 7330f729ccf0bd976a06f95fad452fe774fc7fd1)
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