File: SPIRVSubtarget.h

package info (click to toggle)
llvm-toolchain-19 1%3A19.1.7-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 1,998,520 kB
  • sloc: cpp: 6,951,680; ansic: 1,486,157; asm: 913,598; python: 232,024; f90: 80,126; objc: 75,281; lisp: 37,276; pascal: 16,990; sh: 10,009; ml: 5,058; perl: 4,724; awk: 3,523; makefile: 3,167; javascript: 2,504; xml: 892; fortran: 664; cs: 573
file content (134 lines) | stat: -rw-r--r-- 5,154 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
//===-- SPIRVSubtarget.h - SPIR-V Subtarget Information --------*- C++ -*--===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// This file declares the SPIR-V specific subclass of TargetSubtargetInfo.
//
//===----------------------------------------------------------------------===//

#ifndef LLVM_LIB_TARGET_SPIRV_SPIRVSUBTARGET_H
#define LLVM_LIB_TARGET_SPIRV_SPIRVSUBTARGET_H

#include "SPIRVCallLowering.h"
#include "SPIRVFrameLowering.h"
#include "SPIRVISelLowering.h"
#include "SPIRVInlineAsmLowering.h"
#include "SPIRVInstrInfo.h"
#include "llvm/ADT/SmallSet.h"
#include "llvm/CodeGen/GlobalISel/CallLowering.h"
#include "llvm/CodeGen/GlobalISel/InstructionSelector.h"
#include "llvm/CodeGen/GlobalISel/LegalizerInfo.h"
#include "llvm/CodeGen/SelectionDAGTargetInfo.h"
#include "llvm/CodeGen/TargetSubtargetInfo.h"
#include "llvm/IR/DataLayout.h"
#include "llvm/Target/TargetMachine.h"
#include "llvm/TargetParser/Triple.h"

#define GET_SUBTARGETINFO_HEADER
#include "SPIRVGenSubtargetInfo.inc"

namespace llvm {
class StringRef;
class SPIRVTargetMachine;

class SPIRVSubtarget : public SPIRVGenSubtargetInfo {
private:
  const unsigned PointerSize;
  VersionTuple SPIRVVersion;
  VersionTuple OpenCLVersion;

  SmallSet<SPIRV::Extension::Extension, 4> AvailableExtensions;
  SmallSet<SPIRV::InstructionSet::InstructionSet, 4> AvailableExtInstSets;
  std::unique_ptr<SPIRVGlobalRegistry> GR;

  SPIRVInstrInfo InstrInfo;
  SPIRVFrameLowering FrameLowering;
  SPIRVTargetLowering TLInfo;
  Triple TargetTriple;

  // GlobalISel related APIs.
  std::unique_ptr<CallLowering> CallLoweringInfo;
  std::unique_ptr<RegisterBankInfo> RegBankInfo;
  std::unique_ptr<LegalizerInfo> Legalizer;
  std::unique_ptr<InstructionSelector> InstSelector;
  std::unique_ptr<InlineAsmLowering> InlineAsmInfo;

  // TODO: Initialise the available extensions, extended instruction sets
  // based on the environment settings.
  void initAvailableExtensions();
  void initAvailableExtInstSets();

public:
  // This constructor initializes the data members to match that
  // of the specified triple.
  SPIRVSubtarget(const Triple &TT, const std::string &CPU,
                 const std::string &FS, const SPIRVTargetMachine &TM);
  SPIRVSubtarget &initSubtargetDependencies(StringRef CPU, StringRef FS);

  // Parses features string setting specified subtarget options.
  // The definition of this function is auto generated by tblgen.
  void ParseSubtargetFeatures(StringRef CPU, StringRef TuneCPU, StringRef FS);
  unsigned getPointerSize() const { return PointerSize; }
  unsigned getBound() const { return GR->getBound(); }
  bool canDirectlyComparePointers() const;
  // TODO: this environment is not implemented in Triple, we need to decide
  // how to standardize its support. For now, let's assume SPIR-V with physical
  // addressing is OpenCL, and Logical addressing is Vulkan.
  bool isOpenCLEnv() const {
    return TargetTriple.getArch() == Triple::spirv32 ||
           TargetTriple.getArch() == Triple::spirv64;
  }
  bool isVulkanEnv() const { return TargetTriple.getArch() == Triple::spirv; }
  const std::string &getTargetTripleAsStr() const { return TargetTriple.str(); }
  VersionTuple getSPIRVVersion() const { return SPIRVVersion; };
  bool isAtLeastSPIRVVer(VersionTuple VerToCompareTo) const;
  bool isAtLeastOpenCLVer(VersionTuple VerToCompareTo) const;
  // TODO: implement command line args or other ways to determine this.
  bool hasOpenCLFullProfile() const { return true; }
  bool hasOpenCLImageSupport() const { return true; }
  const SmallSet<SPIRV::Extension::Extension, 4> &
  getAllAvailableExtensions() const {
    return AvailableExtensions;
  }
  bool canUseExtension(SPIRV::Extension::Extension E) const;
  bool canUseExtInstSet(SPIRV::InstructionSet::InstructionSet E) const;

  SPIRVGlobalRegistry *getSPIRVGlobalRegistry() const { return GR.get(); }

  const CallLowering *getCallLowering() const override {
    return CallLoweringInfo.get();
  }
  const RegisterBankInfo *getRegBankInfo() const override {
    return RegBankInfo.get();
  }
  const LegalizerInfo *getLegalizerInfo() const override {
    return Legalizer.get();
  }
  InstructionSelector *getInstructionSelector() const override {
    return InstSelector.get();
  }
  const InlineAsmLowering *getInlineAsmLowering() const override {
    return InlineAsmInfo.get();
  }
  const SPIRVInstrInfo *getInstrInfo() const override { return &InstrInfo; }
  const SPIRVFrameLowering *getFrameLowering() const override {
    return &FrameLowering;
  }
  const SPIRVTargetLowering *getTargetLowering() const override {
    return &TLInfo;
  }
  const SPIRVRegisterInfo *getRegisterInfo() const override {
    return &InstrInfo.getRegisterInfo();
  }

  static bool classof(const TargetSubtargetInfo *ST) {
    return ST->getTargetTriple().isSPIRV();
  }
};
} // namespace llvm

#endif // LLVM_LIB_TARGET_SPIRV_SPIRVSUBTARGET_H