10b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 20b57cec5SDimitry Andric // Instruction Selector Subtarget Control 30b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 40b57cec5SDimitry Andric 50b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 60b57cec5SDimitry Andric // This file defines a pass used to change the subtarget for the 70b57cec5SDimitry Andric // Mips Instruction selector. 80b57cec5SDimitry Andric // 90b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 100b57cec5SDimitry Andric 110b57cec5SDimitry Andric #include "Mips.h" 120b57cec5SDimitry Andric #include "MipsTargetMachine.h" 13*81ad6265SDimitry Andric #include "llvm/CodeGen/MachineFunctionPass.h" 140b57cec5SDimitry Andric #include "llvm/CodeGen/StackProtector.h" 15*81ad6265SDimitry Andric #include "llvm/CodeGen/TargetPassConfig.h" 160b57cec5SDimitry Andric #include "llvm/Support/Debug.h" 170b57cec5SDimitry Andric #include "llvm/Support/raw_ostream.h" 180b57cec5SDimitry Andric 190b57cec5SDimitry Andric using namespace llvm; 200b57cec5SDimitry Andric 210b57cec5SDimitry Andric #define DEBUG_TYPE "mips-isel" 220b57cec5SDimitry Andric 230b57cec5SDimitry Andric namespace { 240b57cec5SDimitry Andric class MipsModuleDAGToDAGISel : public MachineFunctionPass { 250b57cec5SDimitry Andric public: 260b57cec5SDimitry Andric static char ID; 270b57cec5SDimitry Andric MipsModuleDAGToDAGISel()280b57cec5SDimitry Andric MipsModuleDAGToDAGISel() : MachineFunctionPass(ID) {} 290b57cec5SDimitry Andric 300b57cec5SDimitry Andric // Pass Name getPassName() const310b57cec5SDimitry Andric StringRef getPassName() const override { 320b57cec5SDimitry Andric return "MIPS DAG->DAG Pattern Instruction Selection"; 330b57cec5SDimitry Andric } 340b57cec5SDimitry Andric getAnalysisUsage(AnalysisUsage & AU) const350b57cec5SDimitry Andric void getAnalysisUsage(AnalysisUsage &AU) const override { 360b57cec5SDimitry Andric AU.addRequired<TargetPassConfig>(); 370b57cec5SDimitry Andric AU.addPreserved<StackProtector>(); 380b57cec5SDimitry Andric MachineFunctionPass::getAnalysisUsage(AU); 390b57cec5SDimitry Andric } 400b57cec5SDimitry Andric 410b57cec5SDimitry Andric bool runOnMachineFunction(MachineFunction &MF) override; 420b57cec5SDimitry Andric }; 430b57cec5SDimitry Andric 440b57cec5SDimitry Andric char MipsModuleDAGToDAGISel::ID = 0; 450b57cec5SDimitry Andric } 460b57cec5SDimitry Andric runOnMachineFunction(MachineFunction & MF)470b57cec5SDimitry Andricbool MipsModuleDAGToDAGISel::runOnMachineFunction(MachineFunction &MF) { 480b57cec5SDimitry Andric LLVM_DEBUG(errs() << "In MipsModuleDAGToDAGISel::runMachineFunction\n"); 490b57cec5SDimitry Andric auto &TPC = getAnalysis<TargetPassConfig>(); 500b57cec5SDimitry Andric auto &TM = TPC.getTM<MipsTargetMachine>(); 510b57cec5SDimitry Andric TM.resetSubtarget(&MF); 520b57cec5SDimitry Andric return false; 530b57cec5SDimitry Andric } 540b57cec5SDimitry Andric createMipsModuleISelDagPass()550b57cec5SDimitry Andricllvm::FunctionPass *llvm::createMipsModuleISelDagPass() { 560b57cec5SDimitry Andric return new MipsModuleDAGToDAGISel(); 570b57cec5SDimitry Andric } 58