1 //===-- XCoreTargetMachine.cpp - Define TargetMachine for XCore -----------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // 10 //===----------------------------------------------------------------------===// 11 12 #include "XCoreTargetMachine.h" 13 #include "MCTargetDesc/XCoreMCTargetDesc.h" 14 #include "TargetInfo/XCoreTargetInfo.h" 15 #include "XCore.h" 16 #include "XCoreTargetObjectFile.h" 17 #include "XCoreTargetTransformInfo.h" 18 #include "llvm/ADT/Optional.h" 19 #include "llvm/ADT/STLExtras.h" 20 #include "llvm/Analysis/TargetTransformInfo.h" 21 #include "llvm/CodeGen/Passes.h" 22 #include "llvm/CodeGen/TargetPassConfig.h" 23 #include "llvm/MC/TargetRegistry.h" 24 #include "llvm/Support/CodeGen.h" 25 26 using namespace llvm; 27 28 static Reloc::Model getEffectiveRelocModel(Optional<Reloc::Model> RM) { 29 return RM.value_or(Reloc::Static); 30 } 31 32 static CodeModel::Model 33 getEffectiveXCoreCodeModel(Optional<CodeModel::Model> CM) { 34 if (CM) { 35 if (*CM != CodeModel::Small && *CM != CodeModel::Large) 36 report_fatal_error("Target only supports CodeModel Small or Large"); 37 return *CM; 38 } 39 return CodeModel::Small; 40 } 41 42 /// Create an ILP32 architecture model 43 /// 44 XCoreTargetMachine::XCoreTargetMachine(const Target &T, const Triple &TT, 45 StringRef CPU, StringRef FS, 46 const TargetOptions &Options, 47 Optional<Reloc::Model> RM, 48 Optional<CodeModel::Model> CM, 49 CodeGenOpt::Level OL, bool JIT) 50 : LLVMTargetMachine( 51 T, "e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32-f64:32-a:0:32-n32", 52 TT, CPU, FS, Options, getEffectiveRelocModel(RM), 53 getEffectiveXCoreCodeModel(CM), OL), 54 TLOF(std::make_unique<XCoreTargetObjectFile>()), 55 Subtarget(TT, std::string(CPU), std::string(FS), *this) { 56 initAsmInfo(); 57 } 58 59 XCoreTargetMachine::~XCoreTargetMachine() = default; 60 61 namespace { 62 63 /// XCore Code Generator Pass Configuration Options. 64 class XCorePassConfig : public TargetPassConfig { 65 public: 66 XCorePassConfig(XCoreTargetMachine &TM, PassManagerBase &PM) 67 : TargetPassConfig(TM, PM) {} 68 69 XCoreTargetMachine &getXCoreTargetMachine() const { 70 return getTM<XCoreTargetMachine>(); 71 } 72 73 void addIRPasses() override; 74 bool addPreISel() override; 75 bool addInstSelector() override; 76 void addPreEmitPass() override; 77 }; 78 79 } // end anonymous namespace 80 81 TargetPassConfig *XCoreTargetMachine::createPassConfig(PassManagerBase &PM) { 82 return new XCorePassConfig(*this, PM); 83 } 84 85 void XCorePassConfig::addIRPasses() { 86 addPass(createAtomicExpandPass()); 87 88 TargetPassConfig::addIRPasses(); 89 } 90 91 bool XCorePassConfig::addPreISel() { 92 addPass(createXCoreLowerThreadLocalPass()); 93 return false; 94 } 95 96 bool XCorePassConfig::addInstSelector() { 97 addPass(createXCoreISelDag(getXCoreTargetMachine(), getOptLevel())); 98 return false; 99 } 100 101 void XCorePassConfig::addPreEmitPass() { 102 addPass(createXCoreFrameToArgsOffsetEliminationPass()); 103 } 104 105 // Force static initialization. 106 extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeXCoreTarget() { 107 RegisterTargetMachine<XCoreTargetMachine> X(getTheXCoreTarget()); 108 } 109 110 TargetTransformInfo 111 XCoreTargetMachine::getTargetTransformInfo(const Function &F) const { 112 return TargetTransformInfo(XCoreTTIImpl(this, F)); 113 } 114