]> granicus.if.org Git - clang/commitdiff
Take 2.
authorDevang Patel <dpatel@apple.com>
Wed, 31 Oct 2007 20:01:01 +0000 (20:01 +0000)
committerDevang Patel <dpatel@apple.com>
Wed, 31 Oct 2007 20:01:01 +0000 (20:01 +0000)
Make target info available to clang code generator.  This is far from complete but this helps clang codegen module make progress.

At the moment target triplet and target description strings are hard coded in clang::TargetInfo

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@43572 91177308-0d34-0410-b5e6-96231b3b80d8

CodeGen/CodeGenModule.cpp
CodeGen/CodeGenModule.h
CodeGen/CodeGenTypes.cpp
CodeGen/CodeGenTypes.h
CodeGen/ModuleBuilder.cpp
Driver/ASTConsumers.cpp
Driver/Makefile
include/clang/Basic/TargetInfo.h
include/clang/CodeGen/ModuleBuilder.h

index 70cefea3649f6719492da10f394f12d0ff5c4f5b..a2023e441ff21e78d8192149de434264b18e8966 100644 (file)
@@ -24,9 +24,10 @@ using namespace clang;
 using namespace CodeGen;
 
 
-CodeGenModule::CodeGenModule(ASTContext &C, llvm::Module &M)
-  : Context(C), TheModule(M),
-    Types(C, M), MemCpyFn(0), CFConstantStringClassRef(0) {}
+CodeGenModule::CodeGenModule(ASTContext &C, llvm::Module &M,
+                             const llvm::TargetData &TD)
+  : Context(C), TheModule(M), TheTargetData(TD),
+    Types(C, M, TD), MemCpyFn(0), CFConstantStringClassRef(0) {}
 
 llvm::Constant *CodeGenModule::GetAddrOfGlobalDecl(const ValueDecl *D) {
   // See if it is already in the map.
index 4ca4f8c55063e11e8f6b1b056446ec3275e6f68c..a044c0d02eef680418862dce1e6282015a2f1387 100644 (file)
@@ -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<llvm::Function *> 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; }
index 017b65c152c044f071dff15a9efe76ab290a921c..b65d596db70af59cde180dfdda0606bf9345fcf8 100644 (file)
@@ -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() {
index 95aea85c8eb3541f2461ffbc03ad6f23ad231df8..fe012f70f362649428709eb6a1972f4e25363904 100644 (file)
@@ -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<const TagDecl*, llvm::Type*> 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; }
index 4a5a470563b49b814d0c607fe4a484ae0c877ce9..a7586b64c2f6317266b8fc8713b879b5d5bcc69f 100644 (file)
@@ -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) {
index 37d637bf1008cadefe2db02807629fb1c43af783..04c238287a9717ff9494b76f0b863cc5d069a1e5 100644 (file)
@@ -379,14 +379,18 @@ 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 <iostream>
 
 namespace {
   class LLVMEmitter : public ASTConsumer {
     Diagnostic &Diags;
     llvm::Module *M;
+    const llvm::TargetData *TD;
     ASTContext *Ctx;
     CodeGen::BuilderTy *Builder;
   public:
@@ -394,7 +398,9 @@ 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());
+      TD = new llvm::TargetData(Ctx->Target.getTargetDescription());
+      Builder = CodeGen::Init(Context, *M, *TD);
     }
     
     virtual void HandleTopLevelDecl(Decl *D) {
index 6d2cfe0a750fea1277737de38d27d4b4de167410..7262cdc74a8e160ea8c3a1f03f5c3d5367c39036 100644 (file)
@@ -6,6 +6,8 @@ TOOLNAME = clang
 USEDLIBS = clangCodeGen.a clangAnalysis.a clangRewrite.a clangSEMA.a \
            clangAST.a clangParse.a clangLex.a clangBasic.a \
            LLVMCore.a LLVMSupport.a LLVMSystem.a \
-           LLVMBitWriter.a LLVMBitReader.a
+           LLVMBitWriter.a LLVMBitReader.a LLVMTarget.a 
+       
+       
 
 include $(LEVEL)/Makefile.common
index 334f87851d9709c8c59d122b971488ed65de8229..0637af864bb4cb1b8528c76fbd5c0859d4dc4efa 100644 (file)
@@ -218,6 +218,17 @@ public:
     getLongLongInfo(Size, Align, Loc);
     return static_cast<unsigned>(Size);
   }
+
+  const char *getTargetTriple() {
+    // FIXME !
+    return "i686-apple-darwin9";
+  }
+  const char *getTargetDescription() {
+    // FIXME !
+    // Hard code darwin-x86 for now.
+    return "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:\
+32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128";
+  }
 private:
   void ComputeWCharInfo(SourceLocation Loc);
 };
index 0b1ae476ed46b11bd1b3eb8d7c8b07c3bd8b97b0..96b0f59b8e95cc4d9ecbbd2592751c8602407d88 100644 (file)
@@ -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.
   ///