XCoreTargetMachine.cpp 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. //===-- XCoreTargetMachine.cpp - Define TargetMachine for XCore -----------===//
  2. //
  3. // The LLVM Compiler Infrastructure
  4. //
  5. // This file is distributed under the University of Illinois Open Source
  6. // License. See LICENSE.TXT for details.
  7. //
  8. //===----------------------------------------------------------------------===//
  9. //
  10. //
  11. //===----------------------------------------------------------------------===//
  12. #include "MCTargetDesc/XCoreMCTargetDesc.h"
  13. #include "XCore.h"
  14. #include "XCoreTargetMachine.h"
  15. #include "XCoreTargetObjectFile.h"
  16. #include "XCoreTargetTransformInfo.h"
  17. #include "llvm/ADT/Optional.h"
  18. #include "llvm/ADT/STLExtras.h"
  19. #include "llvm/Analysis/TargetTransformInfo.h"
  20. #include "llvm/CodeGen/Passes.h"
  21. #include "llvm/CodeGen/TargetPassConfig.h"
  22. #include "llvm/Support/CodeGen.h"
  23. #include "llvm/Support/TargetRegistry.h"
  24. using namespace llvm;
  25. static Reloc::Model getEffectiveRelocModel(Optional<Reloc::Model> RM) {
  26. if (!RM.hasValue())
  27. return Reloc::Static;
  28. return *RM;
  29. }
  30. /// Create an ILP32 architecture model
  31. ///
  32. XCoreTargetMachine::XCoreTargetMachine(const Target &T, const Triple &TT,
  33. StringRef CPU, StringRef FS,
  34. const TargetOptions &Options,
  35. Optional<Reloc::Model> RM,
  36. CodeModel::Model CM,
  37. CodeGenOpt::Level OL)
  38. : LLVMTargetMachine(
  39. T, "e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32-f64:32-a:0:32-n32",
  40. TT, CPU, FS, Options, getEffectiveRelocModel(RM), CM, OL),
  41. TLOF(llvm::make_unique<XCoreTargetObjectFile>()),
  42. Subtarget(TT, CPU, FS, *this) {
  43. initAsmInfo();
  44. }
  45. XCoreTargetMachine::~XCoreTargetMachine() = default;
  46. namespace {
  47. /// XCore Code Generator Pass Configuration Options.
  48. class XCorePassConfig : public TargetPassConfig {
  49. public:
  50. XCorePassConfig(XCoreTargetMachine *TM, PassManagerBase &PM)
  51. : TargetPassConfig(TM, PM) {}
  52. XCoreTargetMachine &getXCoreTargetMachine() const {
  53. return getTM<XCoreTargetMachine>();
  54. }
  55. void addIRPasses() override;
  56. bool addPreISel() override;
  57. bool addInstSelector() override;
  58. void addPreEmitPass() override;
  59. };
  60. } // end anonymous namespace
  61. TargetPassConfig *XCoreTargetMachine::createPassConfig(PassManagerBase &PM) {
  62. return new XCorePassConfig(this, PM);
  63. }
  64. void XCorePassConfig::addIRPasses() {
  65. addPass(createAtomicExpandPass());
  66. TargetPassConfig::addIRPasses();
  67. }
  68. bool XCorePassConfig::addPreISel() {
  69. addPass(createXCoreLowerThreadLocalPass());
  70. return false;
  71. }
  72. bool XCorePassConfig::addInstSelector() {
  73. addPass(createXCoreISelDag(getXCoreTargetMachine(), getOptLevel()));
  74. return false;
  75. }
  76. void XCorePassConfig::addPreEmitPass() {
  77. addPass(createXCoreFrameToArgsOffsetEliminationPass(), false);
  78. }
  79. // Force static initialization.
  80. extern "C" void LLVMInitializeXCoreTarget() {
  81. RegisterTargetMachine<XCoreTargetMachine> X(getTheXCoreTarget());
  82. }
  83. TargetIRAnalysis XCoreTargetMachine::getTargetIRAnalysis() {
  84. return TargetIRAnalysis([this](const Function &F) {
  85. return TargetTransformInfo(XCoreTTIImpl(this, F));
  86. });
  87. }