brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.7 KiB · 0985f2e Raw
84 lines · c
1//===- DXILOpBuilder.h - Helper class for build DIXLOp functions ----------===//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/// \file This file contains class to help build DXIL op functions.10//===----------------------------------------------------------------------===//11 12#ifndef LLVM_LIB_TARGET_DIRECTX_DXILOPBUILDER_H13#define LLVM_LIB_TARGET_DIRECTX_DXILOPBUILDER_H14 15#include "DXILConstants.h"16#include "llvm/ADT/SmallVector.h"17#include "llvm/IR/IRBuilder.h"18#include "llvm/Support/DXILABI.h"19#include "llvm/Support/Error.h"20#include "llvm/TargetParser/Triple.h"21 22namespace llvm {23class Module;24class IRBuilderBase;25class CallInst;26class Constant;27class Value;28class Type;29class FunctionType;30 31namespace dxil {32 33class DXILOpBuilder {34public:35  DXILOpBuilder(Module &M);36 37  IRBuilder<> &getIRB() { return IRB; }38 39  /// Create a call instruction for the given DXIL op. The arguments40  /// must be valid for an overload of the operation.41  CallInst *createOp(dxil::OpCode Op, ArrayRef<Value *> Args,42                     const Twine &Name = "", Type *RetTy = nullptr);43 44  /// Try to create a call instruction for the given DXIL op. Fails if the45  /// overload is invalid.46  Expected<CallInst *> tryCreateOp(dxil::OpCode Op, ArrayRef<Value *> Args,47                                   const Twine &Name = "",48                                   Type *RetTy = nullptr);49 50  /// Get a `%dx.types.ResRet` type with the given element type.51  StructType *getResRetType(Type *ElementTy);52 53  /// Get a `%dx.types.CBufRet` type with the given element type.54  StructType *getCBufRetType(Type *ElementTy);55 56  /// Get the `%dx.types.Handle` type.57  StructType *getHandleType();58 59  /// Get a constant `%dx.types.ResBind` value.60  Constant *getResBind(uint32_t LowerBound, uint32_t UpperBound,61                       uint32_t SpaceID, dxil::ResourceClass RC);62  /// Get a constant `%dx.types.ResourceProperties` value.63  Constant *getResProps(uint32_t Word0, uint32_t Word1);64 65  /// Return the name of the given opcode.66  static const char *getOpCodeName(dxil::OpCode DXILOp);67 68private:69  /// Gets a specific overload type of the function for the given DXIL op. If70  /// the operation is not overloaded, \c OverloadType may be nullptr.71  FunctionType *getOpFunctionType(dxil::OpCode OpCode,72                                  Type *OverloadType = nullptr);73 74  Module &M;75  IRBuilder<> IRB;76  VersionTuple DXILVersion;77  Triple::EnvironmentType ShaderStage;78};79 80} // namespace dxil81} // namespace llvm82 83#endif84