xref: /freebsd/contrib/llvm-project/llvm/lib/Target/Mips/MipsModuleISelDAGToDAG.cpp (revision 81ad626541db97eb356e2c1d4a20eb2a26a766ab)
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 Andric bool 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 Andric llvm::FunctionPass *llvm::createMipsModuleISelDagPass() {
560b57cec5SDimitry Andric   return new MipsModuleDAGToDAGISel();
570b57cec5SDimitry Andric }
58