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