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