1b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne//===-- XCoreTargetMachine.cpp - Define TargetMachine for XCore -----------===// 2b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne// 3b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne// The LLVM Compiler Infrastructure 4b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne// 5b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne// This file is distributed under the University of Illinois Open Source 6b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne// License. See LICENSE.TXT for details. 7b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne// 8b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne//===----------------------------------------------------------------------===// 9b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne// 10b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne// 11b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne//===----------------------------------------------------------------------===// 12b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne 13b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne#include "XCoreTargetMachine.h" 14b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne#include "XCore.h" 15d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/CodeGen/Passes.h" 160b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Module.h" 17b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne#include "llvm/PassManager.h" 183e74d6fdd248e20a280f1dff3da9a6c689c2c4c3Evan Cheng#include "llvm/Support/TargetRegistry.h" 19b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborneusing namespace llvm; 20b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne 21b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne/// XCoreTargetMachine ctor - Create an ILP32 architecture model 22b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne/// 23439661395fd2a2a832dba01c65bc88718528313cEvan ChengXCoreTargetMachine::XCoreTargetMachine(const Target &T, StringRef TT, 2434ad6db8b958fdc0d38e122edf753b5326e69b03Evan Cheng StringRef CPU, StringRef FS, 258a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky const TargetOptions &Options, 26b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng Reloc::Model RM, CodeModel::Model CM, 27b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng CodeGenOpt::Level OL) 288a8d479214745c82ef00f08d4e4f1c173b5f9ce2Nick Lewycky : LLVMTargetMachine(T, TT, CPU, FS, Options, RM, CM, OL), 29276365dd4bc0c2160f91fd8062ae1fc90c86c324Evan Cheng Subtarget(TT, CPU, FS), 303574eca1b02600bac4e625297f4ecf745f4c4f32Micah Villmow DL("e-p:32:32:32-a0:0:32-f32:32:32-f64:32:32-i1:8:32-i8:8:32-" 3159a9178fbedb88427c8ff9e5fa7a8f2038f80a2eChris Lattner "i16:16:32-i32:32:32-i64:32:32-n32"), 32b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne InstrInfo(), 3316c29b5f285f375be53dabaa73e3e91107485fe4Anton Korobeynikov FrameLowering(Subtarget), 34ff7a562751604a9fe13efc75bd59622244b54d35Dan Gohman TLInfo(*this), 35aeef83c6afa1e18d1cf9d359cc678ca0ad556175Chandler Carruth TSInfo(*this) { 364a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindola initAsmInfo(); 37b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne} 38b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne 39843ee2e6a46b2b2d74a84c2eea68dec35cb359ccAndrew Tricknamespace { 40843ee2e6a46b2b2d74a84c2eea68dec35cb359ccAndrew Trick/// XCore Code Generator Pass Configuration Options. 41843ee2e6a46b2b2d74a84c2eea68dec35cb359ccAndrew Trickclass XCorePassConfig : public TargetPassConfig { 42843ee2e6a46b2b2d74a84c2eea68dec35cb359ccAndrew Trickpublic: 43061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick XCorePassConfig(XCoreTargetMachine *TM, PassManagerBase &PM) 44061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick : TargetPassConfig(TM, PM) {} 45843ee2e6a46b2b2d74a84c2eea68dec35cb359ccAndrew Trick 46843ee2e6a46b2b2d74a84c2eea68dec35cb359ccAndrew Trick XCoreTargetMachine &getXCoreTargetMachine() const { 47843ee2e6a46b2b2d74a84c2eea68dec35cb359ccAndrew Trick return getTM<XCoreTargetMachine>(); 48843ee2e6a46b2b2d74a84c2eea68dec35cb359ccAndrew Trick } 49843ee2e6a46b2b2d74a84c2eea68dec35cb359ccAndrew Trick 50597432fbe53bda0069b0ad13e5ad57ae0ee7ee45Richard Osborne virtual bool addPreISel(); 51843ee2e6a46b2b2d74a84c2eea68dec35cb359ccAndrew Trick virtual bool addInstSelector(); 52843ee2e6a46b2b2d74a84c2eea68dec35cb359ccAndrew Trick}; 53843ee2e6a46b2b2d74a84c2eea68dec35cb359ccAndrew Trick} // namespace 54843ee2e6a46b2b2d74a84c2eea68dec35cb359ccAndrew Trick 55061efcfb3e79899493d857f49e50d09f29037e0aAndrew TrickTargetPassConfig *XCoreTargetMachine::createPassConfig(PassManagerBase &PM) { 56061efcfb3e79899493d857f49e50d09f29037e0aAndrew Trick return new XCorePassConfig(this, PM); 57843ee2e6a46b2b2d74a84c2eea68dec35cb359ccAndrew Trick} 58843ee2e6a46b2b2d74a84c2eea68dec35cb359ccAndrew Trick 59597432fbe53bda0069b0ad13e5ad57ae0ee7ee45Richard Osbornebool XCorePassConfig::addPreISel() { 60597432fbe53bda0069b0ad13e5ad57ae0ee7ee45Richard Osborne addPass(createXCoreLowerThreadLocalPass()); 61597432fbe53bda0069b0ad13e5ad57ae0ee7ee45Richard Osborne return false; 62597432fbe53bda0069b0ad13e5ad57ae0ee7ee45Richard Osborne} 63597432fbe53bda0069b0ad13e5ad57ae0ee7ee45Richard Osborne 64843ee2e6a46b2b2d74a84c2eea68dec35cb359ccAndrew Trickbool XCorePassConfig::addInstSelector() { 65564fbf6aff8fb95646a1290078a37c2d4dbe629fBob Wilson addPass(createXCoreISelDag(getXCoreTargetMachine(), getOptLevel())); 66b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne return false; 67b25baef26f03b9909b65dd5f762b38f93000445dRichard Osborne} 681c8c15f6d2f3f7ffbeff5daa211907dff1b13650Richard Osborne 691c8c15f6d2f3f7ffbeff5daa211907dff1b13650Richard Osborne// Force static initialization. 701c8c15f6d2f3f7ffbeff5daa211907dff1b13650Richard Osborneextern "C" void LLVMInitializeXCoreTarget() { 711c8c15f6d2f3f7ffbeff5daa211907dff1b13650Richard Osborne RegisterTargetMachine<XCoreTargetMachine> X(TheXCoreTarget); 721c8c15f6d2f3f7ffbeff5daa211907dff1b13650Richard Osborne} 73