10b57cec5SDimitry Andric //===-- BPFSubtarget.h - Define Subtarget for the BPF -----------*- C++ -*-===// 20b57cec5SDimitry Andric // 30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 60b57cec5SDimitry Andric // 70b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 80b57cec5SDimitry Andric // 90b57cec5SDimitry Andric // This file declares the BPF specific subclass of TargetSubtargetInfo. 100b57cec5SDimitry Andric // 110b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 120b57cec5SDimitry Andric 130b57cec5SDimitry Andric #ifndef LLVM_LIB_TARGET_BPF_BPFSUBTARGET_H 140b57cec5SDimitry Andric #define LLVM_LIB_TARGET_BPF_BPFSUBTARGET_H 150b57cec5SDimitry Andric 160b57cec5SDimitry Andric #include "BPFFrameLowering.h" 170b57cec5SDimitry Andric #include "BPFISelLowering.h" 180b57cec5SDimitry Andric #include "BPFInstrInfo.h" 19*5f757f3fSDimitry Andric #include "BPFRegisterInfo.h" 200b57cec5SDimitry Andric #include "BPFSelectionDAGInfo.h" 21*5f757f3fSDimitry Andric #include "llvm/CodeGen/GlobalISel/CallLowering.h" 22*5f757f3fSDimitry Andric #include "llvm/CodeGen/GlobalISel/InstructionSelector.h" 23*5f757f3fSDimitry Andric #include "llvm/CodeGen/GlobalISel/LegalizerInfo.h" 24*5f757f3fSDimitry Andric #include "llvm/CodeGen/RegisterBankInfo.h" 250b57cec5SDimitry Andric #include "llvm/CodeGen/SelectionDAGTargetInfo.h" 260b57cec5SDimitry Andric #include "llvm/CodeGen/TargetSubtargetInfo.h" 270b57cec5SDimitry Andric #include "llvm/IR/DataLayout.h" 280b57cec5SDimitry Andric #include "llvm/Target/TargetMachine.h" 290b57cec5SDimitry Andric 300b57cec5SDimitry Andric #define GET_SUBTARGETINFO_HEADER 310b57cec5SDimitry Andric #include "BPFGenSubtargetInfo.inc" 320b57cec5SDimitry Andric 330b57cec5SDimitry Andric namespace llvm { 340b57cec5SDimitry Andric class StringRef; 350b57cec5SDimitry Andric 360b57cec5SDimitry Andric class BPFSubtarget : public BPFGenSubtargetInfo { 370b57cec5SDimitry Andric virtual void anchor(); 380b57cec5SDimitry Andric BPFInstrInfo InstrInfo; 390b57cec5SDimitry Andric BPFFrameLowering FrameLowering; 400b57cec5SDimitry Andric BPFTargetLowering TLInfo; 410b57cec5SDimitry Andric BPFSelectionDAGInfo TSInfo; 420b57cec5SDimitry Andric 430b57cec5SDimitry Andric private: 440b57cec5SDimitry Andric void initializeEnvironment(); 450b57cec5SDimitry Andric void initSubtargetFeatures(StringRef CPU, StringRef FS); 460b57cec5SDimitry Andric 470b57cec5SDimitry Andric protected: 480b57cec5SDimitry Andric // unused 490b57cec5SDimitry Andric bool isDummyMode; 500b57cec5SDimitry Andric 51*5f757f3fSDimitry Andric bool IsLittleEndian; 52*5f757f3fSDimitry Andric 530b57cec5SDimitry Andric // whether the cpu supports jmp ext 540b57cec5SDimitry Andric bool HasJmpExt; 550b57cec5SDimitry Andric 560b57cec5SDimitry Andric // whether the cpu supports jmp32 ext. 570b57cec5SDimitry Andric // NOTE: jmp32 is not enabled when alu32 enabled. 580b57cec5SDimitry Andric bool HasJmp32; 590b57cec5SDimitry Andric 600b57cec5SDimitry Andric // whether the cpu supports alu32 instructions. 610b57cec5SDimitry Andric bool HasAlu32; 620b57cec5SDimitry Andric 630b57cec5SDimitry Andric // whether we should enable MCAsmInfo DwarfUsesRelocationsAcrossSections 640b57cec5SDimitry Andric bool UseDwarfRIS; 650b57cec5SDimitry Andric 66*5f757f3fSDimitry Andric // whether cpu v4 insns are enabled. 67*5f757f3fSDimitry Andric bool HasLdsx, HasMovsx, HasBswap, HasSdivSmod, HasGotol, HasStoreImm; 68*5f757f3fSDimitry Andric 69*5f757f3fSDimitry Andric std::unique_ptr<CallLowering> CallLoweringInfo; 70*5f757f3fSDimitry Andric std::unique_ptr<InstructionSelector> InstSelector; 71*5f757f3fSDimitry Andric std::unique_ptr<LegalizerInfo> Legalizer; 72*5f757f3fSDimitry Andric std::unique_ptr<RegisterBankInfo> RegBankInfo; 73*5f757f3fSDimitry Andric 740b57cec5SDimitry Andric public: 750b57cec5SDimitry Andric // This constructor initializes the data members to match that 760b57cec5SDimitry Andric // of the specified triple. 770b57cec5SDimitry Andric BPFSubtarget(const Triple &TT, const std::string &CPU, const std::string &FS, 780b57cec5SDimitry Andric const TargetMachine &TM); 790b57cec5SDimitry Andric 800b57cec5SDimitry Andric BPFSubtarget &initializeSubtargetDependencies(StringRef CPU, StringRef FS); 810b57cec5SDimitry Andric 820b57cec5SDimitry Andric // ParseSubtargetFeatures - Parses features string setting specified 830b57cec5SDimitry Andric // subtarget options. Definition of function is auto generated by tblgen. 84e8d8bef9SDimitry Andric void ParseSubtargetFeatures(StringRef CPU, StringRef TuneCPU, StringRef FS); getHasJmpExt()850b57cec5SDimitry Andric bool getHasJmpExt() const { return HasJmpExt; } getHasJmp32()860b57cec5SDimitry Andric bool getHasJmp32() const { return HasJmp32; } getHasAlu32()870b57cec5SDimitry Andric bool getHasAlu32() const { return HasAlu32; } getUseDwarfRIS()880b57cec5SDimitry Andric bool getUseDwarfRIS() const { return UseDwarfRIS; } hasLdsx()89*5f757f3fSDimitry Andric bool hasLdsx() const { return HasLdsx; } hasMovsx()90*5f757f3fSDimitry Andric bool hasMovsx() const { return HasMovsx; } hasBswap()91*5f757f3fSDimitry Andric bool hasBswap() const { return HasBswap; } hasSdivSmod()92*5f757f3fSDimitry Andric bool hasSdivSmod() const { return HasSdivSmod; } hasGotol()93*5f757f3fSDimitry Andric bool hasGotol() const { return HasGotol; } hasStoreImm()94*5f757f3fSDimitry Andric bool hasStoreImm() const { return HasStoreImm; } 95*5f757f3fSDimitry Andric isLittleEndian()96*5f757f3fSDimitry Andric bool isLittleEndian() const { return IsLittleEndian; } 970b57cec5SDimitry Andric getInstrInfo()980b57cec5SDimitry Andric const BPFInstrInfo *getInstrInfo() const override { return &InstrInfo; } getFrameLowering()990b57cec5SDimitry Andric const BPFFrameLowering *getFrameLowering() const override { 1000b57cec5SDimitry Andric return &FrameLowering; 1010b57cec5SDimitry Andric } getTargetLowering()1020b57cec5SDimitry Andric const BPFTargetLowering *getTargetLowering() const override { 1030b57cec5SDimitry Andric return &TLInfo; 1040b57cec5SDimitry Andric } getSelectionDAGInfo()1050b57cec5SDimitry Andric const BPFSelectionDAGInfo *getSelectionDAGInfo() const override { 1060b57cec5SDimitry Andric return &TSInfo; 1070b57cec5SDimitry Andric } getRegisterInfo()108*5f757f3fSDimitry Andric const BPFRegisterInfo *getRegisterInfo() const override { 1090b57cec5SDimitry Andric return &InstrInfo.getRegisterInfo(); 1100b57cec5SDimitry Andric } 111*5f757f3fSDimitry Andric 112*5f757f3fSDimitry Andric const CallLowering *getCallLowering() const override; 113*5f757f3fSDimitry Andric InstructionSelector *getInstructionSelector() const override; 114*5f757f3fSDimitry Andric const LegalizerInfo *getLegalizerInfo() const override; 115*5f757f3fSDimitry Andric const RegisterBankInfo *getRegBankInfo() const override; 1160b57cec5SDimitry Andric }; 1170b57cec5SDimitry Andric } // End llvm namespace 1180b57cec5SDimitry Andric 1190b57cec5SDimitry Andric #endif 120