| //===- DXILOpBuilder.h - Helper class for build DIXLOp functions ----------===// | 
 | // | 
 | // 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 | 
 | // | 
 | //===----------------------------------------------------------------------===// | 
 | /// | 
 | /// \file This file contains class to help build DXIL op functions. | 
 | //===----------------------------------------------------------------------===// | 
 |  | 
 | #ifndef LLVM_LIB_TARGET_DIRECTX_DXILOPBUILDER_H | 
 | #define LLVM_LIB_TARGET_DIRECTX_DXILOPBUILDER_H | 
 |  | 
 | #include "DXILConstants.h" | 
 | #include "llvm/ADT/SmallVector.h" | 
 | #include "llvm/IR/IRBuilder.h" | 
 | #include "llvm/Support/DXILABI.h" | 
 | #include "llvm/Support/Error.h" | 
 | #include "llvm/TargetParser/Triple.h" | 
 |  | 
 | namespace llvm { | 
 | class Module; | 
 | class IRBuilderBase; | 
 | class CallInst; | 
 | class Constant; | 
 | class Value; | 
 | class Type; | 
 | class FunctionType; | 
 |  | 
 | namespace dxil { | 
 |  | 
 | class DXILOpBuilder { | 
 | public: | 
 |   DXILOpBuilder(Module &M); | 
 |  | 
 |   IRBuilder<> &getIRB() { return IRB; } | 
 |  | 
 |   /// Create a call instruction for the given DXIL op. The arguments | 
 |   /// must be valid for an overload of the operation. | 
 |   CallInst *createOp(dxil::OpCode Op, ArrayRef<Value *> Args, | 
 |                      const Twine &Name = "", Type *RetTy = nullptr); | 
 |  | 
 |   /// Try to create a call instruction for the given DXIL op. Fails if the | 
 |   /// overload is invalid. | 
 |   Expected<CallInst *> tryCreateOp(dxil::OpCode Op, ArrayRef<Value *> Args, | 
 |                                    const Twine &Name = "", | 
 |                                    Type *RetTy = nullptr); | 
 |  | 
 |   /// Get a `%dx.types.ResRet` type with the given element type. | 
 |   StructType *getResRetType(Type *ElementTy); | 
 |  | 
 |   /// Get a `%dx.types.CBufRet` type with the given element type. | 
 |   StructType *getCBufRetType(Type *ElementTy); | 
 |  | 
 |   /// Get the `%dx.types.Handle` type. | 
 |   StructType *getHandleType(); | 
 |  | 
 |   /// Get a constant `%dx.types.ResBind` value. | 
 |   Constant *getResBind(uint32_t LowerBound, uint32_t UpperBound, | 
 |                        uint32_t SpaceID, dxil::ResourceClass RC); | 
 |   /// Get a constant `%dx.types.ResourceProperties` value. | 
 |   Constant *getResProps(uint32_t Word0, uint32_t Word1); | 
 |  | 
 |   /// Return the name of the given opcode. | 
 |   static const char *getOpCodeName(dxil::OpCode DXILOp); | 
 |  | 
 | private: | 
 |   /// Gets a specific overload type of the function for the given DXIL op. If | 
 |   /// the operation is not overloaded, \c OverloadType may be nullptr. | 
 |   FunctionType *getOpFunctionType(dxil::OpCode OpCode, | 
 |                                   Type *OverloadType = nullptr); | 
 |  | 
 |   Module &M; | 
 |   IRBuilder<> IRB; | 
 |   VersionTuple DXILVersion; | 
 |   Triple::EnvironmentType ShaderStage; | 
 | }; | 
 |  | 
 | } // namespace dxil | 
 | } // namespace llvm | 
 |  | 
 | #endif |