brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.8 KiB · c5e1c74 Raw
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