1 //===- ARCTargetMachine.cpp - Define TargetMachine for ARC ------*- C++ -*-===// 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 13 #include "ARCTargetMachine.h" 14 #include "ARC.h" 15 #include "ARCTargetTransformInfo.h" 16 #include "llvm/CodeGen/Passes.h" 17 #include "llvm/CodeGen/TargetLoweringObjectFileImpl.h" 18 #include "llvm/CodeGen/TargetPassConfig.h" 19 #include "llvm/Support/TargetRegistry.h" 20 21 using namespace llvm; 22 23 static Reloc::Model getRelocModel(Optional<Reloc::Model> RM) { 24 if (!RM.hasValue()) 25 return Reloc::Static; 26 return *RM; 27 } 28 29 static CodeModel::Model getEffectiveCodeModel(Optional<CodeModel::Model> CM) { 30 if (CM) 31 return *CM; 32 return CodeModel::Small; 33 } 34 35 /// ARCTargetMachine ctor - Create an ILP32 architecture model 36 ARCTargetMachine::ARCTargetMachine(const Target &T, const Triple &TT, 37 StringRef CPU, StringRef FS, 38 const TargetOptions &Options, 39 Optional<Reloc::Model> RM, 40 Optional<CodeModel::Model> CM, 41 CodeGenOpt::Level OL, bool JIT) 42 : LLVMTargetMachine(T, 43 "e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-" 44 "f32:32:32-i64:32-f64:32-a:0:32-n32", 45 TT, CPU, FS, Options, getRelocModel(RM), 46 getEffectiveCodeModel(CM), OL), 47 TLOF(make_unique<TargetLoweringObjectFileELF>()), 48 Subtarget(TT, CPU, FS, *this) { 49 initAsmInfo(); 50 } 51 52 ARCTargetMachine::~ARCTargetMachine() = default; 53 54 namespace { 55 56 /// ARC Code Generator Pass Configuration Options. 57 class ARCPassConfig : public TargetPassConfig { 58 public: 59 ARCPassConfig(ARCTargetMachine &TM, PassManagerBase &PM) 60 : TargetPassConfig(TM, PM) {} 61 62 ARCTargetMachine &getARCTargetMachine() const { 63 return getTM<ARCTargetMachine>(); 64 } 65 66 bool addInstSelector() override; 67 void addPreEmitPass() override; 68 void addPreRegAlloc() override; 69 }; 70 71 } // end anonymous namespace 72 73 TargetPassConfig *ARCTargetMachine::createPassConfig(PassManagerBase &PM) { 74 return new ARCPassConfig(*this, PM); 75 } 76 77 bool ARCPassConfig::addInstSelector() { 78 addPass(createARCISelDag(getARCTargetMachine(), getOptLevel())); 79 return false; 80 } 81 82 void ARCPassConfig::addPreEmitPass() { addPass(createARCBranchFinalizePass()); } 83 84 void ARCPassConfig::addPreRegAlloc() { addPass(createARCExpandPseudosPass()); } 85 86 // Force static initialization. 87 extern "C" void LLVMInitializeARCTarget() { 88 RegisterTargetMachine<ARCTargetMachine> X(getTheARCTarget()); 89 } 90 91 TargetIRAnalysis ARCTargetMachine::getTargetIRAnalysis() { 92 return TargetIRAnalysis([this](const Function &F) { 93 return TargetTransformInfo(ARCTTIImpl(this, F)); 94 }); 95 } 96