xref: /freebsd/contrib/llvm-project/llvm/lib/Target/SPIRV/SPIRVSubtarget.h (revision bdd1243df58e60e85101c09001d9812a789b6bc4)
181ad6265SDimitry Andric //===-- SPIRVSubtarget.h - SPIR-V Subtarget Information --------*- C++ -*--===//
281ad6265SDimitry Andric //
381ad6265SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
481ad6265SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
581ad6265SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
681ad6265SDimitry Andric //
781ad6265SDimitry Andric //===----------------------------------------------------------------------===//
881ad6265SDimitry Andric //
981ad6265SDimitry Andric // This file declares the SPIR-V specific subclass of TargetSubtargetInfo.
1081ad6265SDimitry Andric //
1181ad6265SDimitry Andric //===----------------------------------------------------------------------===//
1281ad6265SDimitry Andric 
1381ad6265SDimitry Andric #ifndef LLVM_LIB_TARGET_SPIRV_SPIRVSUBTARGET_H
1481ad6265SDimitry Andric #define LLVM_LIB_TARGET_SPIRV_SPIRVSUBTARGET_H
1581ad6265SDimitry Andric 
1681ad6265SDimitry Andric #include "SPIRVCallLowering.h"
1781ad6265SDimitry Andric #include "SPIRVFrameLowering.h"
1881ad6265SDimitry Andric #include "SPIRVISelLowering.h"
1981ad6265SDimitry Andric #include "SPIRVInstrInfo.h"
2081ad6265SDimitry Andric #include "llvm/CodeGen/GlobalISel/CallLowering.h"
2181ad6265SDimitry Andric #include "llvm/CodeGen/GlobalISel/InstructionSelector.h"
2281ad6265SDimitry Andric #include "llvm/CodeGen/GlobalISel/LegalizerInfo.h"
2381ad6265SDimitry Andric #include "llvm/CodeGen/SelectionDAGTargetInfo.h"
2481ad6265SDimitry Andric #include "llvm/CodeGen/TargetSubtargetInfo.h"
2581ad6265SDimitry Andric #include "llvm/IR/DataLayout.h"
2681ad6265SDimitry Andric #include "llvm/Target/TargetMachine.h"
2781ad6265SDimitry Andric 
2881ad6265SDimitry Andric #define GET_SUBTARGETINFO_HEADER
2981ad6265SDimitry Andric #include "SPIRVGenSubtargetInfo.inc"
3081ad6265SDimitry Andric 
3181ad6265SDimitry Andric namespace llvm {
3281ad6265SDimitry Andric class StringRef;
3381ad6265SDimitry Andric class SPIRVTargetMachine;
3481ad6265SDimitry Andric 
3581ad6265SDimitry Andric class SPIRVSubtarget : public SPIRVGenSubtargetInfo {
3681ad6265SDimitry Andric private:
3781ad6265SDimitry Andric   const unsigned PointerSize;
3881ad6265SDimitry Andric   uint32_t SPIRVVersion;
39*bdd1243dSDimitry Andric   uint32_t OpenCLVersion;
4081ad6265SDimitry Andric 
41*bdd1243dSDimitry Andric   SmallSet<SPIRV::Extension::Extension, 4> AvailableExtensions;
42*bdd1243dSDimitry Andric   SmallSet<SPIRV::InstructionSet::InstructionSet, 4> AvailableExtInstSets;
4381ad6265SDimitry Andric   std::unique_ptr<SPIRVGlobalRegistry> GR;
4481ad6265SDimitry Andric 
4581ad6265SDimitry Andric   SPIRVInstrInfo InstrInfo;
4681ad6265SDimitry Andric   SPIRVFrameLowering FrameLowering;
4781ad6265SDimitry Andric   SPIRVTargetLowering TLInfo;
4881ad6265SDimitry Andric 
4981ad6265SDimitry Andric   // GlobalISel related APIs.
5081ad6265SDimitry Andric   std::unique_ptr<CallLowering> CallLoweringInfo;
5181ad6265SDimitry Andric   std::unique_ptr<RegisterBankInfo> RegBankInfo;
5281ad6265SDimitry Andric   std::unique_ptr<LegalizerInfo> Legalizer;
5381ad6265SDimitry Andric   std::unique_ptr<InstructionSelector> InstSelector;
5481ad6265SDimitry Andric 
55*bdd1243dSDimitry Andric   // TODO: Initialise the available extensions, extended instruction sets
56*bdd1243dSDimitry Andric   // based on the environment settings.
57*bdd1243dSDimitry Andric   void initAvailableExtensions();
58*bdd1243dSDimitry Andric   void initAvailableExtInstSets();
59*bdd1243dSDimitry Andric 
6081ad6265SDimitry Andric public:
6181ad6265SDimitry Andric   // This constructor initializes the data members to match that
6281ad6265SDimitry Andric   // of the specified triple.
6381ad6265SDimitry Andric   SPIRVSubtarget(const Triple &TT, const std::string &CPU,
6481ad6265SDimitry Andric                  const std::string &FS, const SPIRVTargetMachine &TM);
6581ad6265SDimitry Andric   SPIRVSubtarget &initSubtargetDependencies(StringRef CPU, StringRef FS);
6681ad6265SDimitry Andric 
6781ad6265SDimitry Andric   // Parses features string setting specified subtarget options.
6881ad6265SDimitry Andric   // The definition of this function is auto generated by tblgen.
6981ad6265SDimitry Andric   void ParseSubtargetFeatures(StringRef CPU, StringRef TuneCPU, StringRef FS);
7081ad6265SDimitry Andric   unsigned getPointerSize() const { return PointerSize; }
7181ad6265SDimitry Andric   bool canDirectlyComparePointers() const;
72*bdd1243dSDimitry Andric   // TODO: this environment is not implemented in Triple, we need to decide
73*bdd1243dSDimitry Andric   // how to standartize its support. For now, let's assume that we always
74*bdd1243dSDimitry Andric   // operate with OpenCL.
75*bdd1243dSDimitry Andric   bool isOpenCLEnv() const { return true; }
7681ad6265SDimitry Andric   uint32_t getSPIRVVersion() const { return SPIRVVersion; };
77*bdd1243dSDimitry Andric   bool isAtLeastSPIRVVer(uint32_t VerToCompareTo) const;
78*bdd1243dSDimitry Andric   bool isAtLeastOpenCLVer(uint32_t VerToCompareTo) const;
79*bdd1243dSDimitry Andric   // TODO: implement command line args or other ways to determine this.
80*bdd1243dSDimitry Andric   bool hasOpenCLFullProfile() const { return true; }
81*bdd1243dSDimitry Andric   bool hasOpenCLImageSupport() const { return true; }
82*bdd1243dSDimitry Andric   bool canUseExtension(SPIRV::Extension::Extension E) const;
83*bdd1243dSDimitry Andric   bool canUseExtInstSet(SPIRV::InstructionSet::InstructionSet E) const;
84*bdd1243dSDimitry Andric 
8581ad6265SDimitry Andric   SPIRVGlobalRegistry *getSPIRVGlobalRegistry() const { return GR.get(); }
8681ad6265SDimitry Andric 
8781ad6265SDimitry Andric   const CallLowering *getCallLowering() const override {
8881ad6265SDimitry Andric     return CallLoweringInfo.get();
8981ad6265SDimitry Andric   }
9081ad6265SDimitry Andric   const RegisterBankInfo *getRegBankInfo() const override {
9181ad6265SDimitry Andric     return RegBankInfo.get();
9281ad6265SDimitry Andric   }
9381ad6265SDimitry Andric   const LegalizerInfo *getLegalizerInfo() const override {
9481ad6265SDimitry Andric     return Legalizer.get();
9581ad6265SDimitry Andric   }
9681ad6265SDimitry Andric   InstructionSelector *getInstructionSelector() const override {
9781ad6265SDimitry Andric     return InstSelector.get();
9881ad6265SDimitry Andric   }
9981ad6265SDimitry Andric   const SPIRVInstrInfo *getInstrInfo() const override { return &InstrInfo; }
10081ad6265SDimitry Andric   const SPIRVFrameLowering *getFrameLowering() const override {
10181ad6265SDimitry Andric     return &FrameLowering;
10281ad6265SDimitry Andric   }
10381ad6265SDimitry Andric   const SPIRVTargetLowering *getTargetLowering() const override {
10481ad6265SDimitry Andric     return &TLInfo;
10581ad6265SDimitry Andric   }
10681ad6265SDimitry Andric   const SPIRVRegisterInfo *getRegisterInfo() const override {
10781ad6265SDimitry Andric     return &InstrInfo.getRegisterInfo();
10881ad6265SDimitry Andric   }
10981ad6265SDimitry Andric };
11081ad6265SDimitry Andric } // namespace llvm
11181ad6265SDimitry Andric 
11281ad6265SDimitry Andric #endif // LLVM_LIB_TARGET_SPIRV_SPIRVSUBTARGET_H
113