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