diff options
author | Ted Kremenek <kremenek@apple.com> | 2008-08-05 18:50:11 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2008-08-05 18:50:11 +0000 |
commit | 815c78fd9ab8bd5dfe8e8a91b8c6a413e2b8c889 (patch) | |
tree | 547c2e5fd353b83e909ad60e9292bb3af8037ace /lib/CodeGen | |
parent | a11440b68a02d54cd9c4b54160b0e339e0f30754 (diff) |
Refactored driver logic for CodeGen into LLVMCodeGenWriter. This ASTConsumer layers on top of LLVMCodeGen (another existing ASTConsumer) to emit bitcode files to disk. This layering takes this logic out of clang.cpp and puts it directly into the ASTConsumer interface. The benefit is that now --emit-llvm works with both serialized ASTs and regular source files.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@54364 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen')
-rw-r--r-- | lib/CodeGen/CodeGenModule.cpp | 12 | ||||
-rw-r--r-- | lib/CodeGen/CodeGenModule.h | 9 | ||||
-rw-r--r-- | lib/CodeGen/ModuleBuilder.cpp | 49 |
3 files changed, 42 insertions, 28 deletions
diff --git a/lib/CodeGen/CodeGenModule.cpp b/lib/CodeGen/CodeGenModule.cpp index 5d85b7a70f..0c3b872b9a 100644 --- a/lib/CodeGen/CodeGenModule.cpp +++ b/lib/CodeGen/CodeGenModule.cpp @@ -42,13 +42,15 @@ CodeGenModule::CodeGenModule(ASTContext &C, const LangOptions &LO, Runtime = CreateObjCRuntime(*this); // If debug info generation is enabled, create the CGDebugInfo object. - if (GenerateDebugInfo) - DebugInfo = new CGDebugInfo(this); - else - DebugInfo = NULL; + DebugInfo = GenerateDebugInfo ? new CGDebugInfo(this) : 0; } CodeGenModule::~CodeGenModule() { + delete Runtime; + delete DebugInfo; +} + +void CodeGenModule::Release() { EmitStatics(); llvm::Function *ObjCInitFunction = Runtime->ModuleInitFunction(); if (ObjCInitFunction) @@ -56,8 +58,6 @@ CodeGenModule::~CodeGenModule() { EmitCtorList(GlobalCtors, "llvm.global_ctors"); EmitCtorList(GlobalDtors, "llvm.global_dtors"); EmitAnnotations(); - delete Runtime; - delete DebugInfo; // Run the verifier to check that the generated code is consistent. assert(!verifyModule(TheModule)); } diff --git a/lib/CodeGen/CodeGenModule.h b/lib/CodeGen/CodeGenModule.h index 1fb2cf7ae0..bb5de154fb 100644 --- a/lib/CodeGen/CodeGenModule.h +++ b/lib/CodeGen/CodeGenModule.h @@ -19,6 +19,7 @@ #include "clang/AST/Attr.h" #include "llvm/ADT/DenseMap.h" #include "llvm/ADT/StringMap.h" +#include "llvm/ADT/OwningPtr.h" namespace llvm { class Module; @@ -62,8 +63,8 @@ class CodeGenModule { const llvm::TargetData &TheTargetData; Diagnostic &Diags; CodeGenTypes Types; - CGObjCRuntime *Runtime; - CGDebugInfo *DebugInfo; + CGObjCRuntime* Runtime; + CGDebugInfo* DebugInfo; llvm::Function *MemCpyFn; llvm::Function *MemMoveFn; @@ -103,8 +104,12 @@ public: CodeGenModule(ASTContext &C, const LangOptions &Features, llvm::Module &M, const llvm::TargetData &TD, Diagnostic &Diags, bool GenerateDebugInfo); + ~CodeGenModule(); + /// Release - Finalize LLVM code generation. + void Release(); + CGObjCRuntime *getObjCRuntime() { return Runtime; } CGDebugInfo *getDebugInfo() { return DebugInfo; } ASTContext &getContext() const { return Context; } diff --git a/lib/CodeGen/ModuleBuilder.cpp b/lib/CodeGen/ModuleBuilder.cpp index 201092f4d8..7329ed1d90 100644 --- a/lib/CodeGen/ModuleBuilder.cpp +++ b/lib/CodeGen/ModuleBuilder.cpp @@ -13,7 +13,6 @@ #include "clang/CodeGen/ModuleBuilder.h" #include "CodeGenModule.h" -#include "clang/AST/ASTConsumer.h" #include "clang/AST/ASTContext.h" #include "clang/AST/Decl.h" using namespace clang; @@ -27,26 +26,37 @@ using namespace clang; #include "llvm/Module.h" #include "llvm/Target/TargetData.h" #include "llvm/Target/TargetMachine.h" +#include "llvm/Support/Compiler.h" +#include "llvm/ADT/OwningPtr.h" + namespace { - class CodeGenerator : public ASTConsumer { + class VISIBILITY_HIDDEN CodeGeneratorImpl : public CodeGenerator { Diagnostic &Diags; - const llvm::TargetData *TD; + llvm::OwningPtr<const llvm::TargetData> TD; ASTContext *Ctx; const LangOptions &Features; bool GenerateDebugInfo; protected: - llvm::Module *&M; - CodeGen::CodeGenModule *Builder; + llvm::OwningPtr<llvm::Module> M; + llvm::OwningPtr<CodeGen::CodeGenModule> Builder; public: - CodeGenerator(Diagnostic &diags, const LangOptions &LO, - llvm::Module *&DestModule, bool DebugInfoFlag) + CodeGeneratorImpl(Diagnostic &diags, const LangOptions &LO, + const std::string& ModuleName, + bool DebugInfoFlag) : Diags(diags), Features(LO), GenerateDebugInfo(DebugInfoFlag), - M(DestModule) {} + M(new llvm::Module(ModuleName)) {} + + virtual ~CodeGeneratorImpl() {} - ~CodeGenerator() { - delete Builder; - delete TD; + virtual llvm::Module* ReleaseModule() { + if (Diags.hasErrorOccurred()) + return 0; + + if (Builder) + Builder->Release(); + + return M.take(); } virtual void Initialize(ASTContext &Context) { @@ -54,9 +64,9 @@ namespace { M->setTargetTriple(Ctx->Target.getTargetTriple()); M->setDataLayout(Ctx->Target.getTargetDescription()); - TD = new llvm::TargetData(Ctx->Target.getTargetDescription()); - Builder = new CodeGen::CodeGenModule(Context, Features, *M, *TD, Diags, - GenerateDebugInfo); + TD.reset(new llvm::TargetData(Ctx->Target.getTargetDescription())); + Builder.reset(new CodeGen::CodeGenModule(Context, Features, *M, *TD, + Diags, GenerateDebugInfo)); } virtual void HandleTopLevelDecl(Decl *D) { @@ -128,10 +138,9 @@ namespace { }; } -ASTConsumer *clang::CreateLLVMCodeGen(Diagnostic &Diags, - const LangOptions &Features, - llvm::Module *&DestModule, - bool GenerateDebugInfo) { - return new CodeGenerator(Diags, Features, DestModule, GenerateDebugInfo); +CodeGenerator *clang::CreateLLVMCodeGen(Diagnostic &Diags, + const LangOptions &Features, + const std::string& ModuleName, + bool GenerateDebugInfo) { + return new CodeGeneratorImpl(Diags, Features, ModuleName, GenerateDebugInfo); } - |