15
15
#include " llvm/IR/Module.h"
16
16
#include " llvm/Support/DXILABI.h"
17
17
#include " llvm/Support/ErrorHandling.h"
18
- #include " llvm/TargetParser/Triple.h "
18
+ #include < optional >
19
19
20
20
using namespace llvm ;
21
21
using namespace llvm ::dxil;
@@ -151,9 +151,9 @@ struct OpCodeProperty {
151
151
dxil::OpCodeClass OpCodeClass;
152
152
// Offset in DXILOpCodeClassNameTable.
153
153
unsigned OpCodeClassNameOffset;
154
- std::vector <OpOverload> Overloads;
155
- std::vector <OpStage> Stages;
156
- std::vector <OpAttribute> Attributes;
154
+ llvm::SmallVector <OpOverload> Overloads;
155
+ llvm::SmallVector <OpStage> Stages;
156
+ llvm::SmallVector <OpAttribute> Attributes;
157
157
int OverloadParamIndex; // parameter index which control the overload.
158
158
// When < 0, should be only 1 overload type.
159
159
unsigned NumOfParameters; // Number of parameters include return value.
@@ -292,7 +292,7 @@ static FunctionType *getDXILOpFunctionType(const OpCodeProperty *Prop,
292
292
Type *ReturnTy, Type *OverloadTy) {
293
293
SmallVector<Type *> ArgTys;
294
294
295
- auto ParamKinds = getOpCodeParameterKind (*Prop);
295
+ const ParameterKind * ParamKinds = getOpCodeParameterKind (*Prop);
296
296
297
297
// Add ReturnTy as return type of the function
298
298
ArgTys.emplace_back (ReturnTy);
@@ -313,45 +313,43 @@ static FunctionType *getDXILOpFunctionType(const OpCodeProperty *Prop,
313
313
// / DXIL version not greater than DXILVer.
314
314
// / PropList is expected to be sorted in ascending order of DXIL version.
315
315
template <typename T>
316
- static int getPropIndex ( const std::vector <T> PropList,
317
- const VersionTuple DXILVer) {
318
- auto Size = PropList.size ();
319
- for (int I = Size - 1 ; I >= 0 ; I --) {
320
- auto OL = PropList[I] ;
321
- if (VersionTuple (OL .DXILVersion .Major , OL .DXILVersion .Minor ) <= DXILVer) {
322
- return I ;
316
+ static std::optional< size_t > getPropIndex (ArrayRef <T> PropList,
317
+ const VersionTuple DXILVer) {
318
+ size_t Index = PropList.size () - 1 ;
319
+ for (auto Iter = PropList. rbegin (); Iter != PropList. rend (); Iter++, Index --) {
320
+ const T& Prop = *Iter ;
321
+ if (VersionTuple (Prop .DXILVersion .Major , Prop .DXILVersion .Minor ) <= DXILVer) {
322
+ return Index ;
323
323
}
324
324
}
325
- report_fatal_error (Twine (DXILVer.getAsString ()) + " : Unknown DXIL Version" ,
326
- /* gen_crash_diag*/ false );
327
-
328
- return -1 ;
325
+ return std::nullopt;
329
326
}
330
327
331
328
namespace llvm {
332
329
namespace dxil {
333
330
334
- // No extra checks on TargetTripleStr need be performed to verify that the
331
+ // No extra checks on TargetTriple need be performed to verify that the
335
332
// Triple is well-formed or that the target is supported since these checks
336
333
// would have been done at the time the module M is constructed in the earlier
337
334
// stages of compilation.
338
335
DXILOpBuilder::DXILOpBuilder (Module &M, IRBuilderBase &B)
339
- : M(M), B(B), TargetTripleStr( M.getTargetTriple()) {}
336
+ : M(M), B(B), TargetTriple(Triple( M.getTargetTriple() )) {}
340
337
341
338
CallInst *DXILOpBuilder::createDXILOpCall (dxil::OpCode OpCode, Type *ReturnTy,
342
339
Type *OverloadTy,
343
340
SmallVector<Value *> Args) {
344
341
345
- auto Major = Triple (TargetTripleStr).getDXILVersion ().getMajor ();
346
- auto MinorOrErr = Triple (TargetTripleStr).getDXILVersion ().getMinor ();
347
- uint32_t Minor = MinorOrErr.has_value () ? *MinorOrErr : 0 ;
348
- VersionTuple DXILVer (Major, Minor);
349
- // Get Shader Stage Kind
350
- Triple::EnvironmentType ShaderEnv = Triple (TargetTripleStr).getEnvironment ();
342
+ VersionTuple DXILVer = TargetTriple.getDXILVersion ();
351
343
352
344
const OpCodeProperty *Prop = getOpCodeProperty (OpCode);
353
- int OlIndex = getPropIndex (Prop->Overloads , DXILVer);
354
- uint16_t ValidTyMask = Prop->Overloads [OlIndex].ValidTys ;
345
+ auto OlIndexOrErr = getPropIndex (ArrayRef (Prop->Overloads ), DXILVer);
346
+ if (!OlIndexOrErr.has_value ()) {
347
+ report_fatal_error (Twine (getOpCodeName (OpCode)) +
348
+ " : No valid overloads found for DXIL Version - " +
349
+ DXILVer.getAsString (),
350
+ /* gen_crash_diag*/ false );
351
+ }
352
+ uint16_t ValidTyMask = Prop->Overloads [*OlIndexOrErr].ValidTys ;
355
353
356
354
OverloadKind Kind = getOverloadKind (OverloadTy);
357
355
@@ -364,6 +362,8 @@ CallInst *DXILOpBuilder::createDXILOpCall(dxil::OpCode OpCode, Type *ReturnTy,
364
362
/* gen_crash_diag=*/ false );
365
363
}
366
364
365
+ // Get Shader Stage Kind
366
+ Triple::EnvironmentType ShaderEnv = TargetTriple.getEnvironment ();
367
367
// Ensure Environment type is known
368
368
if (ShaderEnv == Triple::UnknownEnvironment) {
369
369
report_fatal_error (
@@ -374,9 +374,15 @@ CallInst *DXILOpBuilder::createDXILOpCall(dxil::OpCode OpCode, Type *ReturnTy,
374
374
375
375
// Perform necessary checks to ensure Opcode is valid in the targeted shader
376
376
// kind
377
- int StIndex = getPropIndex (Prop->Stages , DXILVer);
378
- uint16_t ValidShaderKindMask = Prop->Stages [StIndex].ValidStages ;
379
- enum ShaderKind ModuleStagekind = getShaderKindEnum (ShaderEnv);
377
+ auto StIndexOrErr = getPropIndex (ArrayRef (Prop->Stages ), DXILVer);
378
+ if (!StIndexOrErr.has_value ()) {
379
+ report_fatal_error (Twine (getOpCodeName (OpCode)) +
380
+ " : No valid stages found for DXIL Version - " +
381
+ DXILVer.getAsString (),
382
+ /* gen_crash_diag*/ false );
383
+ }
384
+ uint16_t ValidShaderKindMask = Prop->Stages [*StIndexOrErr].ValidStages ;
385
+ ShaderKind ModuleStagekind = getShaderKindEnum (ShaderEnv);
380
386
381
387
// Ensure valid shader stage properties are specified
382
388
if (ValidShaderKindMask == ShaderKind::removed) {
@@ -392,7 +398,7 @@ CallInst *DXILOpBuilder::createDXILOpCall(dxil::OpCode OpCode, Type *ReturnTy,
392
398
393
399
// Verify the target shader stage is valid for the DXIL operation
394
400
if (!(ValidShaderKindMask & ModuleStagekind)) {
395
- auto ShaderEnvStr = Triple (TargetTripleStr) .getEnvironmentName ();
401
+ auto ShaderEnvStr = TargetTriple .getEnvironmentName ();
396
402
report_fatal_error (Twine (ShaderEnvStr) +
397
403
" : Invalid Shader Stage for DXIL operation - " +
398
404
getOpCodeName (OpCode) + " for DXIL Version " +
@@ -431,7 +437,7 @@ Type *DXILOpBuilder::getOverloadTy(dxil::OpCode OpCode, FunctionType *FT) {
431
437
OverloadType = FT->getParamType (Prop->OverloadParamIndex - 1 );
432
438
}
433
439
434
- const auto *ParamKinds = getOpCodeParameterKind (*Prop);
440
+ const ParameterKind *ParamKinds = getOpCodeParameterKind (*Prop);
435
441
auto Kind = ParamKinds[Prop->OverloadParamIndex ];
436
442
// For ResRet and CBufferRet, OverloadTy is in field of StructType.
437
443
if (Kind == ParameterKind::CBufferRet ||
0 commit comments