From f767e218ee1a900475db90e8a44fff07f3ef3a09 Mon Sep 17 00:00:00 2001 From: Devang Patel Date: Wed, 31 Oct 2007 00:59:29 +0000 Subject: [PATCH] Make target info available to clang code generator. This is far from complete but this helps clang codegen module make progress. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@43536 91177308-0d34-0410-b5e6-96231b3b80d8 --- CodeGen/CodeGenModule.cpp | 6 ++++-- CodeGen/CodeGenModule.h | 4 +++- CodeGen/CodeGenTypes.cpp | 5 +++-- CodeGen/CodeGenTypes.h | 4 +++- CodeGen/ModuleBuilder.cpp | 5 +++-- Driver/ASTConsumers.cpp | 16 +++++++++++++++- Driver/Makefile | 8 ++++++-- include/clang/Basic/TargetInfo.h | 5 +++++ include/clang/CodeGen/ModuleBuilder.h | 4 +++- 9 files changed, 45 insertions(+), 12 deletions(-) diff --git a/CodeGen/CodeGenModule.cpp b/CodeGen/CodeGenModule.cpp index a596c08528..8bb4c2e51e 100644 --- a/CodeGen/CodeGenModule.cpp +++ b/CodeGen/CodeGenModule.cpp @@ -24,8 +24,10 @@ using namespace clang; using namespace CodeGen; -CodeGenModule::CodeGenModule(ASTContext &C, llvm::Module &M) - : Context(C), TheModule(M), Types(C, M), CFConstantStringClassRef(0) {} +CodeGenModule::CodeGenModule(ASTContext &C, llvm::Module &M, + const llvm::TargetData &TD) + : Context(C), TheModule(M), TheTargetData(TD), + Types(C, M, TD), CFConstantStringClassRef(0) {} llvm::Constant *CodeGenModule::GetAddrOfGlobalDecl(const ValueDecl *D) { // See if it is already in the map. diff --git a/CodeGen/CodeGenModule.h b/CodeGen/CodeGenModule.h index 4ca4f8c550..a044c0d02e 100644 --- a/CodeGen/CodeGenModule.h +++ b/CodeGen/CodeGenModule.h @@ -23,6 +23,7 @@ namespace llvm { class Constant; class Function; class GlobalVariable; + class TargetData; } namespace clang { @@ -39,6 +40,7 @@ namespace CodeGen { class CodeGenModule { ASTContext &Context; llvm::Module &TheModule; + const llvm::TargetData &TheTargetData; CodeGenTypes Types; llvm::Function *MemCpyFn; @@ -49,7 +51,7 @@ class CodeGenModule { std::vector BuiltinFunctions; public: - CodeGenModule(ASTContext &C, llvm::Module &M); + CodeGenModule(ASTContext &C, llvm::Module &M, const llvm::TargetData &TD); ASTContext &getContext() const { return Context; } llvm::Module &getModule() const { return TheModule; } diff --git a/CodeGen/CodeGenTypes.cpp b/CodeGen/CodeGenTypes.cpp index 017b65c152..b65d596db7 100644 --- a/CodeGen/CodeGenTypes.cpp +++ b/CodeGen/CodeGenTypes.cpp @@ -60,8 +60,9 @@ namespace { }; } -CodeGenTypes::CodeGenTypes(ASTContext &Ctx, llvm::Module& M) - : Context(Ctx), Target(Ctx.Target), TheModule(M) { +CodeGenTypes::CodeGenTypes(ASTContext &Ctx, llvm::Module& M, + const llvm::TargetData &TD) + : Context(Ctx), Target(Ctx.Target), TheModule(M), TheTargetData(TD) { } CodeGenTypes::~CodeGenTypes() { diff --git a/CodeGen/CodeGenTypes.h b/CodeGen/CodeGenTypes.h index 95aea85c8e..fe012f70f3 100644 --- a/CodeGen/CodeGenTypes.h +++ b/CodeGen/CodeGenTypes.h @@ -21,6 +21,7 @@ namespace llvm { class Module; class Type; class PATypeHolder; + class TargetData; } namespace clang { @@ -61,6 +62,7 @@ class CodeGenTypes { ASTContext &Context; TargetInfo &Target; llvm::Module& TheModule; + const llvm::TargetData& TheTargetData; llvm::DenseMap TagDeclTypes; @@ -91,7 +93,7 @@ class CodeGenTypes { /// interface to convert type T into a llvm::Type. const llvm::Type *ConvertNewType(QualType T); public: - CodeGenTypes(ASTContext &Ctx, llvm::Module &M); + CodeGenTypes(ASTContext &Ctx, llvm::Module &M, const llvm::TargetData &TD); ~CodeGenTypes(); TargetInfo &getTarget() const { return Target; } diff --git a/CodeGen/ModuleBuilder.cpp b/CodeGen/ModuleBuilder.cpp index 4a5a470563..a7586b64c2 100644 --- a/CodeGen/ModuleBuilder.cpp +++ b/CodeGen/ModuleBuilder.cpp @@ -18,8 +18,9 @@ using namespace clang; /// Init - Create an ModuleBuilder with the specified ASTContext. clang::CodeGen::BuilderTy * -clang::CodeGen::Init(ASTContext &Context, llvm::Module &M) { - return new CodeGenModule(Context, M); +clang::CodeGen::Init(ASTContext &Context, llvm::Module &M, + const llvm::TargetData &TD) { + return new CodeGenModule(Context, M, TD); } void clang::CodeGen::Terminate(BuilderTy *B) { diff --git a/Driver/ASTConsumers.cpp b/Driver/ASTConsumers.cpp index 37d637bf10..0fcebcae4c 100644 --- a/Driver/ASTConsumers.cpp +++ b/Driver/ASTConsumers.cpp @@ -379,14 +379,19 @@ ASTConsumer *clang::CreateUnitValsChecker(Diagnostic &Diags) { // LLVM Emitter #include "clang/Basic/Diagnostic.h" +#include "clang/Basic/TargetInfo.h" #include "clang/CodeGen/ModuleBuilder.h" #include "llvm/Module.h" +#include "llvm/Target/TargetData.h" +#include "llvm/Target/TargetMachine.h" +#include "llvm/Target/TargetMachineRegistry.h" #include namespace { class LLVMEmitter : public ASTConsumer { Diagnostic &Diags; llvm::Module *M; + const llvm::TargetData *TD; ASTContext *Ctx; CodeGen::BuilderTy *Builder; public: @@ -394,7 +399,16 @@ namespace { virtual void Initialize(ASTContext &Context, unsigned MainFileID) { Ctx = &Context; M = new llvm::Module("foo"); - Builder = CodeGen::Init(Context, *M); + M->setTargetTriple(Ctx->Target.getTargetTriple()); + std::string Err; + const llvm::TargetMachineRegistry::entry *TME = + llvm::TargetMachineRegistry::getClosestStaticTargetForModule(*M, Err); + assert(TME && "Unable to determine target machine"); + // FIXME : Set appropriate subtarget features. + std::string FeatureStr; + llvm::TargetMachine *TheMachine = TME->CtorFn(*M, FeatureStr); + TD = TheMachine->getTargetData(); + Builder = CodeGen::Init(Context, *M, *TD); } virtual void HandleTopLevelDecl(Decl *D) { diff --git a/Driver/Makefile b/Driver/Makefile index 6d2cfe0a75..bf861514ec 100644 --- a/Driver/Makefile +++ b/Driver/Makefile @@ -4,8 +4,12 @@ CXXFLAGS = -fno-rtti TOOLNAME = clang USEDLIBS = clangCodeGen.a clangAnalysis.a clangRewrite.a clangSEMA.a \ - clangAST.a clangParse.a clangLex.a clangBasic.a \ + clangAST.a clangParse.a clangLex.a clangBasic.a LLVMX86 \ LLVMCore.a LLVMSupport.a LLVMSystem.a \ - LLVMBitWriter.a LLVMBitReader.a + LLVMBitWriter.a LLVMBitReader.a LLVMTarget.a LLVMCodeGen.a \ + LLVMSelectionDAG.a LLVMScalarOpts.a LLVMTransformUtils.a \ + LLVMCore.a LLVMAnalysis.a + + include $(LEVEL)/Makefile.common diff --git a/include/clang/Basic/TargetInfo.h b/include/clang/Basic/TargetInfo.h index 334f87851d..f766f9e26b 100644 --- a/include/clang/Basic/TargetInfo.h +++ b/include/clang/Basic/TargetInfo.h @@ -218,6 +218,11 @@ public: getLongLongInfo(Size, Align, Loc); return static_cast(Size); } + + const char *getTargetTriple() { + // FIXME ! + return "i686-apple-darwin9"; + } private: void ComputeWCharInfo(SourceLocation Loc); }; diff --git a/include/clang/CodeGen/ModuleBuilder.h b/include/clang/CodeGen/ModuleBuilder.h index 0b1ae476ed..96b0f59b8e 100644 --- a/include/clang/CodeGen/ModuleBuilder.h +++ b/include/clang/CodeGen/ModuleBuilder.h @@ -16,6 +16,7 @@ namespace llvm { class Module; + class TargetData; } namespace clang { @@ -29,7 +30,8 @@ namespace CodeGen { typedef void BuilderTy; /// Init - Create an ModuleBuilder with the specified ASTContext. - BuilderTy *Init(ASTContext &Context, llvm::Module &M); + BuilderTy *Init(ASTContext &Context, llvm::Module &M, + const llvm::TargetData &TD); /// CodeGenFunction - Convert the AST node for a FunctionDecl into LLVM. ///