xref: /freebsd-src/contrib/llvm-project/llvm/lib/Target/SPIRV/SPIRVSubtarget.h (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
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"
19*0fca6ea1SDimitry Andric #include "SPIRVInlineAsmLowering.h"
2081ad6265SDimitry Andric #include "SPIRVInstrInfo.h"
215f757f3fSDimitry Andric #include "llvm/ADT/SmallSet.h"
2281ad6265SDimitry Andric #include "llvm/CodeGen/GlobalISel/CallLowering.h"
2381ad6265SDimitry Andric #include "llvm/CodeGen/GlobalISel/InstructionSelector.h"
2481ad6265SDimitry Andric #include "llvm/CodeGen/GlobalISel/LegalizerInfo.h"
2581ad6265SDimitry Andric #include "llvm/CodeGen/SelectionDAGTargetInfo.h"
2681ad6265SDimitry Andric #include "llvm/CodeGen/TargetSubtargetInfo.h"
2781ad6265SDimitry Andric #include "llvm/IR/DataLayout.h"
2881ad6265SDimitry Andric #include "llvm/Target/TargetMachine.h"
295f757f3fSDimitry Andric #include "llvm/TargetParser/Triple.h"
3081ad6265SDimitry Andric 
3181ad6265SDimitry Andric #define GET_SUBTARGETINFO_HEADER
3281ad6265SDimitry Andric #include "SPIRVGenSubtargetInfo.inc"
3381ad6265SDimitry Andric 
3481ad6265SDimitry Andric namespace llvm {
3581ad6265SDimitry Andric class StringRef;
3681ad6265SDimitry Andric class SPIRVTargetMachine;
3781ad6265SDimitry Andric 
3881ad6265SDimitry Andric class SPIRVSubtarget : public SPIRVGenSubtargetInfo {
3981ad6265SDimitry Andric private:
4081ad6265SDimitry Andric   const unsigned PointerSize;
41*0fca6ea1SDimitry Andric   VersionTuple SPIRVVersion;
42*0fca6ea1SDimitry Andric   VersionTuple OpenCLVersion;
4381ad6265SDimitry Andric 
44bdd1243dSDimitry Andric   SmallSet<SPIRV::Extension::Extension, 4> AvailableExtensions;
45bdd1243dSDimitry Andric   SmallSet<SPIRV::InstructionSet::InstructionSet, 4> AvailableExtInstSets;
4681ad6265SDimitry Andric   std::unique_ptr<SPIRVGlobalRegistry> GR;
4781ad6265SDimitry Andric 
4881ad6265SDimitry Andric   SPIRVInstrInfo InstrInfo;
4981ad6265SDimitry Andric   SPIRVFrameLowering FrameLowering;
5081ad6265SDimitry Andric   SPIRVTargetLowering TLInfo;
515f757f3fSDimitry Andric   Triple TargetTriple;
5281ad6265SDimitry Andric 
5381ad6265SDimitry Andric   // GlobalISel related APIs.
5481ad6265SDimitry Andric   std::unique_ptr<CallLowering> CallLoweringInfo;
5581ad6265SDimitry Andric   std::unique_ptr<RegisterBankInfo> RegBankInfo;
5681ad6265SDimitry Andric   std::unique_ptr<LegalizerInfo> Legalizer;
5781ad6265SDimitry Andric   std::unique_ptr<InstructionSelector> InstSelector;
58*0fca6ea1SDimitry Andric   std::unique_ptr<InlineAsmLowering> InlineAsmInfo;
5981ad6265SDimitry Andric 
60bdd1243dSDimitry Andric   // TODO: Initialise the available extensions, extended instruction sets
61bdd1243dSDimitry Andric   // based on the environment settings.
62bdd1243dSDimitry Andric   void initAvailableExtensions();
63bdd1243dSDimitry Andric   void initAvailableExtInstSets();
64bdd1243dSDimitry Andric 
6581ad6265SDimitry Andric public:
6681ad6265SDimitry Andric   // This constructor initializes the data members to match that
6781ad6265SDimitry Andric   // of the specified triple.
6881ad6265SDimitry Andric   SPIRVSubtarget(const Triple &TT, const std::string &CPU,
6981ad6265SDimitry Andric                  const std::string &FS, const SPIRVTargetMachine &TM);
7081ad6265SDimitry Andric   SPIRVSubtarget &initSubtargetDependencies(StringRef CPU, StringRef FS);
7181ad6265SDimitry Andric 
7281ad6265SDimitry Andric   // Parses features string setting specified subtarget options.
7381ad6265SDimitry Andric   // The definition of this function is auto generated by tblgen.
7481ad6265SDimitry Andric   void ParseSubtargetFeatures(StringRef CPU, StringRef TuneCPU, StringRef FS);
7581ad6265SDimitry Andric   unsigned getPointerSize() const { return PointerSize; }
76*0fca6ea1SDimitry Andric   unsigned getBound() const { return GR->getBound(); }
7781ad6265SDimitry Andric   bool canDirectlyComparePointers() const;
78bdd1243dSDimitry Andric   // TODO: this environment is not implemented in Triple, we need to decide
795f757f3fSDimitry Andric   // how to standardize its support. For now, let's assume SPIR-V with physical
805f757f3fSDimitry Andric   // addressing is OpenCL, and Logical addressing is Vulkan.
815f757f3fSDimitry Andric   bool isOpenCLEnv() const {
825f757f3fSDimitry Andric     return TargetTriple.getArch() == Triple::spirv32 ||
835f757f3fSDimitry Andric            TargetTriple.getArch() == Triple::spirv64;
845f757f3fSDimitry Andric   }
855f757f3fSDimitry Andric   bool isVulkanEnv() const { return TargetTriple.getArch() == Triple::spirv; }
86*0fca6ea1SDimitry Andric   const std::string &getTargetTripleAsStr() const { return TargetTriple.str(); }
87*0fca6ea1SDimitry Andric   VersionTuple getSPIRVVersion() const { return SPIRVVersion; };
88*0fca6ea1SDimitry Andric   bool isAtLeastSPIRVVer(VersionTuple VerToCompareTo) const;
89*0fca6ea1SDimitry Andric   bool isAtLeastOpenCLVer(VersionTuple VerToCompareTo) const;
90bdd1243dSDimitry Andric   // TODO: implement command line args or other ways to determine this.
91bdd1243dSDimitry Andric   bool hasOpenCLFullProfile() const { return true; }
92bdd1243dSDimitry Andric   bool hasOpenCLImageSupport() const { return true; }
935f757f3fSDimitry Andric   const SmallSet<SPIRV::Extension::Extension, 4> &
945f757f3fSDimitry Andric   getAllAvailableExtensions() const {
955f757f3fSDimitry Andric     return AvailableExtensions;
965f757f3fSDimitry Andric   }
97bdd1243dSDimitry Andric   bool canUseExtension(SPIRV::Extension::Extension E) const;
98bdd1243dSDimitry Andric   bool canUseExtInstSet(SPIRV::InstructionSet::InstructionSet E) const;
99bdd1243dSDimitry Andric 
10081ad6265SDimitry Andric   SPIRVGlobalRegistry *getSPIRVGlobalRegistry() const { return GR.get(); }
10181ad6265SDimitry Andric 
10281ad6265SDimitry Andric   const CallLowering *getCallLowering() const override {
10381ad6265SDimitry Andric     return CallLoweringInfo.get();
10481ad6265SDimitry Andric   }
10581ad6265SDimitry Andric   const RegisterBankInfo *getRegBankInfo() const override {
10681ad6265SDimitry Andric     return RegBankInfo.get();
10781ad6265SDimitry Andric   }
10881ad6265SDimitry Andric   const LegalizerInfo *getLegalizerInfo() const override {
10981ad6265SDimitry Andric     return Legalizer.get();
11081ad6265SDimitry Andric   }
11181ad6265SDimitry Andric   InstructionSelector *getInstructionSelector() const override {
11281ad6265SDimitry Andric     return InstSelector.get();
11381ad6265SDimitry Andric   }
114*0fca6ea1SDimitry Andric   const InlineAsmLowering *getInlineAsmLowering() const override {
115*0fca6ea1SDimitry Andric     return InlineAsmInfo.get();
116*0fca6ea1SDimitry Andric   }
11781ad6265SDimitry Andric   const SPIRVInstrInfo *getInstrInfo() const override { return &InstrInfo; }
11881ad6265SDimitry Andric   const SPIRVFrameLowering *getFrameLowering() const override {
11981ad6265SDimitry Andric     return &FrameLowering;
12081ad6265SDimitry Andric   }
12181ad6265SDimitry Andric   const SPIRVTargetLowering *getTargetLowering() const override {
12281ad6265SDimitry Andric     return &TLInfo;
12381ad6265SDimitry Andric   }
12481ad6265SDimitry Andric   const SPIRVRegisterInfo *getRegisterInfo() const override {
12581ad6265SDimitry Andric     return &InstrInfo.getRegisterInfo();
12681ad6265SDimitry Andric   }
1275f757f3fSDimitry Andric 
1285f757f3fSDimitry Andric   static bool classof(const TargetSubtargetInfo *ST) {
1295f757f3fSDimitry Andric     return ST->getTargetTriple().isSPIRV();
1305f757f3fSDimitry Andric   }
13181ad6265SDimitry Andric };
13281ad6265SDimitry Andric } // namespace llvm
13381ad6265SDimitry Andric 
13481ad6265SDimitry Andric #endif // LLVM_LIB_TARGET_SPIRV_SPIRVSUBTARGET_H
135