@@ -23,10 +23,26 @@ namespace {
2323
2424const unsigned OfflineLibMinor = 0xF ;
2525const unsigned MaxShaderModel6Minor = 7 ;
26+
27+ bool isLegalVersion (VersionTuple Version, unsigned Major, unsigned MinMinor,
28+ unsigned MaxMinor) {
29+ VersionTuple Min (Major, MinMinor);
30+ VersionTuple Max (Major, MaxMinor);
31+ return Min <= Version && Version <= Max;
32+ }
33+
2634bool isLegalShaderModel (Triple &T) {
2735 if (T.getOS () != Triple::OSType::ShaderModel)
2836 return false ;
2937
38+ auto Version = T.getOSVersion ();
39+ if (Version.getBuild ())
40+ return false ;
41+ if (Version.getSubminor ())
42+ return false ;
43+ if (!Version.getMinor ())
44+ return false ;
45+
3046 auto Kind = T.getEnvironment ();
3147
3248 switch (Kind) {
@@ -37,69 +53,29 @@ bool isLegalShaderModel(Triple &T) {
3753 case Triple::EnvironmentType::Domain:
3854 case Triple::EnvironmentType::Geometry:
3955 case Triple::EnvironmentType::Pixel:
40- case Triple::EnvironmentType::Compute:
41- case Triple::EnvironmentType::Library:
42- case Triple::EnvironmentType::Amplification:
43- case Triple::EnvironmentType::Mesh:
44- break ;
45- }
46-
47- auto Version = T.getOSVersion ();
48- if (Version.getBuild ())
49- return false ;
50- if (Version.getSubminor ())
51- return false ;
52-
53- auto OMinor = Version.getMinor ();
54- if (!OMinor.hasValue ())
55- return false ;
56-
57- unsigned Minor = OMinor.getValue ();
58- unsigned Major = Version.getMajor ();
59-
60- switch (Major) {
61- case 4 :
62- case 5 : {
63- switch (Minor) {
64- case 0 :
65- case 1 :
66- switch (Kind) {
67- case Triple::EnvironmentType::Vertex:
68- break ;
69- default :
70- return false ;
71- }
72- break ;
73- default :
74- return false ;
75- }
56+ case Triple::EnvironmentType::Compute: {
57+ if (isLegalVersion (Version, 4 , 0 , 1 ))
58+ return true ;
59+ if (isLegalVersion (Version, 5 , 0 , 1 ))
60+ return true ;
61+
62+ if (isLegalVersion (Version, 6 , 0 , MaxShaderModel6Minor))
63+ return true ;
7664 } break ;
77- case 6 : {
78- switch (Kind) {
79- default :
80- break ;
81- case Triple::EnvironmentType::Library: {
82- if (Minor < 3 )
83- return false ;
84- } break ;
85- case Triple::EnvironmentType::Amplification:
86- case Triple::EnvironmentType::Mesh: {
87- if (Minor < 5 )
88- return false ;
89- } break ;
90- }
91- if (Minor == OfflineLibMinor) {
92- if (Kind != Triple::EnvironmentType::Library)
93- return false ;
94- } else if (Minor > MaxShaderModel6Minor) {
95- return false ;
96- }
65+ case Triple::EnvironmentType::Library: {
66+ VersionTuple SM6x (6 , OfflineLibMinor);
67+ if (Version == SM6x)
68+ return true ;
69+ if (isLegalVersion (Version, 6 , 3 , MaxShaderModel6Minor))
70+ return true ;
71+ } break ;
72+ case Triple::EnvironmentType::Amplification:
73+ case Triple::EnvironmentType::Mesh: {
74+ if (isLegalVersion (Version, 6 , 5 , MaxShaderModel6Minor))
75+ return true ;
9776 } break ;
98- default :
99- return false ;
10077 }
101-
102- return true ;
78+ return false ;
10379}
10480
10581std::string tryParseProfile (StringRef Profile) {
0 commit comments