36 UserDefineType = 1 << 9,
57 case OverloadKind::HALF:
59 case OverloadKind::FLOAT:
61 case OverloadKind::DOUBLE:
63 case OverloadKind::I1:
65 case OverloadKind::I8:
67 case OverloadKind::I16:
69 case OverloadKind::I32:
71 case OverloadKind::I64:
73 case OverloadKind::VOID:
74 case OverloadKind::UNDEFINED:
76 case OverloadKind::ObjectType:
77 case OverloadKind::UserDefineType:
85 return OverloadKind::VOID;
90 return OverloadKind::VOID;
92 return OverloadKind::HALF;
94 return OverloadKind::FLOAT;
96 return OverloadKind::DOUBLE;
102 return OverloadKind::I1;
104 return OverloadKind::I8;
106 return OverloadKind::I16;
108 return OverloadKind::I32;
110 return OverloadKind::I64;
113 return OverloadKind::VOID;
117 return OverloadKind::UserDefineType;
125 return OverloadKind::UNDEFINED;
130 if (Kind < OverloadKind::UserDefineType) {
132 }
else if (Kind == OverloadKind::UserDefineType) {
134 return ST->getStructName().str();
135 }
else if (Kind == OverloadKind::ObjectType) {
137 return ST->getStructName().str();
162#define DXIL_OP_OPERATION_TABLE
163#include "DXILOperation.inc"
164#undef DXIL_OP_OPERATION_TABLE
168 if (Kind == OverloadKind::VOID) {
178 if (Kind == OverloadKind::VOID)
179 return TypeName.str();
181 assert(Kind < OverloadKind::UserDefineType &&
"invalid overload kind");
199 Type *FieldTypes[5] = {ElementTy, ElementTy, ElementTy, ElementTy,
218 {ElementTy, ElementTy, ElementTy, ElementTy,
219 ElementTy, ElementTy, ElementTy, ElementTy},
224 TypeName, {ElementTy, ElementTy, ElementTy, ElementTy}, Ctx);
267 case OpParamType::VoidTy:
269 case OpParamType::HalfTy:
271 case OpParamType::FloatTy:
273 case OpParamType::DoubleTy:
275 case OpParamType::Int1Ty:
277 case OpParamType::Int8Ty:
279 case OpParamType::Int16Ty:
281 case OpParamType::Int32Ty:
283 case OpParamType::Int64Ty:
285 case OpParamType::OverloadTy:
287 case OpParamType::ResRetHalfTy:
289 case OpParamType::ResRetFloatTy:
291 case OpParamType::ResRetDoubleTy:
293 case OpParamType::ResRetInt16Ty:
295 case OpParamType::ResRetInt32Ty:
297 case OpParamType::ResRetInt64Ty:
299 case OpParamType::CBufRetHalfTy:
301 case OpParamType::CBufRetFloatTy:
303 case OpParamType::CBufRetDoubleTy:
305 case OpParamType::CBufRetInt16Ty:
307 case OpParamType::CBufRetInt32Ty:
309 case OpParamType::CBufRetInt64Ty:
311 case OpParamType::HandleTy:
313 case OpParamType::ResBindTy:
315 case OpParamType::ResPropsTy:
317 case OpParamType::SplitDoubleTy:
319 case OpParamType::BinaryWithCarryTy:
329 return ShaderKind::pixel;
331 return ShaderKind::vertex;
333 return ShaderKind::geometry;
335 return ShaderKind::hull;
337 return ShaderKind::domain;
339 return ShaderKind::compute;
341 return ShaderKind::library;
343 return ShaderKind::raygeneration;
345 return ShaderKind::intersection;
347 return ShaderKind::anyhit;
349 return ShaderKind::closesthit;
351 return ShaderKind::miss;
353 return ShaderKind::callable;
355 return ShaderKind::mesh;
357 return ShaderKind::amplification;
362 "Shader Kind Not Found - Invalid DXIL Environment Specified");
384#define DXIL_OP_FUNCTION_TYPE(OpCode, RetType, ...) \
386 return FunctionType::get( \
387 getTypeFromOpParamType(RetType, Context, OverloadTy), \
388 getArgTypesFromOpParamTypes({__VA_ARGS__}, Context, OverloadTy), \
390#include "DXILOperation.inc"
401 size_t Index = PropList.
size() - 1;
402 for (
auto Iter = PropList.
rbegin(); Iter != PropList.
rend();
404 const T &Prop = *Iter;
405 if (
VersionTuple(Prop.DXILVersion.Major, Prop.DXILVersion.Minor) <=
419 return (OpCodePack << 32) | (VersionMajor << 16) | VersionMinor;
428#define DXIL_VERSION(MAJOR, MINOR) {MAJOR, MINOR},
429#include "DXILOperation.inc"
433 for (
auto Version : Versions) {
434 if (DXILVersion <
VersionTuple(Version.Major, Version.Minor))
440#define DXIL_OP_ATTRIBUTES(OpCode, VersionMajor, VersionMinor, ...) \
441 case computeSwitchEnum(OpCode, VersionMajor, VersionMinor): { \
442 auto Other = dxil::Attributes{__VA_ARGS__}; \
443 Attributes |= Other; \
446#include "DXILOperation.inc"
476 const Triple &TT = M.getTargetTriple();
477 DXILVersion = TT.getDXILVersion();
478 ShaderStage = TT.getEnvironment();
483 ": Unknown Compilation Target Shader Stage specified ");
488 return make_error<StringError>(
489 Twine(
"Cannot create ") + getOpCodeName(
OpCode) +
" operation: " + Msg,
499 Type *OverloadTy =
nullptr;
507 if (
static_cast<unsigned>(ArgIndex) >= Args.size())
509 OverloadTy = Args[ArgIndex]->getType();
515 std::optional<size_t> OlIndexOrErr =
517 if (!OlIndexOrErr.has_value())
527 if ((ValidTyMask != OverloadKind::UNDEFINED) &&
528 (ValidTyMask & (
uint16_t)Kind) == 0)
533 std::optional<size_t> StIndexOrErr =
535 if (!StIndexOrErr.has_value())
539 uint16_t ValidShaderKindMask = Prop->
Stages[*StIndexOrErr].ValidStages;
542 if (ValidShaderKindMask == ShaderKind::removed)
550 if (!(ValidShaderKindMask & ModuleStagekind))
559 OpArgs.
append(Args.begin(), Args.end());
573 if (
Error E = Result.takeError())
579 return ::getResRetType(ElementTy);
583 return ::getCBufRetType(ElementTy);
596 {ConstantInt::get(Int32Ty, LowerBound),
597 ConstantInt::get(Int32Ty, UpperBound),
598 ConstantInt::get(Int32Ty, SpaceID),
599 ConstantInt::get(Int8Ty, llvm::to_underlying(RC))});
606 {ConstantInt::get(Int32Ty, Word0), ConstantInt::get(Int32Ty, Word1)});
610 return ::getOpCodeName(DXILOp);
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static StructType * getResRetType(Type *ElementTy)
static ShaderKind getShaderKindEnum(Triple::EnvironmentType EnvType)
static Type * getTypeFromOpParamType(OpParamType Kind, LLVMContext &Ctx, Type *OverloadTy)
static std::optional< size_t > getPropIndex(ArrayRef< T > PropList, const VersionTuple DXILVer)
Get index of the property from PropList valid for the most recent DXIL version not greater than DXILV...
static SmallVector< Type * > getArgTypesFromOpParamTypes(ArrayRef< dxil::OpParamType > Types, LLVMContext &Context, Type *OverloadTy)
static void setDXILAttributes(CallInst *CI, dxil::OpCode OpCode, VersionTuple DXILVersion)
static const char * getOverloadTypeName(OverloadKind Kind)
static StructType * getCBufRetType(Type *ElementTy)
static StructType * getSplitDoubleType(LLVMContext &Context)
static OverloadKind getOverloadKind(Type *Ty)
static constexpr uint64_t computeSwitchEnum(dxil::OpCode OpCode, uint16_t VersionMajor, uint16_t VersionMinor)
static StructType * getBinaryWithCarryType(LLVMContext &Context)
static StructType * getOrCreateStructType(StringRef Name, ArrayRef< Type * > EltTys, LLVMContext &Ctx)
static StructType * getHandleType(LLVMContext &Ctx)
static dxil::Attributes getDXILAttributes(dxil::OpCode OpCode, VersionTuple DXILVersion)
static std::string constructOverloadName(OverloadKind Kind, Type *Ty, const OpCodeProperty &Prop)
static FunctionType * getDXILOpFunctionType(dxil::OpCode OpCode, LLVMContext &Context, Type *OverloadTy)
Construct DXIL function type.
constexpr StringLiteral DXILOpNamePrefix
static std::string constructOverloadTypeName(OverloadKind Kind, StringRef TypeName)
static StructType * getResPropsType(LLVMContext &Context)
static StructType * getResBindType(LLVMContext &Context)
Module.h This file contains the declarations for the Module class.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
reverse_iterator rend() const
size_t size() const
size - Get the array size.
reverse_iterator rbegin() const
LLVM_ABI void setDoesNotAccessMemory()
LLVM_ABI void setOnlyReadsMemory()
void setCannotDuplicate()
This class represents a function call, abstracting a target machine's calling convention.
static LLVM_ABI Constant * get(StructType *T, ArrayRef< Constant * > V)
This is an important base class in LLVM.
Lightweight error class with error context and mandatory checking.
Tagged union holding either a T or a Error.
A handy container for a FunctionType+Callee-pointer pair, which can be passed around as a single enti...
Class to represent function types.
IntegerType * getInt32Ty()
Fetch the type representing a 32-bit integer.
ConstantInt * getInt32(uint32_t C)
Get a constant 32-bit value.
LLVMContext & getContext() const
CallInst * CreateCall(FunctionType *FTy, Value *Callee, ArrayRef< Value * > Args={}, const Twine &Name="", MDNode *FPMathTag=nullptr)
IntegerType * getInt8Ty()
Fetch the type representing an 8-bit integer.
Class to represent integer types.
unsigned getBitWidth() const
Get the number of bits in this IntegerType.
This is an important class for using LLVM in a threaded context.
A Module instance is used to store all the information related to an LLVM module.
LLVMContext & getContext() const
Get the global data context.
FunctionCallee getOrInsertFunction(StringRef Name, FunctionType *T, AttributeList AttributeList)
Look up the specified function in the module symbol table.
reference emplace_back(ArgTypes &&... Args)
void append(ItTy in_start, ItTy in_end)
Add the specified range to the end of the SmallVector.
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
A wrapper around a string literal that serves as a proxy for constructing global tables of StringRefs...
StringRef - Represent a constant reference to a string, i.e.
Class to represent struct types.
static LLVM_ABI StructType * getTypeByName(LLVMContext &C, StringRef Name)
Return the type with the specified name, or null if there is none by that name.
static LLVM_ABI StructType * create(LLVMContext &Context, StringRef Name)
This creates an identified struct.
Triple - Helper class for working with autoconf configuration names.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
The instances of the Type class are immutable: once they are created, they are never changed.
static LLVM_ABI Type * getFloatTy(LLVMContext &C)
static LLVM_ABI Type * getDoubleTy(LLVMContext &C)
static LLVM_ABI IntegerType * getInt8Ty(LLVMContext &C)
static LLVM_ABI IntegerType * getInt32Ty(LLVMContext &C)
static LLVM_ABI Type * getHalfTy(LLVMContext &C)
TypeID
Definitions of all of the base types for the Type system.
@ HalfTyID
16-bit floating point type
@ VoidTyID
type with no size
@ FloatTyID
32-bit floating point type
@ IntegerTyID
Arbitrary bit width integers.
@ DoubleTyID
64-bit floating point type
static LLVM_ABI IntegerType * getInt1Ty(LLVMContext &C)
static LLVM_ABI IntegerType * getInt64Ty(LLVMContext &C)
static LLVM_ABI Type * getVoidTy(LLVMContext &C)
bool isHalfTy() const
Return true if this is 'half', a 16-bit IEEE fp type.
LLVMContext & getContext() const
Return the LLVMContext in which this type was uniqued.
bool isDoubleTy() const
Return true if this is 'double', a 64-bit IEEE fp type.
static LLVM_ABI IntegerType * getInt16Ty(LLVMContext &C)
bool isIntegerTy() const
True if this is an instance of IntegerType.
TypeID getTypeID() const
Return the type id for the type.
LLVM_ABI void print(raw_ostream &O, bool IsForDebug=false, bool NoDetails=false) const
Print the current type.
Represents a version number in the form major[.minor[.subminor[.build]]].
LLVM_ABI std::string getAsString() const
Retrieve a string representation of the version number.
StructType * getResRetType(Type *ElementTy)
Get a dx.types.ResRet type with the given element type.
Expected< CallInst * > tryCreateOp(dxil::OpCode Op, ArrayRef< Value * > Args, const Twine &Name="", Type *RetTy=nullptr)
Try to create a call instruction for the given DXIL op.
CallInst * createOp(dxil::OpCode Op, ArrayRef< Value * > Args, const Twine &Name="", Type *RetTy=nullptr)
Create a call instruction for the given DXIL op.
Constant * getResBind(uint32_t LowerBound, uint32_t UpperBound, uint32_t SpaceID, dxil::ResourceClass RC)
Get a constant dx.types.ResBind value.
static const char * getOpCodeName(dxil::OpCode DXILOp)
Return the name of the given opcode.
Constant * getResProps(uint32_t Word0, uint32_t Word1)
Get a constant dx.types.ResourceProperties value.
StructType * getHandleType()
Get the dx.types.Handle type.
StructType * getCBufRetType(Type *ElementTy)
Get a dx.types.CBufRet type with the given element type.
A raw_ostream that writes to an std::string.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
static Error makeOpError(dxil::OpCode OpCode, Twine Msg)
This is an optimization pass for GlobalISel generic memory operations.
LLVM_ABI std::error_code inconvertibleErrorCode()
The value returned by this function can be returned from convertToErrorCode for Error values where no...
LLVM_GET_TYPE_NAME_CONSTEXPR StringRef getTypeName()
We provide a function which tries to compute the (demangled) name of a type statically.
constexpr std::underlying_type_t< Enum > to_underlying(Enum E)
Returns underlying integer value of an enum.
LLVM_ABI void reportFatalUsageError(Error Err)
Report a fatal error that does not indicate a bug in LLVM.
llvm::SmallVector< OpOverload > Overloads
dxil::OpCodeClass OpCodeClass
unsigned OpCodeNameOffset
unsigned OpCodeClassNameOffset
llvm::SmallVector< OpStage > Stages