brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.9 KiB · ad3e38d Raw
162 lines · c
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-exception6//7//===----------------------------------------------------------------------===//8//9// This file declares the SPIR-V specific subclass of TargetSubtargetInfo.10//11//===----------------------------------------------------------------------===//12 13#ifndef LLVM_LIB_TARGET_SPIRV_SPIRVSUBTARGET_H14#define LLVM_LIB_TARGET_SPIRV_SPIRVSUBTARGET_H15 16#include "SPIRVCallLowering.h"17#include "SPIRVFrameLowering.h"18#include "SPIRVISelLowering.h"19#include "SPIRVInlineAsmLowering.h"20#include "SPIRVInstrInfo.h"21#include "llvm/ADT/SmallSet.h"22#include "llvm/CodeGen/GlobalISel/CallLowering.h"23#include "llvm/CodeGen/GlobalISel/InstructionSelector.h"24#include "llvm/CodeGen/GlobalISel/LegalizerInfo.h"25#include "llvm/CodeGen/SelectionDAGTargetInfo.h"26#include "llvm/CodeGen/TargetSubtargetInfo.h"27#include "llvm/IR/DataLayout.h"28#include "llvm/Target/TargetMachine.h"29#include "llvm/TargetParser/Triple.h"30 31#define GET_SUBTARGETINFO_HEADER32#include "SPIRVGenSubtargetInfo.inc"33 34namespace llvm {35class StringRef;36class SPIRVTargetMachine;37 38class SPIRVSubtarget : public SPIRVGenSubtargetInfo {39public:40  // Enum for the SPIR-V environment: Kernel, Shader or Unknown.41  enum SPIRVEnvType { Kernel, Shader, Unknown };42 43private:44  const unsigned PointerSize;45  VersionTuple SPIRVVersion;46  VersionTuple OpenCLVersion;47 48  SmallSet<SPIRV::Extension::Extension, 4> AvailableExtensions;49  SmallSet<SPIRV::InstructionSet::InstructionSet, 4> AvailableExtInstSets;50  std::unique_ptr<SPIRVGlobalRegistry> GR;51 52  SPIRVInstrInfo InstrInfo;53  SPIRVFrameLowering FrameLowering;54  SPIRVTargetLowering TLInfo;55  Triple TargetTriple;56  SPIRVEnvType Env;57 58  // GlobalISel related APIs.59  std::unique_ptr<CallLowering> CallLoweringInfo;60  std::unique_ptr<RegisterBankInfo> RegBankInfo;61  std::unique_ptr<LegalizerInfo> Legalizer;62  std::unique_ptr<InstructionSelector> InstSelector;63  std::unique_ptr<InlineAsmLowering> InlineAsmInfo;64 65  // TODO: Initialise the available extensions, extended instruction sets66  // based on the environment settings.67  void initAvailableExtInstSets();68  void accountForAMDShaderTrinaryMinmax();69 70public:71  // This constructor initializes the data members to match that72  // of the specified triple.73  SPIRVSubtarget(const Triple &TT, const std::string &CPU,74                 const std::string &FS, const SPIRVTargetMachine &TM);75  SPIRVSubtarget &initSubtargetDependencies(StringRef CPU, StringRef FS);76 77  void initAvailableExtensions(78      const std::set<SPIRV::Extension::Extension> &AllowedExtIds);79 80  // Parses features string setting specified subtarget options.81  // The definition of this function is auto generated by tblgen.82  void ParseSubtargetFeatures(StringRef CPU, StringRef TuneCPU, StringRef FS);83  unsigned getPointerSize() const { return PointerSize; }84  unsigned getBound() const { return GR->getBound(); }85  bool canDirectlyComparePointers() const;86  void setEnv(SPIRVEnvType E) {87    if (E == Unknown)88      report_fatal_error("Unknown environment is not allowed.");89    if (Env != Unknown)90      report_fatal_error("Environment is already set.");91 92    Env = E;93  }94  SPIRVEnvType getEnv() const { return Env; }95  bool isKernel() const { return getEnv() == Kernel; }96  bool isShader() const { return getEnv() == Shader; }97  bool isLogicalSPIRV() const {98    return TargetTriple.getArch() == Triple::spirv;99  }100  bool isPhysicalSPIRV() const {101    return TargetTriple.getArch() == Triple::spirv32 ||102           TargetTriple.getArch() == Triple::spirv64;103  }104  const std::string &getTargetTripleAsStr() const { return TargetTriple.str(); }105  VersionTuple getSPIRVVersion() const { return SPIRVVersion; };106  bool isAtLeastSPIRVVer(VersionTuple VerToCompareTo) const;107  bool isAtLeastOpenCLVer(VersionTuple VerToCompareTo) const;108  // TODO: implement command line args or other ways to determine this.109  bool hasOpenCLFullProfile() const { return true; }110  bool hasOpenCLImageSupport() const { return true; }111  const SmallSet<SPIRV::Extension::Extension, 4> &112  getAllAvailableExtensions() const {113    return AvailableExtensions;114  }115  bool canUseExtension(SPIRV::Extension::Extension E) const;116  bool canUseExtInstSet(SPIRV::InstructionSet::InstructionSet E) const;117  SPIRV::InstructionSet::InstructionSet getPreferredInstructionSet() const;118 119  SPIRVGlobalRegistry *getSPIRVGlobalRegistry() const { return GR.get(); }120 121  const CallLowering *getCallLowering() const override {122    return CallLoweringInfo.get();123  }124  const RegisterBankInfo *getRegBankInfo() const override {125    return RegBankInfo.get();126  }127  const LegalizerInfo *getLegalizerInfo() const override {128    return Legalizer.get();129  }130  InstructionSelector *getInstructionSelector() const override {131    return InstSelector.get();132  }133  const InlineAsmLowering *getInlineAsmLowering() const override {134    return InlineAsmInfo.get();135  }136  const SPIRVInstrInfo *getInstrInfo() const override { return &InstrInfo; }137  const SPIRVFrameLowering *getFrameLowering() const override {138    return &FrameLowering;139  }140  const SPIRVTargetLowering *getTargetLowering() const override {141    return &TLInfo;142  }143  const SPIRVRegisterInfo *getRegisterInfo() const override {144    return &InstrInfo.getRegisterInfo();145  }146 147  static bool classof(const TargetSubtargetInfo *ST) {148    return ST->getTargetTriple().isSPIRV();149  }150 151  static constexpr unsigned MaxLegalAddressSpace = 6;152 153  // Adds known SPIR-V extensions to the global list of allowed extensions that154  // SPIRVSubtarget module owns as155  // cl::opt<std::set<SPIRV::Extension::Extension>, ...> global variable.156  static void157  addExtensionsToClOpt(const std::set<SPIRV::Extension::Extension> &AllowList);158};159} // namespace llvm160 161#endif // LLVM_LIB_TARGET_SPIRV_SPIRVSUBTARGET_H162