1f22ef01cSRoman Divacky //===--- ModuleBuilder.cpp - Emit LLVM Code from ASTs ---------------------===//
2f22ef01cSRoman Divacky //
3f22ef01cSRoman Divacky //                     The LLVM Compiler Infrastructure
4f22ef01cSRoman Divacky //
5f22ef01cSRoman Divacky // This file is distributed under the University of Illinois Open Source
6f22ef01cSRoman Divacky // License. See LICENSE.TXT for details.
7f22ef01cSRoman Divacky //
8f22ef01cSRoman Divacky //===----------------------------------------------------------------------===//
9f22ef01cSRoman Divacky //
10f22ef01cSRoman Divacky // This builds an AST and converts it to LLVM Code.
11f22ef01cSRoman Divacky //
12f22ef01cSRoman Divacky //===----------------------------------------------------------------------===//
13f22ef01cSRoman Divacky 
14f22ef01cSRoman Divacky #include "clang/CodeGen/ModuleBuilder.h"
15f785676fSDimitry Andric #include "CGDebugInfo.h"
1659d1ed5bSDimitry Andric #include "CodeGenModule.h"
17f22ef01cSRoman Divacky #include "clang/AST/ASTContext.h"
18f22ef01cSRoman Divacky #include "clang/AST/DeclObjC.h"
19f22ef01cSRoman Divacky #include "clang/AST/Expr.h"
20*b5893f02SDimitry Andric #include "clang/Basic/CodeGenOptions.h"
21f22ef01cSRoman Divacky #include "clang/Basic/Diagnostic.h"
22f22ef01cSRoman Divacky #include "clang/Basic/TargetInfo.h"
23f785676fSDimitry Andric #include "llvm/ADT/StringRef.h"
24139f7f9bSDimitry Andric #include "llvm/IR/DataLayout.h"
25139f7f9bSDimitry Andric #include "llvm/IR/LLVMContext.h"
26139f7f9bSDimitry Andric #include "llvm/IR/Module.h"
2759d1ed5bSDimitry Andric #include <memory>
28e7145dcbSDimitry Andric 
29f22ef01cSRoman Divacky using namespace clang;
30e7145dcbSDimitry Andric using namespace CodeGen;
31f22ef01cSRoman Divacky 
32f22ef01cSRoman Divacky namespace {
33f22ef01cSRoman Divacky   class CodeGeneratorImpl : public CodeGenerator {
346122f3e6SDimitry Andric     DiagnosticsEngine &Diags;
35f22ef01cSRoman Divacky     ASTContext *Ctx;
363dac3a9bSDimitry Andric     const HeaderSearchOptions &HeaderSearchOpts; // Only used for debug info.
373dac3a9bSDimitry Andric     const PreprocessorOptions &PreprocessorOpts; // Only used for debug info.
38f22ef01cSRoman Divacky     const CodeGenOptions CodeGenOpts;  // Intentionally copied in.
3939d628a0SDimitry Andric 
4039d628a0SDimitry Andric     unsigned HandlingTopLevelDecls;
41e7145dcbSDimitry Andric 
42e7145dcbSDimitry Andric     /// Use this when emitting decls to block re-entrant decl emission. It will
43e7145dcbSDimitry Andric     /// emit all deferred decls on scope exit. Set EmitDeferred to false if decl
44e7145dcbSDimitry Andric     /// emission must be deferred longer, like at the end of a tag definition.
4539d628a0SDimitry Andric     struct HandlingTopLevelDeclRAII {
4639d628a0SDimitry Andric       CodeGeneratorImpl &Self;
47e7145dcbSDimitry Andric       bool EmitDeferred;
HandlingTopLevelDeclRAII__anona725aa1a0111::CodeGeneratorImpl::HandlingTopLevelDeclRAII48e7145dcbSDimitry Andric       HandlingTopLevelDeclRAII(CodeGeneratorImpl &Self,
49e7145dcbSDimitry Andric                                bool EmitDeferred = true)
50e7145dcbSDimitry Andric           : Self(Self), EmitDeferred(EmitDeferred) {
5139d628a0SDimitry Andric         ++Self.HandlingTopLevelDecls;
5239d628a0SDimitry Andric       }
~HandlingTopLevelDeclRAII__anona725aa1a0111::CodeGeneratorImpl::HandlingTopLevelDeclRAII5339d628a0SDimitry Andric       ~HandlingTopLevelDeclRAII() {
54e7145dcbSDimitry Andric         unsigned Level = --Self.HandlingTopLevelDecls;
55e7145dcbSDimitry Andric         if (Level == 0 && EmitDeferred)
5639d628a0SDimitry Andric           Self.EmitDeferredDecls();
5739d628a0SDimitry Andric       }
5839d628a0SDimitry Andric     };
5939d628a0SDimitry Andric 
6039d628a0SDimitry Andric     CoverageSourceInfo *CoverageInfo;
6139d628a0SDimitry Andric 
62f22ef01cSRoman Divacky   protected:
6359d1ed5bSDimitry Andric     std::unique_ptr<llvm::Module> M;
6459d1ed5bSDimitry Andric     std::unique_ptr<CodeGen::CodeGenModule> Builder;
6559d1ed5bSDimitry Andric 
6639d628a0SDimitry Andric   private:
67*b5893f02SDimitry Andric     SmallVector<FunctionDecl *, 8> DeferredInlineMemberFuncDefs;
6839d628a0SDimitry Andric 
69f22ef01cSRoman Divacky   public:
CodeGeneratorImpl(DiagnosticsEngine & diags,llvm::StringRef ModuleName,const HeaderSearchOptions & HSO,const PreprocessorOptions & PPO,const CodeGenOptions & CGO,llvm::LLVMContext & C,CoverageSourceInfo * CoverageInfo=nullptr)70e7145dcbSDimitry Andric     CodeGeneratorImpl(DiagnosticsEngine &diags, llvm::StringRef ModuleName,
713dac3a9bSDimitry Andric                       const HeaderSearchOptions &HSO,
723dac3a9bSDimitry Andric                       const PreprocessorOptions &PPO, const CodeGenOptions &CGO,
733dac3a9bSDimitry Andric                       llvm::LLVMContext &C,
7439d628a0SDimitry Andric                       CoverageSourceInfo *CoverageInfo = nullptr)
753dac3a9bSDimitry Andric         : Diags(diags), Ctx(nullptr), HeaderSearchOpts(HSO),
763dac3a9bSDimitry Andric           PreprocessorOpts(PPO), CodeGenOpts(CGO), HandlingTopLevelDecls(0),
77e7145dcbSDimitry Andric           CoverageInfo(CoverageInfo), M(new llvm::Module(ModuleName, C)) {
78e7145dcbSDimitry Andric       C.setDiscardValueNames(CGO.DiscardValueNames);
79e7145dcbSDimitry Andric     }
80f22ef01cSRoman Divacky 
~CodeGeneratorImpl()8133956c43SDimitry Andric     ~CodeGeneratorImpl() override {
8239d628a0SDimitry Andric       // There should normally not be any leftover inline method definitions.
83*b5893f02SDimitry Andric       assert(DeferredInlineMemberFuncDefs.empty() ||
8439d628a0SDimitry Andric              Diags.hasErrorOccurred());
8539d628a0SDimitry Andric     }
86f22ef01cSRoman Divacky 
CGM()87e7145dcbSDimitry Andric     CodeGenModule &CGM() {
88e7145dcbSDimitry Andric       return *Builder;
89e7145dcbSDimitry Andric     }
90e7145dcbSDimitry Andric 
GetModule()91e7145dcbSDimitry Andric     llvm::Module *GetModule() {
92f22ef01cSRoman Divacky       return M.get();
93f22ef01cSRoman Divacky     }
94f22ef01cSRoman Divacky 
getCGDebugInfo()9520e90f04SDimitry Andric     CGDebugInfo *getCGDebugInfo() {
9620e90f04SDimitry Andric       return Builder->getModuleDebugInfo();
9720e90f04SDimitry Andric     }
9820e90f04SDimitry Andric 
ReleaseModule()99e7145dcbSDimitry Andric     llvm::Module *ReleaseModule() {
100e7145dcbSDimitry Andric       return M.release();
101e7145dcbSDimitry Andric     }
102e7145dcbSDimitry Andric 
GetDeclForMangledName(StringRef MangledName)103e7145dcbSDimitry Andric     const Decl *GetDeclForMangledName(StringRef MangledName) {
10459d1ed5bSDimitry Andric       GlobalDecl Result;
10559d1ed5bSDimitry Andric       if (!Builder->lookupRepresentativeDecl(MangledName, Result))
10659d1ed5bSDimitry Andric         return nullptr;
10759d1ed5bSDimitry Andric       const Decl *D = Result.getCanonicalDecl().getDecl();
10859d1ed5bSDimitry Andric       if (auto FD = dyn_cast<FunctionDecl>(D)) {
10959d1ed5bSDimitry Andric         if (FD->hasBody(FD))
11059d1ed5bSDimitry Andric           return FD;
11159d1ed5bSDimitry Andric       } else if (auto TD = dyn_cast<TagDecl>(D)) {
11259d1ed5bSDimitry Andric         if (auto Def = TD->getDefinition())
11359d1ed5bSDimitry Andric           return Def;
11459d1ed5bSDimitry Andric       }
11559d1ed5bSDimitry Andric       return D;
116f22ef01cSRoman Divacky     }
117f22ef01cSRoman Divacky 
GetAddrOfGlobal(GlobalDecl global,bool isForDefinition)118e7145dcbSDimitry Andric     llvm::Constant *GetAddrOfGlobal(GlobalDecl global, bool isForDefinition) {
11944290647SDimitry Andric       return Builder->GetAddrOfGlobal(global, ForDefinition_t(isForDefinition));
120e7145dcbSDimitry Andric     }
12159d1ed5bSDimitry Andric 
StartModule(llvm::StringRef ModuleName,llvm::LLVMContext & C)1229a199699SDimitry Andric     llvm::Module *StartModule(llvm::StringRef ModuleName,
1239a199699SDimitry Andric                               llvm::LLVMContext &C) {
1249a199699SDimitry Andric       assert(!M && "Replacing existing Module?");
1259a199699SDimitry Andric       M.reset(new llvm::Module(ModuleName, C));
1269a199699SDimitry Andric       Initialize(*Ctx);
1279a199699SDimitry Andric       return M.get();
1289a199699SDimitry Andric     }
1299a199699SDimitry Andric 
Initialize(ASTContext & Context)13059d1ed5bSDimitry Andric     void Initialize(ASTContext &Context) override {
131f22ef01cSRoman Divacky       Ctx = &Context;
132f22ef01cSRoman Divacky 
1336122f3e6SDimitry Andric       M->setTargetTriple(Ctx->getTargetInfo().getTriple().getTriple());
134e7145dcbSDimitry Andric       M->setDataLayout(Ctx->getTargetInfo().getDataLayout());
135*b5893f02SDimitry Andric       const auto &SDKVersion = Ctx->getTargetInfo().getSDKVersion();
136*b5893f02SDimitry Andric       if (!SDKVersion.empty())
137*b5893f02SDimitry Andric         M->setSDKVersion(SDKVersion);
1380623d748SDimitry Andric       Builder.reset(new CodeGen::CodeGenModule(Context, HeaderSearchOpts,
1390623d748SDimitry Andric                                                PreprocessorOpts, CodeGenOpts,
1400623d748SDimitry Andric                                                *M, Diags, CoverageInfo));
141f785676fSDimitry Andric 
142e7145dcbSDimitry Andric       for (auto &&Lib : CodeGenOpts.DependentLibraries)
143e7145dcbSDimitry Andric         Builder->AddDependentLib(Lib);
144e7145dcbSDimitry Andric       for (auto &&Opt : CodeGenOpts.LinkerOptions)
145e7145dcbSDimitry Andric         Builder->AppendLinkerOptions(Opt);
146f22ef01cSRoman Divacky     }
147f22ef01cSRoman Divacky 
HandleCXXStaticMemberVarInstantiation(VarDecl * VD)14859d1ed5bSDimitry Andric     void HandleCXXStaticMemberVarInstantiation(VarDecl *VD) override {
149f785676fSDimitry Andric       if (Diags.hasErrorOccurred())
150f785676fSDimitry Andric         return;
151f785676fSDimitry Andric 
152dff0c46cSDimitry Andric       Builder->HandleCXXStaticMemberVarInstantiation(VD);
153dff0c46cSDimitry Andric     }
154dff0c46cSDimitry Andric 
HandleTopLevelDecl(DeclGroupRef DG)15559d1ed5bSDimitry Andric     bool HandleTopLevelDecl(DeclGroupRef DG) override {
156f785676fSDimitry Andric       if (Diags.hasErrorOccurred())
157f785676fSDimitry Andric         return true;
158f785676fSDimitry Andric 
15939d628a0SDimitry Andric       HandlingTopLevelDeclRAII HandlingDecl(*this);
16039d628a0SDimitry Andric 
161f22ef01cSRoman Divacky       // Make sure to emit all elements of a Decl.
162f22ef01cSRoman Divacky       for (DeclGroupRef::iterator I = DG.begin(), E = DG.end(); I != E; ++I)
163f22ef01cSRoman Divacky         Builder->EmitTopLevelDecl(*I);
16459d1ed5bSDimitry Andric 
165dff0c46cSDimitry Andric       return true;
166f22ef01cSRoman Divacky     }
167f22ef01cSRoman Divacky 
EmitDeferredDecls()16839d628a0SDimitry Andric     void EmitDeferredDecls() {
169*b5893f02SDimitry Andric       if (DeferredInlineMemberFuncDefs.empty())
17039d628a0SDimitry Andric         return;
17139d628a0SDimitry Andric 
17239d628a0SDimitry Andric       // Emit any deferred inline method definitions. Note that more deferred
17339d628a0SDimitry Andric       // methods may be added during this loop, since ASTConsumer callbacks
17439d628a0SDimitry Andric       // can be invoked if AST inspection results in declarations being added.
17539d628a0SDimitry Andric       HandlingTopLevelDeclRAII HandlingDecl(*this);
176*b5893f02SDimitry Andric       for (unsigned I = 0; I != DeferredInlineMemberFuncDefs.size(); ++I)
177*b5893f02SDimitry Andric         Builder->EmitTopLevelDecl(DeferredInlineMemberFuncDefs[I]);
178*b5893f02SDimitry Andric       DeferredInlineMemberFuncDefs.clear();
17939d628a0SDimitry Andric     }
18039d628a0SDimitry Andric 
HandleInlineFunctionDefinition(FunctionDecl * D)181e7145dcbSDimitry Andric     void HandleInlineFunctionDefinition(FunctionDecl *D) override {
18259d1ed5bSDimitry Andric       if (Diags.hasErrorOccurred())
18359d1ed5bSDimitry Andric         return;
18459d1ed5bSDimitry Andric 
18559d1ed5bSDimitry Andric       assert(D->doesThisDeclarationHaveABody());
18659d1ed5bSDimitry Andric 
18759d1ed5bSDimitry Andric       // We may want to emit this definition. However, that decision might be
18859d1ed5bSDimitry Andric       // based on computing the linkage, and we have to defer that in case we
18959d1ed5bSDimitry Andric       // are inside of something that will change the method's final linkage,
19059d1ed5bSDimitry Andric       // e.g.
19159d1ed5bSDimitry Andric       //   typedef struct {
19259d1ed5bSDimitry Andric       //     void bar();
19359d1ed5bSDimitry Andric       //     void foo() { bar(); }
19459d1ed5bSDimitry Andric       //   } A;
195*b5893f02SDimitry Andric       DeferredInlineMemberFuncDefs.push_back(D);
19639d628a0SDimitry Andric 
19739d628a0SDimitry Andric       // Provide some coverage mapping even for methods that aren't emitted.
19839d628a0SDimitry Andric       // Don't do this for templated classes though, as they may not be
19939d628a0SDimitry Andric       // instantiable.
200*b5893f02SDimitry Andric       if (!D->getLexicalDeclContext()->isDependentContext())
201*b5893f02SDimitry Andric         Builder->AddDeferredUnusedCoverageMapping(D);
20259d1ed5bSDimitry Andric     }
20359d1ed5bSDimitry Andric 
204f22ef01cSRoman Divacky     /// HandleTagDeclDefinition - This callback is invoked each time a TagDecl
205f22ef01cSRoman Divacky     /// to (e.g. struct, union, enum, class) is completed. This allows the
206f22ef01cSRoman Divacky     /// client hack on the type, which can occur at any point in the file
207f22ef01cSRoman Divacky     /// (because these can be defined in declspecs).
HandleTagDeclDefinition(TagDecl * D)20859d1ed5bSDimitry Andric     void HandleTagDeclDefinition(TagDecl *D) override {
209f785676fSDimitry Andric       if (Diags.hasErrorOccurred())
210f785676fSDimitry Andric         return;
211f785676fSDimitry Andric 
212e7145dcbSDimitry Andric       // Don't allow re-entrant calls to CodeGen triggered by PCH
213e7145dcbSDimitry Andric       // deserialization to emit deferred decls.
214e7145dcbSDimitry Andric       HandlingTopLevelDeclRAII HandlingDecl(*this, /*EmitDeferred=*/false);
215e7145dcbSDimitry Andric 
216f22ef01cSRoman Divacky       Builder->UpdateCompletedType(D);
2172754fe60SDimitry Andric 
21859d1ed5bSDimitry Andric       // For MSVC compatibility, treat declarations of static data members with
21959d1ed5bSDimitry Andric       // inline initializers as definitions.
2200623d748SDimitry Andric       if (Ctx->getTargetInfo().getCXXABI().isMicrosoft()) {
22159d1ed5bSDimitry Andric         for (Decl *Member : D->decls()) {
22259d1ed5bSDimitry Andric           if (VarDecl *VD = dyn_cast<VarDecl>(Member)) {
22359d1ed5bSDimitry Andric             if (Ctx->isMSStaticDataMemberInlineDefinition(VD) &&
22459d1ed5bSDimitry Andric                 Ctx->DeclMustBeEmitted(VD)) {
22559d1ed5bSDimitry Andric               Builder->EmitGlobal(VD);
22659d1ed5bSDimitry Andric             }
22759d1ed5bSDimitry Andric           }
22859d1ed5bSDimitry Andric         }
2292754fe60SDimitry Andric       }
230e7145dcbSDimitry Andric       // For OpenMP emit declare reduction functions, if required.
231e7145dcbSDimitry Andric       if (Ctx->getLangOpts().OpenMP) {
232e7145dcbSDimitry Andric         for (Decl *Member : D->decls()) {
233e7145dcbSDimitry Andric           if (auto *DRD = dyn_cast<OMPDeclareReductionDecl>(Member)) {
234e7145dcbSDimitry Andric             if (Ctx->DeclMustBeEmitted(DRD))
235e7145dcbSDimitry Andric               Builder->EmitGlobal(DRD);
236e7145dcbSDimitry Andric           }
237e7145dcbSDimitry Andric         }
238e7145dcbSDimitry Andric       }
239f22ef01cSRoman Divacky     }
240f22ef01cSRoman Divacky 
HandleTagDeclRequiredDefinition(const TagDecl * D)24159d1ed5bSDimitry Andric     void HandleTagDeclRequiredDefinition(const TagDecl *D) override {
242f785676fSDimitry Andric       if (Diags.hasErrorOccurred())
243f785676fSDimitry Andric         return;
244f785676fSDimitry Andric 
245e7145dcbSDimitry Andric       // Don't allow re-entrant calls to CodeGen triggered by PCH
246e7145dcbSDimitry Andric       // deserialization to emit deferred decls.
247e7145dcbSDimitry Andric       HandlingTopLevelDeclRAII HandlingDecl(*this, /*EmitDeferred=*/false);
248e7145dcbSDimitry Andric 
249f785676fSDimitry Andric       if (CodeGen::CGDebugInfo *DI = Builder->getModuleDebugInfo())
250f785676fSDimitry Andric         if (const RecordDecl *RD = dyn_cast<RecordDecl>(D))
251f785676fSDimitry Andric           DI->completeRequiredType(RD);
252f785676fSDimitry Andric     }
253f785676fSDimitry Andric 
HandleTranslationUnit(ASTContext & Ctx)25459d1ed5bSDimitry Andric     void HandleTranslationUnit(ASTContext &Ctx) override {
255e7145dcbSDimitry Andric       // Release the Builder when there is no error.
256e7145dcbSDimitry Andric       if (!Diags.hasErrorOccurred() && Builder)
257e7145dcbSDimitry Andric         Builder->Release();
258e7145dcbSDimitry Andric 
259e7145dcbSDimitry Andric       // If there are errors before or when releasing the Builder, reset
260e7145dcbSDimitry Andric       // the module to stop here before invoking the backend.
261f22ef01cSRoman Divacky       if (Diags.hasErrorOccurred()) {
26259d1ed5bSDimitry Andric         if (Builder)
26359d1ed5bSDimitry Andric           Builder->clear();
264f22ef01cSRoman Divacky         M.reset();
265f22ef01cSRoman Divacky         return;
266f22ef01cSRoman Divacky       }
267e7145dcbSDimitry Andric     }
268f22ef01cSRoman Divacky 
AssignInheritanceModel(CXXRecordDecl * RD)269e7145dcbSDimitry Andric     void AssignInheritanceModel(CXXRecordDecl *RD) override {
270e7145dcbSDimitry Andric       if (Diags.hasErrorOccurred())
271e7145dcbSDimitry Andric         return;
272e7145dcbSDimitry Andric 
273e7145dcbSDimitry Andric       Builder->RefreshTypeCacheForClass(RD);
274f22ef01cSRoman Divacky     }
275f22ef01cSRoman Divacky 
CompleteTentativeDefinition(VarDecl * D)27659d1ed5bSDimitry Andric     void CompleteTentativeDefinition(VarDecl *D) override {
277f22ef01cSRoman Divacky       if (Diags.hasErrorOccurred())
278f22ef01cSRoman Divacky         return;
279f22ef01cSRoman Divacky 
280f22ef01cSRoman Divacky       Builder->EmitTentativeDefinition(D);
281f22ef01cSRoman Divacky     }
282f22ef01cSRoman Divacky 
HandleVTable(CXXRecordDecl * RD)28333956c43SDimitry Andric     void HandleVTable(CXXRecordDecl *RD) override {
284f22ef01cSRoman Divacky       if (Diags.hasErrorOccurred())
285f22ef01cSRoman Divacky         return;
286f22ef01cSRoman Divacky 
28733956c43SDimitry Andric       Builder->EmitVTable(RD);
288f22ef01cSRoman Divacky     }
289f22ef01cSRoman Divacky   };
290f22ef01cSRoman Divacky }
291f22ef01cSRoman Divacky 
anchor()292dff0c46cSDimitry Andric void CodeGenerator::anchor() { }
293dff0c46cSDimitry Andric 
CGM()294e7145dcbSDimitry Andric CodeGenModule &CodeGenerator::CGM() {
295e7145dcbSDimitry Andric   return static_cast<CodeGeneratorImpl*>(this)->CGM();
296e7145dcbSDimitry Andric }
297e7145dcbSDimitry Andric 
GetModule()298e7145dcbSDimitry Andric llvm::Module *CodeGenerator::GetModule() {
299e7145dcbSDimitry Andric   return static_cast<CodeGeneratorImpl*>(this)->GetModule();
300e7145dcbSDimitry Andric }
301e7145dcbSDimitry Andric 
ReleaseModule()302e7145dcbSDimitry Andric llvm::Module *CodeGenerator::ReleaseModule() {
303e7145dcbSDimitry Andric   return static_cast<CodeGeneratorImpl*>(this)->ReleaseModule();
304e7145dcbSDimitry Andric }
305e7145dcbSDimitry Andric 
getCGDebugInfo()30620e90f04SDimitry Andric CGDebugInfo *CodeGenerator::getCGDebugInfo() {
30720e90f04SDimitry Andric   return static_cast<CodeGeneratorImpl*>(this)->getCGDebugInfo();
30820e90f04SDimitry Andric }
30920e90f04SDimitry Andric 
GetDeclForMangledName(llvm::StringRef name)310e7145dcbSDimitry Andric const Decl *CodeGenerator::GetDeclForMangledName(llvm::StringRef name) {
311e7145dcbSDimitry Andric   return static_cast<CodeGeneratorImpl*>(this)->GetDeclForMangledName(name);
312e7145dcbSDimitry Andric }
313e7145dcbSDimitry Andric 
GetAddrOfGlobal(GlobalDecl global,bool isForDefinition)314e7145dcbSDimitry Andric llvm::Constant *CodeGenerator::GetAddrOfGlobal(GlobalDecl global,
315e7145dcbSDimitry Andric                                                bool isForDefinition) {
316e7145dcbSDimitry Andric   return static_cast<CodeGeneratorImpl*>(this)
317e7145dcbSDimitry Andric            ->GetAddrOfGlobal(global, isForDefinition);
318e7145dcbSDimitry Andric }
319e7145dcbSDimitry Andric 
StartModule(llvm::StringRef ModuleName,llvm::LLVMContext & C)3209a199699SDimitry Andric llvm::Module *CodeGenerator::StartModule(llvm::StringRef ModuleName,
3219a199699SDimitry Andric                                          llvm::LLVMContext &C) {
3229a199699SDimitry Andric   return static_cast<CodeGeneratorImpl*>(this)->StartModule(ModuleName, C);
3239a199699SDimitry Andric }
3249a199699SDimitry Andric 
CreateLLVMCodeGen(DiagnosticsEngine & Diags,llvm::StringRef ModuleName,const HeaderSearchOptions & HeaderSearchOpts,const PreprocessorOptions & PreprocessorOpts,const CodeGenOptions & CGO,llvm::LLVMContext & C,CoverageSourceInfo * CoverageInfo)3253dac3a9bSDimitry Andric CodeGenerator *clang::CreateLLVMCodeGen(
326e7145dcbSDimitry Andric     DiagnosticsEngine &Diags, llvm::StringRef ModuleName,
3273dac3a9bSDimitry Andric     const HeaderSearchOptions &HeaderSearchOpts,
3283dac3a9bSDimitry Andric     const PreprocessorOptions &PreprocessorOpts, const CodeGenOptions &CGO,
3293dac3a9bSDimitry Andric     llvm::LLVMContext &C, CoverageSourceInfo *CoverageInfo) {
3303dac3a9bSDimitry Andric   return new CodeGeneratorImpl(Diags, ModuleName, HeaderSearchOpts,
3313dac3a9bSDimitry Andric                                PreprocessorOpts, CGO, C, CoverageInfo);
332f22ef01cSRoman Divacky }
333