xref: /aosp_15_r20/external/clang/lib/CodeGen/ModuleBuilder.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
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