xref: /freebsd/contrib/llvm-project/llvm/lib/Target/Mips/MipsModuleISelDAGToDAG.cpp (revision 0b57cec536236d46e3dba9bd041533462f33dbb7)
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