X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FTarget%2FXCore%2FXCoreTargetMachine.cpp;h=82df1c984bebe2f9594a256ec5512f5029410887;hb=a6a87b595d3434175ee87d96d1fe182357cf2611;hp=42b98753ecfbe0806624db7e85af17e3e4e30381;hpb=2286f8dc4cec0625f7d7a14e2570926cf8599646;p=oota-llvm.git diff --git a/lib/Target/XCore/XCoreTargetMachine.cpp b/lib/Target/XCore/XCoreTargetMachine.cpp index 42b98753ecf..82df1c984be 100644 --- a/lib/Target/XCore/XCoreTargetMachine.cpp +++ b/lib/Target/XCore/XCoreTargetMachine.cpp @@ -10,65 +10,78 @@ // //===----------------------------------------------------------------------===// -#include "XCoreTargetAsmInfo.h" #include "XCoreTargetMachine.h" +#include "XCoreTargetObjectFile.h" #include "XCore.h" -#include "llvm/Module.h" +#include "llvm/CodeGen/Passes.h" +#include "llvm/IR/Module.h" #include "llvm/PassManager.h" -#include "llvm/Target/TargetMachineRegistry.h" +#include "llvm/Support/TargetRegistry.h" using namespace llvm; -/// XCoreTargetMachineModule - Note that this is used on hosts that -/// cannot link in a library unless there are references into the -/// library. In particular, it seems that it is not possible to get -/// things to work on Win32 without this. Though it is unused, do not -/// remove it. -extern "C" int XCoreTargetMachineModule; -int XCoreTargetMachineModule = 0; +/// XCoreTargetMachine ctor - Create an ILP32 architecture model +/// +XCoreTargetMachine::XCoreTargetMachine(const Target &T, StringRef TT, + StringRef CPU, StringRef FS, + const TargetOptions &Options, + Reloc::Model RM, CodeModel::Model CM, + CodeGenOpt::Level OL) + : LLVMTargetMachine(T, TT, CPU, FS, Options, RM, CM, OL), + TLOF(make_unique()), + DL("e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32-f64:32-a:0:32-n32"), + Subtarget(TT, CPU, FS, *this) { + initAsmInfo(); +} + +XCoreTargetMachine::~XCoreTargetMachine() {} namespace { - // Register the target. - RegisterTarget X("xcore", "XCore"); -} +/// XCore Code Generator Pass Configuration Options. +class XCorePassConfig : public TargetPassConfig { +public: + XCorePassConfig(XCoreTargetMachine *TM, PassManagerBase &PM) + : TargetPassConfig(TM, PM) {} -// Force static initialization. -extern "C" void LLVMInitializeXCoreTarget() { } + XCoreTargetMachine &getXCoreTargetMachine() const { + return getTM(); + } -const TargetAsmInfo *XCoreTargetMachine::createTargetAsmInfo() const { - return new XCoreTargetAsmInfo(*this); -} + void addIRPasses() override; + bool addPreISel() override; + bool addInstSelector() override; + void addPreEmitPass() override; +}; +} // namespace -/// XCoreTargetMachine ctor - Create an ILP32 architecture model -/// -XCoreTargetMachine::XCoreTargetMachine(const Module &M, const std::string &FS) - : Subtarget(*this, M, FS), - DataLayout("e-p:32:32:32-a0:0:32-f32:32:32-f64:32:32-i1:8:32-i8:8:32-" - "i16:16:32-i32:32:32-i64:32:32"), - InstrInfo(), - FrameInfo(*this), - TLInfo(*this) { +TargetPassConfig *XCoreTargetMachine::createPassConfig(PassManagerBase &PM) { + return new XCorePassConfig(this, PM); } -unsigned XCoreTargetMachine::getModuleMatchQuality(const Module &M) { - std::string TT = M.getTargetTriple(); - if (TT.size() >= 6 && std::string(TT.begin(), TT.begin()+6) == "xcore-") - return 20; - - // Otherwise we don't match. - return 0; +void XCorePassConfig::addIRPasses() { + addPass(createAtomicExpandPass(&getXCoreTargetMachine())); + + TargetPassConfig::addIRPasses(); } -bool XCoreTargetMachine::addInstSelector(PassManagerBase &PM, - CodeGenOpt::Level OptLevel) { - PM.add(createXCoreISelDag(*this)); +bool XCorePassConfig::addPreISel() { + addPass(createXCoreLowerThreadLocalPass()); return false; } -bool XCoreTargetMachine::addAssemblyEmitter(PassManagerBase &PM, - CodeGenOpt::Level OptLevel, - bool Verbose, - formatted_raw_ostream &Out) { - // Output assembly language. - PM.add(createXCoreCodePrinterPass(Out, *this, Verbose)); +bool XCorePassConfig::addInstSelector() { + addPass(createXCoreISelDag(getXCoreTargetMachine(), getOptLevel())); return false; } + +void XCorePassConfig::addPreEmitPass() { + addPass(createXCoreFrameToArgsOffsetEliminationPass(), false); +} + +// Force static initialization. +extern "C" void LLVMInitializeXCoreTarget() { + RegisterTargetMachine X(TheXCoreTarget); +} + +void XCoreTargetMachine::addAnalysisPasses(PassManagerBase &PM) { + PM.add(createXCoreTargetTransformInfoPass(this)); +}