ModuleBuilder.cpp revision 198092
1238438Sdteske//===--- ModuleBuilder.cpp - Emit LLVM Code from ASTs ---------------------===// 2238438Sdteske// 3238438Sdteske// The LLVM Compiler Infrastructure 4249751Sdteske// 5238438Sdteske// This file is distributed under the University of Illinois Open Source 6238438Sdteske// License. See LICENSE.TXT for details. 7238438Sdteske// 8238438Sdteske//===----------------------------------------------------------------------===// 9238438Sdteske// 10238438Sdteske// This builds an AST and converts it to LLVM Code. 11238438Sdteske// 12238438Sdteske//===----------------------------------------------------------------------===// 13238438Sdteske 14238438Sdteske#include "clang/CodeGen/ModuleBuilder.h" 15238438Sdteske#include "CodeGenModule.h" 16238438Sdteske#include "clang/Frontend/CompileOptions.h" 17238438Sdteske#include "clang/AST/ASTContext.h" 18238438Sdteske#include "clang/AST/DeclObjC.h" 19238438Sdteske#include "clang/AST/Expr.h" 20238438Sdteske#include "clang/Basic/Diagnostic.h" 21238438Sdteske#include "clang/Basic/TargetInfo.h" 22238438Sdteske#include "llvm/LLVMContext.h" 23238438Sdteske#include "llvm/Module.h" 24238438Sdteske#include "llvm/Target/TargetData.h" 25238438Sdteske#include "llvm/Support/Compiler.h" 26238438Sdteske#include "llvm/ADT/OwningPtr.h" 27238438Sdteskeusing namespace clang; 28238438Sdteske 29238438Sdteske 30238438Sdteskenamespace { 31238438Sdteske class VISIBILITY_HIDDEN CodeGeneratorImpl : public CodeGenerator { 32240684Sdteske Diagnostic &Diags; 33240684Sdteske llvm::OwningPtr<const llvm::TargetData> TD; 34244675Sdteske ASTContext *Ctx; 35240684Sdteske const CompileOptions CompileOpts; // Intentionally copied in. 36240684Sdteske protected: 37240684Sdteske llvm::OwningPtr<llvm::Module> M; 38240684Sdteske llvm::OwningPtr<CodeGen::CodeGenModule> Builder; 39238438Sdteske public: 40238438Sdteske CodeGeneratorImpl(Diagnostic &diags, const std::string& ModuleName, 41238438Sdteske const CompileOptions &CO, llvm::LLVMContext& C) 42238438Sdteske : Diags(diags), CompileOpts(CO), M(new llvm::Module(ModuleName, C)) {} 43238438Sdteske 44238438Sdteske virtual ~CodeGeneratorImpl() {} 45238438Sdteske 46238438Sdteske virtual llvm::Module* GetModule() { 47238438Sdteske return M.get(); 48238438Sdteske } 49238438Sdteske 50238438Sdteske virtual llvm::Module* ReleaseModule() { 51238438Sdteske return M.take(); 52238438Sdteske } 53238438Sdteske 54238438Sdteske virtual void Initialize(ASTContext &Context) { 55238438Sdteske Ctx = &Context; 56238438Sdteske 57238438Sdteske M->setTargetTriple(Ctx->Target.getTriple().getTriple()); 58238438Sdteske M->setDataLayout(Ctx->Target.getTargetDescription()); 59238438Sdteske TD.reset(new llvm::TargetData(Ctx->Target.getTargetDescription())); 60238438Sdteske Builder.reset(new CodeGen::CodeGenModule(Context, CompileOpts, 61249751Sdteske *M, *TD, Diags)); 62238438Sdteske } 63249751Sdteske 64249751Sdteske virtual void HandleTopLevelDecl(DeclGroupRef DG) { 65238438Sdteske // Make sure to emit all elements of a Decl. 66238438Sdteske for (DeclGroupRef::iterator I = DG.begin(), E = DG.end(); I != E; ++I) 67238438Sdteske Builder->EmitTopLevelDecl(*I); 68249751Sdteske } 69251190Sdteske 70238438Sdteske /// HandleTagDeclDefinition - This callback is invoked each time a TagDecl 71238438Sdteske /// to (e.g. struct, union, enum, class) is completed. This allows the 72238438Sdteske /// client hack on the type, which can occur at any point in the file 73238438Sdteske /// (because these can be defined in declspecs). 74238438Sdteske virtual void HandleTagDeclDefinition(TagDecl *D) { 75238438Sdteske Builder->UpdateCompletedType(D); 76238438Sdteske } 77238438Sdteske 78238438Sdteske virtual void HandleTranslationUnit(ASTContext &Ctx) { 79238438Sdteske if (Diags.hasErrorOccurred()) { 80238438Sdteske M.reset(); 81238438Sdteske return; 82238438Sdteske } 83251190Sdteske 84251190Sdteske if (Builder) 85251190Sdteske Builder->Release(); 86251190Sdteske }; 87251190Sdteske 88251190Sdteske virtual void CompleteTentativeDefinition(VarDecl *D) { 89251190Sdteske if (Diags.hasErrorOccurred()) 90238438Sdteske return; 91240768Sdteske 92240768Sdteske Builder->EmitTentativeDefinition(D); 93249751Sdteske } 94238438Sdteske }; 95238438Sdteske} 96238438Sdteske 97238438SdteskeCodeGenerator *clang::CreateLLVMCodeGen(Diagnostic &Diags, 98249751Sdteske const std::string& ModuleName, 99251190Sdteske const CompileOptions &CO, 100251190Sdteske llvm::LLVMContext& C) { 101251190Sdteske return new CodeGeneratorImpl(Diags, ModuleName, CO, C); 102240768Sdteske} 103240768Sdteske