xref: /freebsd/contrib/llvm-project/llvm/lib/Target/SPIRV/SPIRVSubtarget.h (revision 5f757f3ff9144b609b3c433dfd370cc6bdc191ad)
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"
20*5f757f3fSDimitry Andric #include "llvm/ADT/SmallSet.h"
2181ad6265SDimitry Andric #include "llvm/CodeGen/GlobalISel/CallLowering.h"
2281ad6265SDimitry Andric #include "llvm/CodeGen/GlobalISel/InstructionSelector.h"
2381ad6265SDimitry Andric #include "llvm/CodeGen/GlobalISel/LegalizerInfo.h"
2481ad6265SDimitry Andric #include "llvm/CodeGen/SelectionDAGTargetInfo.h"
2581ad6265SDimitry Andric #include "llvm/CodeGen/TargetSubtargetInfo.h"
2681ad6265SDimitry Andric #include "llvm/IR/DataLayout.h"
2781ad6265SDimitry Andric #include "llvm/Target/TargetMachine.h"
28*5f757f3fSDimitry Andric #include "llvm/TargetParser/Triple.h"
2981ad6265SDimitry Andric 
3081ad6265SDimitry Andric #define GET_SUBTARGETINFO_HEADER
3181ad6265SDimitry Andric #include "SPIRVGenSubtargetInfo.inc"
3281ad6265SDimitry Andric 
3381ad6265SDimitry Andric namespace llvm {
3481ad6265SDimitry Andric class StringRef;
3581ad6265SDimitry Andric class SPIRVTargetMachine;
3681ad6265SDimitry Andric 
3781ad6265SDimitry Andric class SPIRVSubtarget : public SPIRVGenSubtargetInfo {
3881ad6265SDimitry Andric private:
3981ad6265SDimitry Andric   const unsigned PointerSize;
4081ad6265SDimitry Andric   uint32_t SPIRVVersion;
41bdd1243dSDimitry Andric   uint32_t OpenCLVersion;
4281ad6265SDimitry Andric 
43bdd1243dSDimitry Andric   SmallSet<SPIRV::Extension::Extension, 4> AvailableExtensions;
44bdd1243dSDimitry Andric   SmallSet<SPIRV::InstructionSet::InstructionSet, 4> AvailableExtInstSets;
4581ad6265SDimitry Andric   std::unique_ptr<SPIRVGlobalRegistry> GR;
4681ad6265SDimitry Andric 
4781ad6265SDimitry Andric   SPIRVInstrInfo InstrInfo;
4881ad6265SDimitry Andric   SPIRVFrameLowering FrameLowering;
4981ad6265SDimitry Andric   SPIRVTargetLowering TLInfo;
50*5f757f3fSDimitry Andric   Triple TargetTriple;
5181ad6265SDimitry Andric 
5281ad6265SDimitry Andric   // GlobalISel related APIs.
5381ad6265SDimitry Andric   std::unique_ptr<CallLowering> CallLoweringInfo;
5481ad6265SDimitry Andric   std::unique_ptr<RegisterBankInfo> RegBankInfo;
5581ad6265SDimitry Andric   std::unique_ptr<LegalizerInfo> Legalizer;
5681ad6265SDimitry Andric   std::unique_ptr<InstructionSelector> InstSelector;
5781ad6265SDimitry Andric 
58bdd1243dSDimitry Andric   // TODO: Initialise the available extensions, extended instruction sets
59bdd1243dSDimitry Andric   // based on the environment settings.
60bdd1243dSDimitry Andric   void initAvailableExtensions();
61bdd1243dSDimitry Andric   void initAvailableExtInstSets();
62bdd1243dSDimitry Andric 
6381ad6265SDimitry Andric public:
6481ad6265SDimitry Andric   // This constructor initializes the data members to match that
6581ad6265SDimitry Andric   // of the specified triple.
6681ad6265SDimitry Andric   SPIRVSubtarget(const Triple &TT, const std::string &CPU,
6781ad6265SDimitry Andric                  const std::string &FS, const SPIRVTargetMachine &TM);
6881ad6265SDimitry Andric   SPIRVSubtarget &initSubtargetDependencies(StringRef CPU, StringRef FS);
6981ad6265SDimitry Andric 
7081ad6265SDimitry Andric   // Parses features string setting specified subtarget options.
7181ad6265SDimitry Andric   // The definition of this function is auto generated by tblgen.
7281ad6265SDimitry Andric   void ParseSubtargetFeatures(StringRef CPU, StringRef TuneCPU, StringRef FS);
7381ad6265SDimitry Andric   unsigned getPointerSize() const { return PointerSize; }
7481ad6265SDimitry Andric   bool canDirectlyComparePointers() const;
75bdd1243dSDimitry Andric   // TODO: this environment is not implemented in Triple, we need to decide
76*5f757f3fSDimitry Andric   // how to standardize its support. For now, let's assume SPIR-V with physical
77*5f757f3fSDimitry Andric   // addressing is OpenCL, and Logical addressing is Vulkan.
78*5f757f3fSDimitry Andric   bool isOpenCLEnv() const {
79*5f757f3fSDimitry Andric     return TargetTriple.getArch() == Triple::spirv32 ||
80*5f757f3fSDimitry Andric            TargetTriple.getArch() == Triple::spirv64;
81*5f757f3fSDimitry Andric   }
82*5f757f3fSDimitry Andric   bool isVulkanEnv() const { return TargetTriple.getArch() == Triple::spirv; }
8381ad6265SDimitry Andric   uint32_t getSPIRVVersion() const { return SPIRVVersion; };
84bdd1243dSDimitry Andric   bool isAtLeastSPIRVVer(uint32_t VerToCompareTo) const;
85bdd1243dSDimitry Andric   bool isAtLeastOpenCLVer(uint32_t VerToCompareTo) const;
86bdd1243dSDimitry Andric   // TODO: implement command line args or other ways to determine this.
87bdd1243dSDimitry Andric   bool hasOpenCLFullProfile() const { return true; }
88bdd1243dSDimitry Andric   bool hasOpenCLImageSupport() const { return true; }
89*5f757f3fSDimitry Andric   const SmallSet<SPIRV::Extension::Extension, 4> &
90*5f757f3fSDimitry Andric   getAllAvailableExtensions() const {
91*5f757f3fSDimitry Andric     return AvailableExtensions;
92*5f757f3fSDimitry Andric   }
93bdd1243dSDimitry Andric   bool canUseExtension(SPIRV::Extension::Extension E) const;
94bdd1243dSDimitry Andric   bool canUseExtInstSet(SPIRV::InstructionSet::InstructionSet E) const;
95bdd1243dSDimitry Andric 
9681ad6265SDimitry Andric   SPIRVGlobalRegistry *getSPIRVGlobalRegistry() const { return GR.get(); }
9781ad6265SDimitry Andric 
9881ad6265SDimitry Andric   const CallLowering *getCallLowering() const override {
9981ad6265SDimitry Andric     return CallLoweringInfo.get();
10081ad6265SDimitry Andric   }
10181ad6265SDimitry Andric   const RegisterBankInfo *getRegBankInfo() const override {
10281ad6265SDimitry Andric     return RegBankInfo.get();
10381ad6265SDimitry Andric   }
10481ad6265SDimitry Andric   const LegalizerInfo *getLegalizerInfo() const override {
10581ad6265SDimitry Andric     return Legalizer.get();
10681ad6265SDimitry Andric   }
10781ad6265SDimitry Andric   InstructionSelector *getInstructionSelector() const override {
10881ad6265SDimitry Andric     return InstSelector.get();
10981ad6265SDimitry Andric   }
11081ad6265SDimitry Andric   const SPIRVInstrInfo *getInstrInfo() const override { return &InstrInfo; }
11181ad6265SDimitry Andric   const SPIRVFrameLowering *getFrameLowering() const override {
11281ad6265SDimitry Andric     return &FrameLowering;
11381ad6265SDimitry Andric   }
11481ad6265SDimitry Andric   const SPIRVTargetLowering *getTargetLowering() const override {
11581ad6265SDimitry Andric     return &TLInfo;
11681ad6265SDimitry Andric   }
11781ad6265SDimitry Andric   const SPIRVRegisterInfo *getRegisterInfo() const override {
11881ad6265SDimitry Andric     return &InstrInfo.getRegisterInfo();
11981ad6265SDimitry Andric   }
120*5f757f3fSDimitry Andric 
121*5f757f3fSDimitry Andric   static bool classof(const TargetSubtargetInfo *ST) {
122*5f757f3fSDimitry Andric     return ST->getTargetTriple().isSPIRV();
123*5f757f3fSDimitry Andric   }
12481ad6265SDimitry Andric };
12581ad6265SDimitry Andric } // namespace llvm
12681ad6265SDimitry Andric 
12781ad6265SDimitry Andric #endif // LLVM_LIB_TARGET_SPIRV_SPIRVSUBTARGET_H
128