// Add a few Bogus backend classes so we can create MachineInstrs without // depending on a real target. class BogusTargetLowering : public TargetLowering { public: BogusTargetLowering(TargetMachine &TM) : TargetLowering(TM) {} }; class BogusFrameLowering : public TargetFrameLowering { public: BogusFrameLowering() : TargetFrameLowering(TargetFrameLowering::StackGrowsDown, Align(4), 4) {} void emitPrologue(MachineFunction &MF, MachineBasicBlock &MBB) const override {} void emitEpilogue(MachineFunction &MF, MachineBasicBlock &MBB) const override {} bool hasFP(const MachineFunction &MF) const override { return false; } }; static TargetRegisterClass *const BogusRegisterClasses[] = {nullptr}; class BogusRegisterInfo : public TargetRegisterInfo { public: BogusRegisterInfo() : TargetRegisterInfo(nullptr, BogusRegisterClasses, BogusRegisterClasses, nullptr, nullptr, LaneBitmask(~0u), nullptr) { InitMCRegisterInfo(nullptr, 0, 0, 0, nullptr, 0, nullptr, 0, nullptr, nullptr, nullptr, nullptr, nullptr, 0, nullptr, nullptr); } const MCPhysReg * getCalleeSavedRegs(const MachineFunction *MF) const override { return nullptr; } ArrayRef getRegMasks() const override { return None; } ArrayRef getRegMaskNames() const override { return None; } BitVector getReservedRegs(const MachineFunction &MF) const override { return BitVector(); } const RegClassWeight & getRegClassWeight(const TargetRegisterClass *RC) const override { static RegClassWeight Bogus{1, 16}; return Bogus; } unsigned getRegUnitWeight(unsigned RegUnit) const override { return 1; } unsigned getNumRegPressureSets() const override { return 0; } const char *getRegPressureSetName(unsigned Idx) const override { return "bogus"; } unsigned getRegPressureSetLimit(const MachineFunction &MF, unsigned Idx) const override { return 0; } const int * getRegClassPressureSets(const TargetRegisterClass *RC) const override { static const int Bogus[] = {0, -1}; return &Bogus[0]; } const int *getRegUnitPressureSets(unsigned RegUnit) const override { static const int Bogus[] = {0, -1}; return &Bogus[0]; } Register getFrameRegister(const MachineFunction &MF) const override { return 0; } void eliminateFrameIndex(MachineBasicBlock::iterator MI, int SPAdj, unsigned FIOperandNum, RegScavenger *RS = nullptr) const override {} }; class BogusSubtarget : public TargetSubtargetInfo { public: BogusSubtarget(TargetMachine &TM) : TargetSubtargetInfo(Triple(""), "", "", "", {}, {}, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr), FL(), TL(TM) {} ~BogusSubtarget() override {} const TargetFrameLowering *getFrameLowering() const override { return &FL; } const TargetLowering *getTargetLowering() const override { return &TL; } const TargetInstrInfo *getInstrInfo() const override { return &TII; } const TargetRegisterInfo *getRegisterInfo() const override { return &TRI; } private: BogusFrameLowering FL; BogusRegisterInfo TRI; BogusTargetLowering TL; TargetInstrInfo TII; }; static TargetOptions getTargetOptionsForBogusMachine() { TargetOptions Opts; Opts.EmitCallSiteInfo = true; return Opts; } class BogusTargetMachine : public LLVMTargetMachine { public: BogusTargetMachine() : LLVMTargetMachine(Target(), "", Triple(""), "", "", getTargetOptionsForBogusMachine(), Reloc::Static, CodeModel::Small, CodeGenOpt::Default), ST(*this) {} ~BogusTargetMachine() override {} const TargetSubtargetInfo *getSubtargetImpl(const Function &) const override { return &ST; } private: BogusSubtarget ST; }; std::unique_ptr createTargetMachine() { return std::make_unique(); } std::unique_ptr createMachineFunction(LLVMContext &Ctx, Module &M) { auto Type = FunctionType::get(Type::getVoidTy(Ctx), false); auto F = Function::Create(Type, GlobalValue::ExternalLinkage, "Test", &M); auto TM = createTargetMachine(); unsigned FunctionNum = 42; MachineModuleInfo MMI(TM.get()); const TargetSubtargetInfo &STI = *TM->getSubtargetImpl(*F); return std::make_unique(*F, *TM, STI, FunctionNum, MMI); }