1515#include " llvm/IR/Module.h"
1616#include " llvm/Support/DXILABI.h"
1717#include " llvm/Support/ErrorHandling.h"
18- #include " llvm/TargetParser/Triple.h "
18+ #include < optional >
1919
2020using namespace llvm ;
2121using namespace llvm ::dxil;
@@ -151,9 +151,9 @@ struct OpCodeProperty {
151151 dxil::OpCodeClass OpCodeClass;
152152 // Offset in DXILOpCodeClassNameTable.
153153 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;
157157 int OverloadParamIndex; // parameter index which control the overload.
158158 // When < 0, should be only 1 overload type.
159159 unsigned NumOfParameters; // Number of parameters include return value.
@@ -292,7 +292,7 @@ static FunctionType *getDXILOpFunctionType(const OpCodeProperty *Prop,
292292 Type *ReturnTy, Type *OverloadTy) {
293293 SmallVector<Type *> ArgTys;
294294
295- auto ParamKinds = getOpCodeParameterKind (*Prop);
295+ const ParameterKind * ParamKinds = getOpCodeParameterKind (*Prop);
296296
297297 // Add ReturnTy as return type of the function
298298 ArgTys.emplace_back (ReturnTy);
@@ -313,45 +313,43 @@ static FunctionType *getDXILOpFunctionType(const OpCodeProperty *Prop,
313313// / DXIL version not greater than DXILVer.
314314// / PropList is expected to be sorted in ascending order of DXIL version.
315315template <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 ;
323323 }
324324 }
325- report_fatal_error (Twine (DXILVer.getAsString ()) + " : Unknown DXIL Version" ,
326- /* gen_crash_diag*/ false );
327-
328- return -1 ;
325+ return std::nullopt ;
329326}
330327
331328namespace llvm {
332329namespace dxil {
333330
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
335332// Triple is well-formed or that the target is supported since these checks
336333// would have been done at the time the module M is constructed in the earlier
337334// stages of compilation.
338335DXILOpBuilder::DXILOpBuilder (Module &M, IRBuilderBase &B)
339- : M(M), B(B), TargetTripleStr( M.getTargetTriple()) {}
336+ : M(M), B(B), TargetTriple(Triple( M.getTargetTriple() )) {}
340337
341338CallInst *DXILOpBuilder::createDXILOpCall (dxil::OpCode OpCode, Type *ReturnTy,
342339 Type *OverloadTy,
343340 SmallVector<Value *> Args) {
344341
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 ();
351343
352344 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 ;
355353
356354 OverloadKind Kind = getOverloadKind (OverloadTy);
357355
@@ -364,6 +362,8 @@ CallInst *DXILOpBuilder::createDXILOpCall(dxil::OpCode OpCode, Type *ReturnTy,
364362 /* gen_crash_diag=*/ false );
365363 }
366364
365+ // Get Shader Stage Kind
366+ Triple::EnvironmentType ShaderEnv = TargetTriple.getEnvironment ();
367367 // Ensure Environment type is known
368368 if (ShaderEnv == Triple::UnknownEnvironment) {
369369 report_fatal_error (
@@ -374,9 +374,15 @@ CallInst *DXILOpBuilder::createDXILOpCall(dxil::OpCode OpCode, Type *ReturnTy,
374374
375375 // Perform necessary checks to ensure Opcode is valid in the targeted shader
376376 // 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);
380386
381387 // Ensure valid shader stage properties are specified
382388 if (ValidShaderKindMask == ShaderKind::removed) {
@@ -392,7 +398,7 @@ CallInst *DXILOpBuilder::createDXILOpCall(dxil::OpCode OpCode, Type *ReturnTy,
392398
393399 // Verify the target shader stage is valid for the DXIL operation
394400 if (!(ValidShaderKindMask & ModuleStagekind)) {
395- auto ShaderEnvStr = Triple (TargetTripleStr) .getEnvironmentName ();
401+ auto ShaderEnvStr = TargetTriple .getEnvironmentName ();
396402 report_fatal_error (Twine (ShaderEnvStr) +
397403 " : Invalid Shader Stage for DXIL operation - " +
398404 getOpCodeName (OpCode) + " for DXIL Version " +
@@ -431,7 +437,7 @@ Type *DXILOpBuilder::getOverloadTy(dxil::OpCode OpCode, FunctionType *FT) {
431437 OverloadType = FT->getParamType (Prop->OverloadParamIndex - 1 );
432438 }
433439
434- const auto *ParamKinds = getOpCodeParameterKind (*Prop);
440+ const ParameterKind *ParamKinds = getOpCodeParameterKind (*Prop);
435441 auto Kind = ParamKinds[Prop->OverloadParamIndex ];
436442 // For ResRet and CBufferRet, OverloadTy is in field of StructType.
437443 if (Kind == ParameterKind::CBufferRet ||
0 commit comments