1*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 2*0b57cec5SDimitry Andric // Instruction Selector Subtarget Control 3*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 4*0b57cec5SDimitry Andric 5*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 6*0b57cec5SDimitry Andric // This file defines a pass used to change the subtarget for the 7*0b57cec5SDimitry Andric // Mips Instruction selector. 8*0b57cec5SDimitry Andric // 9*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 10*0b57cec5SDimitry Andric 11*0b57cec5SDimitry Andric #include "Mips.h" 12*0b57cec5SDimitry Andric #include "MipsTargetMachine.h" 13*0b57cec5SDimitry Andric #include "llvm/CodeGen/TargetPassConfig.h" 14*0b57cec5SDimitry Andric #include "llvm/CodeGen/StackProtector.h" 15*0b57cec5SDimitry Andric #include "llvm/Support/Debug.h" 16*0b57cec5SDimitry Andric #include "llvm/Support/raw_ostream.h" 17*0b57cec5SDimitry Andric 18*0b57cec5SDimitry Andric using namespace llvm; 19*0b57cec5SDimitry Andric 20*0b57cec5SDimitry Andric #define DEBUG_TYPE "mips-isel" 21*0b57cec5SDimitry Andric 22*0b57cec5SDimitry Andric namespace { 23*0b57cec5SDimitry Andric class MipsModuleDAGToDAGISel : public MachineFunctionPass { 24*0b57cec5SDimitry Andric public: 25*0b57cec5SDimitry Andric static char ID; 26*0b57cec5SDimitry Andric 27*0b57cec5SDimitry Andric MipsModuleDAGToDAGISel() : MachineFunctionPass(ID) {} 28*0b57cec5SDimitry Andric 29*0b57cec5SDimitry Andric // Pass Name 30*0b57cec5SDimitry Andric StringRef getPassName() const override { 31*0b57cec5SDimitry Andric return "MIPS DAG->DAG Pattern Instruction Selection"; 32*0b57cec5SDimitry Andric } 33*0b57cec5SDimitry Andric 34*0b57cec5SDimitry Andric void getAnalysisUsage(AnalysisUsage &AU) const override { 35*0b57cec5SDimitry Andric AU.addRequired<TargetPassConfig>(); 36*0b57cec5SDimitry Andric AU.addPreserved<StackProtector>(); 37*0b57cec5SDimitry Andric MachineFunctionPass::getAnalysisUsage(AU); 38*0b57cec5SDimitry Andric } 39*0b57cec5SDimitry Andric 40*0b57cec5SDimitry Andric bool runOnMachineFunction(MachineFunction &MF) override; 41*0b57cec5SDimitry Andric }; 42*0b57cec5SDimitry Andric 43*0b57cec5SDimitry Andric char MipsModuleDAGToDAGISel::ID = 0; 44*0b57cec5SDimitry Andric } 45*0b57cec5SDimitry Andric 46*0b57cec5SDimitry Andric bool MipsModuleDAGToDAGISel::runOnMachineFunction(MachineFunction &MF) { 47*0b57cec5SDimitry Andric LLVM_DEBUG(errs() << "In MipsModuleDAGToDAGISel::runMachineFunction\n"); 48*0b57cec5SDimitry Andric auto &TPC = getAnalysis<TargetPassConfig>(); 49*0b57cec5SDimitry Andric auto &TM = TPC.getTM<MipsTargetMachine>(); 50*0b57cec5SDimitry Andric TM.resetSubtarget(&MF); 51*0b57cec5SDimitry Andric return false; 52*0b57cec5SDimitry Andric } 53*0b57cec5SDimitry Andric 54*0b57cec5SDimitry Andric llvm::FunctionPass *llvm::createMipsModuleISelDagPass() { 55*0b57cec5SDimitry Andric return new MipsModuleDAGToDAGISel(); 56*0b57cec5SDimitry Andric } 57