151 lines · plain
1// Add a few Bogus backend classes so we can create MachineInstrs without2// depending on a real target.3class BogusTargetLowering : public TargetLowering {4public:5 BogusTargetLowering(const TargetMachine &TM, const TargetSubtargetInfo &STI)6 : TargetLowering(TM, STI) {}7};8 9class BogusFrameLowering : public TargetFrameLowering {10public:11 BogusFrameLowering()12 : TargetFrameLowering(TargetFrameLowering::StackGrowsDown, Align(4), 4) {}13 14 void emitPrologue(MachineFunction &MF,15 MachineBasicBlock &MBB) const override {}16 void emitEpilogue(MachineFunction &MF,17 MachineBasicBlock &MBB) const override {}18 19protected:20 bool hasFPImpl(const MachineFunction &MF) const override { return false; }21};22 23static TargetRegisterClass *const BogusRegisterClasses[] = {nullptr};24 25class BogusRegisterInfo : public TargetRegisterInfo {26public:27 BogusRegisterInfo()28 : TargetRegisterInfo(nullptr, BogusRegisterClasses, BogusRegisterClasses,29 nullptr, nullptr, nullptr, LaneBitmask(~0u), nullptr,30 nullptr) {31 InitMCRegisterInfo(nullptr, 0, 0, 0, nullptr, 0, nullptr, 0, nullptr,32 nullptr, nullptr, nullptr, nullptr, 0, nullptr);33 }34 35 const MCPhysReg *36 getCalleeSavedRegs(const MachineFunction *MF) const override {37 return nullptr;38 }39 ArrayRef<const uint32_t *> getRegMasks() const override { return {}; }40 ArrayRef<const char *> getRegMaskNames() const override { return {}; }41 BitVector getReservedRegs(const MachineFunction &MF) const override {42 return BitVector();43 }44 const RegClassWeight &45 getRegClassWeight(const TargetRegisterClass *RC) const override {46 static RegClassWeight Bogus{1, 16};47 return Bogus;48 }49 unsigned getRegUnitWeight(MCRegUnit RegUnit) const override { return 1; }50 unsigned getNumRegPressureSets() const override { return 0; }51 const char *getRegPressureSetName(unsigned Idx) const override {52 return "bogus";53 }54 unsigned getRegPressureSetLimit(const MachineFunction &MF,55 unsigned Idx) const override {56 return 0;57 }58 const int *59 getRegClassPressureSets(const TargetRegisterClass *RC) const override {60 static const int Bogus[] = {0, -1};61 return &Bogus[0];62 }63 const int *getRegUnitPressureSets(MCRegUnit RegUnit) const override {64 static const int Bogus[] = {0, -1};65 return &Bogus[0];66 }67 68 Register getFrameRegister(const MachineFunction &MF) const override {69 return 0;70 }71 bool eliminateFrameIndex(MachineBasicBlock::iterator MI, int SPAdj,72 unsigned FIOperandNum,73 RegScavenger *RS = nullptr) const override {74 return false;75 76 }77};78 79class BogusTargetInstrInfo : public TargetInstrInfo {80 BogusRegisterInfo RegInfo;81 82public:83 BogusTargetInstrInfo() : TargetInstrInfo(RegInfo) {}84};85 86class BogusSubtarget : public TargetSubtargetInfo {87public:88 BogusSubtarget(TargetMachine &TM)89 : TargetSubtargetInfo(Triple(""), "", "", "", {}, {}, {}, nullptr,90 nullptr, nullptr, nullptr, nullptr, nullptr),91 FL(), TL(TM, *this) {}92 ~BogusSubtarget() override = default;93 94 const TargetFrameLowering *getFrameLowering() const override { return &FL; }95 96 const TargetLowering *getTargetLowering() const override { return &TL; }97 98 const TargetInstrInfo *getInstrInfo() const override { return &TII; }99 100 const TargetRegisterInfo *getRegisterInfo() const override { return &TRI; }101 102private:103 BogusFrameLowering FL;104 BogusRegisterInfo TRI;105 BogusTargetLowering TL;106 BogusTargetInstrInfo TII;107};108 109static TargetOptions getTargetOptionsForBogusMachine() {110 TargetOptions Opts;111 Opts.EmitCallSiteInfo = true;112 return Opts;113}114 115class BogusTargetMachine : public CodeGenTargetMachineImpl {116public:117 BogusTargetMachine()118 : CodeGenTargetMachineImpl(119 Target(), "", Triple(""), "", "", getTargetOptionsForBogusMachine(),120 Reloc::Static, CodeModel::Small, CodeGenOptLevel::Default),121 ST(*this) {}122 123 ~BogusTargetMachine() override = default;124 125 const TargetSubtargetInfo *getSubtargetImpl(const Function &) const override {126 return &ST;127 }128 129private:130 BogusSubtarget ST;131};132 133BogusTargetMachine *createTargetMachine() {134 static BogusTargetMachine BogusTM;135 return &BogusTM;136}137 138std::unique_ptr<MachineFunction>139createMachineFunction(LLVMContext &Ctx, Module &M, const Twine &Name = "Test") {140 auto Type = FunctionType::get(Type::getVoidTy(Ctx), false);141 auto F = Function::Create(Type, GlobalValue::ExternalLinkage, Name, &M);142 143 auto TM = createTargetMachine();144 unsigned FunctionNum = 42;145 MachineModuleInfo MMI(TM);146 const TargetSubtargetInfo &STI = *TM->getSubtargetImpl(*F);147 148 return std::make_unique<MachineFunction>(*F, *TM, STI, MMI.getContext(),149 FunctionNum);150}151