ModuleBuilder.cpp revision 280031
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;
35199482Srdivacky    const CodeGenOptions CodeGenOpts;  // Intentionally copied in.
36280031Sdim
37280031Sdim    unsigned HandlingTopLevelDecls;
38280031Sdim    struct HandlingTopLevelDeclRAII {
39280031Sdim      CodeGeneratorImpl &Self;
40280031Sdim      HandlingTopLevelDeclRAII(CodeGeneratorImpl &Self) : Self(Self) {
41280031Sdim        ++Self.HandlingTopLevelDecls;
42280031Sdim      }
43280031Sdim      ~HandlingTopLevelDeclRAII() {
44280031Sdim        if (--Self.HandlingTopLevelDecls == 0)
45280031Sdim          Self.EmitDeferredDecls();
46280031Sdim      }
47280031Sdim    };
48280031Sdim
49280031Sdim    CoverageSourceInfo *CoverageInfo;
50280031Sdim
51193326Sed  protected:
52276479Sdim    std::unique_ptr<llvm::Module> M;
53276479Sdim    std::unique_ptr<CodeGen::CodeGenModule> Builder;
54276479Sdim
55280031Sdim  private:
56280031Sdim    SmallVector<CXXMethodDecl *, 8> DeferredInlineMethodDefinitions;
57280031Sdim
58193326Sed  public:
59226633Sdim    CodeGeneratorImpl(DiagnosticsEngine &diags, const std::string& ModuleName,
60280031Sdim                      const CodeGenOptions &CGO, llvm::LLVMContext& C,
61280031Sdim                      CoverageSourceInfo *CoverageInfo = nullptr)
62280031Sdim      : Diags(diags), Ctx(nullptr), CodeGenOpts(CGO), HandlingTopLevelDecls(0),
63280031Sdim        CoverageInfo(CoverageInfo),
64249423Sdim        M(new llvm::Module(ModuleName, C)) {}
65198092Srdivacky
66280031Sdim    virtual ~CodeGeneratorImpl() {
67280031Sdim      // There should normally not be any leftover inline method definitions.
68280031Sdim      assert(DeferredInlineMethodDefinitions.empty() ||
69280031Sdim             Diags.hasErrorOccurred());
70280031Sdim    }
71198092Srdivacky
72276479Sdim    llvm::Module* GetModule() override {
73193326Sed      return M.get();
74193326Sed    }
75198092Srdivacky
76276479Sdim    const Decl *GetDeclForMangledName(StringRef MangledName) override {
77276479Sdim      GlobalDecl Result;
78276479Sdim      if (!Builder->lookupRepresentativeDecl(MangledName, Result))
79276479Sdim        return nullptr;
80276479Sdim      const Decl *D = Result.getCanonicalDecl().getDecl();
81276479Sdim      if (auto FD = dyn_cast<FunctionDecl>(D)) {
82276479Sdim        if (FD->hasBody(FD))
83276479Sdim          return FD;
84276479Sdim      } else if (auto TD = dyn_cast<TagDecl>(D)) {
85276479Sdim        if (auto Def = TD->getDefinition())
86276479Sdim          return Def;
87276479Sdim      }
88276479Sdim      return D;
89193326Sed    }
90198092Srdivacky
91276479Sdim    llvm::Module *ReleaseModule() override { return M.release(); }
92276479Sdim
93276479Sdim    void Initialize(ASTContext &Context) override {
94193326Sed      Ctx = &Context;
95198092Srdivacky
96226633Sdim      M->setTargetTriple(Ctx->getTargetInfo().getTriple().getTriple());
97226633Sdim      M->setDataLayout(Ctx->getTargetInfo().getTargetDescription());
98243830Sdim      TD.reset(new llvm::DataLayout(Ctx->getTargetInfo().getTargetDescription()));
99251662Sdim      Builder.reset(new CodeGen::CodeGenModule(Context, CodeGenOpts, *M, *TD,
100280031Sdim                                               Diags, CoverageInfo));
101261991Sdim
102261991Sdim      for (size_t i = 0, e = CodeGenOpts.DependentLibraries.size(); i < e; ++i)
103261991Sdim        HandleDependentLibrary(CodeGenOpts.DependentLibraries[i]);
104193326Sed    }
105198092Srdivacky
106276479Sdim    void HandleCXXStaticMemberVarInstantiation(VarDecl *VD) override {
107261991Sdim      if (Diags.hasErrorOccurred())
108261991Sdim        return;
109261991Sdim
110234353Sdim      Builder->HandleCXXStaticMemberVarInstantiation(VD);
111234353Sdim    }
112234353Sdim
113276479Sdim    bool HandleTopLevelDecl(DeclGroupRef DG) override {
114261991Sdim      if (Diags.hasErrorOccurred())
115261991Sdim        return true;
116261991Sdim
117280031Sdim      HandlingTopLevelDeclRAII HandlingDecl(*this);
118280031Sdim
119193326Sed      // Make sure to emit all elements of a Decl.
120193326Sed      for (DeclGroupRef::iterator I = DG.begin(), E = DG.end(); I != E; ++I)
121193326Sed        Builder->EmitTopLevelDecl(*I);
122276479Sdim
123234353Sdim      return true;
124193326Sed    }
125193326Sed
126280031Sdim    void EmitDeferredDecls() {
127280031Sdim      if (DeferredInlineMethodDefinitions.empty())
128280031Sdim        return;
129280031Sdim
130280031Sdim      // Emit any deferred inline method definitions. Note that more deferred
131280031Sdim      // methods may be added during this loop, since ASTConsumer callbacks
132280031Sdim      // can be invoked if AST inspection results in declarations being added.
133280031Sdim      HandlingTopLevelDeclRAII HandlingDecl(*this);
134280031Sdim      for (unsigned I = 0; I != DeferredInlineMethodDefinitions.size(); ++I)
135280031Sdim        Builder->EmitTopLevelDecl(DeferredInlineMethodDefinitions[I]);
136280031Sdim      DeferredInlineMethodDefinitions.clear();
137280031Sdim    }
138280031Sdim
139276479Sdim    void HandleInlineMethodDefinition(CXXMethodDecl *D) override {
140276479Sdim      if (Diags.hasErrorOccurred())
141276479Sdim        return;
142276479Sdim
143276479Sdim      assert(D->doesThisDeclarationHaveABody());
144276479Sdim
145276479Sdim      // We may want to emit this definition. However, that decision might be
146276479Sdim      // based on computing the linkage, and we have to defer that in case we
147276479Sdim      // are inside of something that will change the method's final linkage,
148276479Sdim      // e.g.
149276479Sdim      //   typedef struct {
150276479Sdim      //     void bar();
151276479Sdim      //     void foo() { bar(); }
152276479Sdim      //   } A;
153276479Sdim      DeferredInlineMethodDefinitions.push_back(D);
154280031Sdim
155280031Sdim      // Provide some coverage mapping even for methods that aren't emitted.
156280031Sdim      // Don't do this for templated classes though, as they may not be
157280031Sdim      // instantiable.
158280031Sdim      if (!D->getParent()->getDescribedClassTemplate())
159280031Sdim        Builder->AddDeferredUnusedCoverageMapping(D);
160276479Sdim    }
161276479Sdim
162193326Sed    /// HandleTagDeclDefinition - This callback is invoked each time a TagDecl
163193326Sed    /// to (e.g. struct, union, enum, class) is completed. This allows the
164193326Sed    /// client hack on the type, which can occur at any point in the file
165193326Sed    /// (because these can be defined in declspecs).
166276479Sdim    void HandleTagDeclDefinition(TagDecl *D) override {
167261991Sdim      if (Diags.hasErrorOccurred())
168261991Sdim        return;
169261991Sdim
170193326Sed      Builder->UpdateCompletedType(D);
171276479Sdim
172276479Sdim      // For MSVC compatibility, treat declarations of static data members with
173276479Sdim      // inline initializers as definitions.
174276479Sdim      if (Ctx->getLangOpts().MSVCCompat) {
175276479Sdim        for (Decl *Member : D->decls()) {
176276479Sdim          if (VarDecl *VD = dyn_cast<VarDecl>(Member)) {
177276479Sdim            if (Ctx->isMSStaticDataMemberInlineDefinition(VD) &&
178276479Sdim                Ctx->DeclMustBeEmitted(VD)) {
179276479Sdim              Builder->EmitGlobal(VD);
180276479Sdim            }
181276479Sdim          }
182276479Sdim        }
183218893Sdim      }
184193326Sed    }
185193326Sed
186276479Sdim    void HandleTagDeclRequiredDefinition(const TagDecl *D) override {
187261991Sdim      if (Diags.hasErrorOccurred())
188261991Sdim        return;
189261991Sdim
190261991Sdim      if (CodeGen::CGDebugInfo *DI = Builder->getModuleDebugInfo())
191261991Sdim        if (const RecordDecl *RD = dyn_cast<RecordDecl>(D))
192261991Sdim          DI->completeRequiredType(RD);
193261991Sdim    }
194261991Sdim
195276479Sdim    void HandleTranslationUnit(ASTContext &Ctx) override {
196193326Sed      if (Diags.hasErrorOccurred()) {
197276479Sdim        if (Builder)
198276479Sdim          Builder->clear();
199193326Sed        M.reset();
200193326Sed        return;
201193326Sed      }
202193326Sed
203193326Sed      if (Builder)
204193326Sed        Builder->Release();
205201361Srdivacky    }
206193326Sed
207276479Sdim    void CompleteTentativeDefinition(VarDecl *D) override {
208193326Sed      if (Diags.hasErrorOccurred())
209193326Sed        return;
210193326Sed
211193326Sed      Builder->EmitTentativeDefinition(D);
212193326Sed    }
213208600Srdivacky
214276479Sdim    void HandleVTable(CXXRecordDecl *RD, bool DefinitionRequired) override {
215208600Srdivacky      if (Diags.hasErrorOccurred())
216208600Srdivacky        return;
217208600Srdivacky
218208600Srdivacky      Builder->EmitVTable(RD, DefinitionRequired);
219208600Srdivacky    }
220261991Sdim
221276479Sdim    void HandleLinkerOptionPragma(llvm::StringRef Opts) override {
222261991Sdim      Builder->AppendLinkerOptions(Opts);
223261991Sdim    }
224261991Sdim
225276479Sdim    void HandleDetectMismatch(llvm::StringRef Name,
226276479Sdim                              llvm::StringRef Value) override {
227261991Sdim      Builder->AddDetectMismatch(Name, Value);
228261991Sdim    }
229261991Sdim
230276479Sdim    void HandleDependentLibrary(llvm::StringRef Lib) override {
231261991Sdim      Builder->AddDependentLib(Lib);
232261991Sdim    }
233193326Sed  };
234193326Sed}
235193326Sed
236234353Sdimvoid CodeGenerator::anchor() { }
237234353Sdim
238226633SdimCodeGenerator *clang::CreateLLVMCodeGen(DiagnosticsEngine &Diags,
239193326Sed                                        const std::string& ModuleName,
240199482Srdivacky                                        const CodeGenOptions &CGO,
241251662Sdim                                        const TargetOptions &/*TO*/,
242280031Sdim                                        llvm::LLVMContext& C,
243280031Sdim                                        CoverageSourceInfo *CoverageInfo) {
244280031Sdim  return new CodeGeneratorImpl(Diags, ModuleName, CGO, C, CoverageInfo);
245193326Sed}
246