[SampleProfileLoader] Fix integer overflow in generateMDProfMetadata (#90217)
[llvm-project.git] / llvm / lib / Target / SPIRV / SPIRVSubtarget.h
blob3e4044084266c80ac53fd03408220f5743ae1cdc
1 //===-- SPIRVSubtarget.h - SPIR-V Subtarget Information --------*- C++ -*--===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // This file declares the SPIR-V specific subclass of TargetSubtargetInfo.
11 //===----------------------------------------------------------------------===//
13 #ifndef LLVM_LIB_TARGET_SPIRV_SPIRVSUBTARGET_H
14 #define LLVM_LIB_TARGET_SPIRV_SPIRVSUBTARGET_H
16 #include "SPIRVCallLowering.h"
17 #include "SPIRVFrameLowering.h"
18 #include "SPIRVISelLowering.h"
19 #include "SPIRVInstrInfo.h"
20 #include "llvm/ADT/SmallSet.h"
21 #include "llvm/CodeGen/GlobalISel/CallLowering.h"
22 #include "llvm/CodeGen/GlobalISel/InstructionSelector.h"
23 #include "llvm/CodeGen/GlobalISel/LegalizerInfo.h"
24 #include "llvm/CodeGen/SelectionDAGTargetInfo.h"
25 #include "llvm/CodeGen/TargetSubtargetInfo.h"
26 #include "llvm/IR/DataLayout.h"
27 #include "llvm/Target/TargetMachine.h"
28 #include "llvm/TargetParser/Triple.h"
30 #define GET_SUBTARGETINFO_HEADER
31 #include "SPIRVGenSubtargetInfo.inc"
33 namespace llvm {
34 class StringRef;
35 class SPIRVTargetMachine;
37 class SPIRVSubtarget : public SPIRVGenSubtargetInfo {
38 private:
39 const unsigned PointerSize;
40 VersionTuple SPIRVVersion;
41 VersionTuple OpenCLVersion;
43 SmallSet<SPIRV::Extension::Extension, 4> AvailableExtensions;
44 SmallSet<SPIRV::InstructionSet::InstructionSet, 4> AvailableExtInstSets;
45 std::unique_ptr<SPIRVGlobalRegistry> GR;
47 SPIRVInstrInfo InstrInfo;
48 SPIRVFrameLowering FrameLowering;
49 SPIRVTargetLowering TLInfo;
50 Triple TargetTriple;
52 // GlobalISel related APIs.
53 std::unique_ptr<CallLowering> CallLoweringInfo;
54 std::unique_ptr<RegisterBankInfo> RegBankInfo;
55 std::unique_ptr<LegalizerInfo> Legalizer;
56 std::unique_ptr<InstructionSelector> InstSelector;
58 // TODO: Initialise the available extensions, extended instruction sets
59 // based on the environment settings.
60 void initAvailableExtensions();
61 void initAvailableExtInstSets();
63 public:
64 // This constructor initializes the data members to match that
65 // of the specified triple.
66 SPIRVSubtarget(const Triple &TT, const std::string &CPU,
67 const std::string &FS, const SPIRVTargetMachine &TM);
68 SPIRVSubtarget &initSubtargetDependencies(StringRef CPU, StringRef FS);
70 // Parses features string setting specified subtarget options.
71 // The definition of this function is auto generated by tblgen.
72 void ParseSubtargetFeatures(StringRef CPU, StringRef TuneCPU, StringRef FS);
73 unsigned getPointerSize() const { return PointerSize; }
74 unsigned getBound() const { return GR->getBound(); }
75 bool canDirectlyComparePointers() const;
76 // TODO: this environment is not implemented in Triple, we need to decide
77 // how to standardize its support. For now, let's assume SPIR-V with physical
78 // addressing is OpenCL, and Logical addressing is Vulkan.
79 bool isOpenCLEnv() const {
80 return TargetTriple.getArch() == Triple::spirv32 ||
81 TargetTriple.getArch() == Triple::spirv64;
83 bool isVulkanEnv() const { return TargetTriple.getArch() == Triple::spirv; }
84 VersionTuple getSPIRVVersion() const { return SPIRVVersion; };
85 bool isAtLeastSPIRVVer(VersionTuple VerToCompareTo) const;
86 bool isAtLeastOpenCLVer(VersionTuple VerToCompareTo) const;
87 // TODO: implement command line args or other ways to determine this.
88 bool hasOpenCLFullProfile() const { return true; }
89 bool hasOpenCLImageSupport() const { return true; }
90 const SmallSet<SPIRV::Extension::Extension, 4> &
91 getAllAvailableExtensions() const {
92 return AvailableExtensions;
94 bool canUseExtension(SPIRV::Extension::Extension E) const;
95 bool canUseExtInstSet(SPIRV::InstructionSet::InstructionSet E) const;
97 SPIRVGlobalRegistry *getSPIRVGlobalRegistry() const { return GR.get(); }
99 const CallLowering *getCallLowering() const override {
100 return CallLoweringInfo.get();
102 const RegisterBankInfo *getRegBankInfo() const override {
103 return RegBankInfo.get();
105 const LegalizerInfo *getLegalizerInfo() const override {
106 return Legalizer.get();
108 InstructionSelector *getInstructionSelector() const override {
109 return InstSelector.get();
111 const SPIRVInstrInfo *getInstrInfo() const override { return &InstrInfo; }
112 const SPIRVFrameLowering *getFrameLowering() const override {
113 return &FrameLowering;
115 const SPIRVTargetLowering *getTargetLowering() const override {
116 return &TLInfo;
118 const SPIRVRegisterInfo *getRegisterInfo() const override {
119 return &InstrInfo.getRegisterInfo();
122 static bool classof(const TargetSubtargetInfo *ST) {
123 return ST->getTargetTriple().isSPIRV();
126 } // namespace llvm
128 #endif // LLVM_LIB_TARGET_SPIRV_SPIRVSUBTARGET_H