зеркало из https://github.com/microsoft/clang-1.git
Take 2.
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
This commit is contained in:
Родитель
5451350ea6
Коммит
7a4718e813
|
@ -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.
|
||||
|
|
|
@ -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; }
|
||||
|
|
|
@ -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() {
|
||||
|
|
|
@ -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; }
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
};
|
||||
|
|
|
@ -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.
|
||||
///
|
||||
|
|
Загрузка…
Ссылка в новой задаче