1 //===-- MipsTargetMachine.h - Define TargetMachine for Mips -----*- 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 // This file declares the Mips specific subclass of TargetMachine. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #ifndef MIPSTARGETMACHINE_H 15 #define MIPSTARGETMACHINE_H 16 17 #include "MipsSubtarget.h" 18 #include "llvm/CodeGen/Passes.h" 19 #include "llvm/CodeGen/SelectionDAGISel.h" 20 #include "llvm/Target/TargetFrameLowering.h" 21 #include "llvm/Target/TargetMachine.h" 22 23 namespace llvm { 24 class formatted_raw_ostream; 25 class MipsRegisterInfo; 26 27 class MipsTargetMachine : public LLVMTargetMachine { 28 MipsSubtarget *Subtarget; 29 MipsSubtarget DefaultSubtarget; 30 MipsSubtarget NoMips16Subtarget; 31 MipsSubtarget Mips16Subtarget; 32 33 public: 34 MipsTargetMachine(const Target &T, StringRef TT, StringRef CPU, StringRef FS, 35 const TargetOptions &Options, Reloc::Model RM, 36 CodeModel::Model CM, CodeGenOpt::Level OL, bool isLittle); 37 38 virtual ~MipsTargetMachine() {} 39 40 void addAnalysisPasses(PassManagerBase &PM) override; 41 42 const MipsInstrInfo *getInstrInfo() const override { 43 return getSubtargetImpl()->getInstrInfo(); 44 } 45 const TargetFrameLowering *getFrameLowering() const override { 46 return getSubtargetImpl()->getFrameLowering(); 47 } 48 const MipsSubtarget *getSubtargetImpl() const override { 49 if (Subtarget) 50 return Subtarget; 51 return &DefaultSubtarget; 52 } 53 const InstrItineraryData *getInstrItineraryData() const override { 54 return Subtarget->inMips16Mode() 55 ? nullptr 56 : &getSubtargetImpl()->getInstrItineraryData(); 57 } 58 MipsJITInfo *getJITInfo() override { 59 return Subtarget->getJITInfo(); 60 } 61 const MipsRegisterInfo *getRegisterInfo() const override { 62 return getSubtargetImpl()->getRegisterInfo(); 63 } 64 const MipsTargetLowering *getTargetLowering() const override { 65 return getSubtargetImpl()->getTargetLowering(); 66 } 67 const DataLayout *getDataLayout() const override { 68 return getSubtargetImpl()->getDataLayout(); 69 } 70 const MipsSelectionDAGInfo* getSelectionDAGInfo() const override { 71 return getSubtargetImpl()->getSelectionDAGInfo(); 72 } 73 /// \brief Reset the subtarget for the Mips target. 74 void resetSubtarget(MachineFunction *MF); 75 76 // Pass Pipeline Configuration 77 TargetPassConfig *createPassConfig(PassManagerBase &PM) override; 78 bool addCodeEmitter(PassManagerBase &PM, JITCodeEmitter &JCE) override; 79 }; 80 81 /// MipsebTargetMachine - Mips32/64 big endian target machine. 82 /// 83 class MipsebTargetMachine : public MipsTargetMachine { 84 virtual void anchor(); 85 public: 86 MipsebTargetMachine(const Target &T, StringRef TT, 87 StringRef CPU, StringRef FS, const TargetOptions &Options, 88 Reloc::Model RM, CodeModel::Model CM, 89 CodeGenOpt::Level OL); 90 }; 91 92 /// MipselTargetMachine - Mips32/64 little endian target machine. 93 /// 94 class MipselTargetMachine : public MipsTargetMachine { 95 virtual void anchor(); 96 public: 97 MipselTargetMachine(const Target &T, StringRef TT, 98 StringRef CPU, StringRef FS, const TargetOptions &Options, 99 Reloc::Model RM, CodeModel::Model CM, 100 CodeGenOpt::Level OL); 101 }; 102 103 } // End llvm namespace 104 105 #endif 106