xref: /freebsd-src/contrib/llvm-project/llvm/lib/Target/BPF/BPFSubtarget.h (revision 5f757f3ff9144b609b3c433dfd370cc6bdc191ad)
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