diff options
Diffstat (limited to 'llvm/lib/Target/X86/X86Subtarget.cpp')
| -rw-r--r-- | llvm/lib/Target/X86/X86Subtarget.cpp | 49 |
1 files changed, 41 insertions, 8 deletions
diff --git a/llvm/lib/Target/X86/X86Subtarget.cpp b/llvm/lib/Target/X86/X86Subtarget.cpp index bada96df869..493084f795f 100644 --- a/llvm/lib/Target/X86/X86Subtarget.cpp +++ b/llvm/lib/Target/X86/X86Subtarget.cpp @@ -353,6 +353,33 @@ X86Subtarget &X86Subtarget::initializeSubtargetDependencies(StringRef CPU, return *this; } +namespace { + +struct X86GISelActualAccessor : public GISelAccessor { + std::unique_ptr<CallLowering> CallLoweringInfo; + std::unique_ptr<LegalizerInfo> Legalizer; + std::unique_ptr<RegisterBankInfo> RegBankInfo; + std::unique_ptr<InstructionSelector> InstSelector; + + const CallLowering *getCallLowering() const override { + return CallLoweringInfo.get(); + } + + const InstructionSelector *getInstructionSelector() const override { + return InstSelector.get(); + } + + const LegalizerInfo *getLegalizerInfo() const override { + return Legalizer.get(); + } + + const RegisterBankInfo *getRegBankInfo() const override { + return RegBankInfo.get(); + } +}; + +} // end anonymous namespace + X86Subtarget::X86Subtarget(const Triple &TT, StringRef CPU, StringRef FS, const X86TargetMachine &TM, unsigned StackAlignOverride) @@ -377,29 +404,35 @@ X86Subtarget::X86Subtarget(const Triple &TT, StringRef CPU, StringRef FS, setPICStyle(PICStyles::StubPIC); else if (isTargetELF()) setPICStyle(PICStyles::GOT); + X86GISelActualAccessor *GISel = new X86GISelActualAccessor(); - CallLoweringInfo.reset(new X86CallLowering(*getTargetLowering())); - Legalizer.reset(new X86LegalizerInfo(*this, TM)); + GISel->CallLoweringInfo.reset(new X86CallLowering(*getTargetLowering())); + GISel->Legalizer.reset(new X86LegalizerInfo(*this, TM)); auto *RBI = new X86RegisterBankInfo(*getRegisterInfo()); - RegBankInfo.reset(RBI); - InstSelector.reset(createX86InstructionSelector(TM, *this, *RBI)); + GISel->RegBankInfo.reset(RBI); + GISel->InstSelector.reset(createX86InstructionSelector(TM, *this, *RBI)); + setGISelAccessor(*GISel); } const CallLowering *X86Subtarget::getCallLowering() const { - return CallLoweringInfo.get(); + assert(GISel && "Access to GlobalISel APIs not set"); + return GISel->getCallLowering(); } const InstructionSelector *X86Subtarget::getInstructionSelector() const { - return InstSelector.get(); + assert(GISel && "Access to GlobalISel APIs not set"); + return GISel->getInstructionSelector(); } const LegalizerInfo *X86Subtarget::getLegalizerInfo() const { - return Legalizer.get(); + assert(GISel && "Access to GlobalISel APIs not set"); + return GISel->getLegalizerInfo(); } const RegisterBankInfo *X86Subtarget::getRegBankInfo() const { - return RegBankInfo.get(); + assert(GISel && "Access to GlobalISel APIs not set"); + return GISel->getRegBankInfo(); } bool X86Subtarget::enableEarlyIfConversion() const { |

