10
10
#include " llvm/ADT/Triple.h"
11
11
#include " CommonArgs.h"
12
12
#include " clang/Driver/DriverDiagnostic.h"
13
+ #include " llvm/ADT/StringSwitch.h"
13
14
14
15
using namespace clang ::driver;
15
16
using namespace clang ::driver::tools;
@@ -19,130 +20,83 @@ using namespace llvm::opt;
19
20
using namespace llvm ;
20
21
21
22
namespace {
22
- std::string tryParseProfile (StringRef profile ) {
23
+ std::string tryParseProfile (StringRef Profile ) {
23
24
// [ps|vs|gs|hs|ds|cs|ms|as]_[major]_[minor]
24
- Triple::EnvironmentType kind;
25
- switch (profile[0 ]) {
26
- case ' p' :
27
- kind = Triple::EnvironmentType::Pixel;
28
- break ;
29
- case ' v' :
30
- kind = Triple::EnvironmentType::Vertex;
31
- break ;
32
- case ' g' :
33
- kind = Triple::EnvironmentType::Geometry;
34
- break ;
35
- case ' h' :
36
- kind = Triple::EnvironmentType::Hull;
37
- break ;
38
- case ' d' :
39
- kind = Triple::EnvironmentType::Domain;
40
- break ;
41
- case ' c' :
42
- kind = Triple::EnvironmentType::Compute;
43
- break ;
44
- case ' l' :
45
- kind = Triple::EnvironmentType::Library;
46
- break ;
47
- case ' m' :
48
- kind = Triple::EnvironmentType::Mesh;
49
- break ;
50
- case ' a' :
51
- kind = Triple::EnvironmentType::Amplification;
52
- break ;
53
- default :
25
+ SmallVector<StringRef, 3 > Parts;
26
+ Profile.split (Parts, " _" );
27
+ if (Parts.size () != 3 )
54
28
return " " ;
55
- }
56
- unsigned Idx = 3 ;
57
- if (kind != Triple::EnvironmentType::Library) {
58
- if (profile[1 ] != ' s' || profile[2 ] != ' _' )
59
- return " " ;
60
- } else {
61
- if (profile[1 ] != ' i' || profile[2 ] != ' b' || profile[3 ] != ' _' )
62
- return " " ;
63
- Idx = 4 ;
64
- }
65
- Triple::OSType::ShaderModel;
66
- unsigned Major;
67
- switch (profile[Idx++]) {
68
- case ' 4' :
69
- Major = 4 ;
70
- break ;
71
- case ' 5' :
72
- Major = 5 ;
73
- break ;
74
- case ' 6' :
75
- Major = 6 ;
76
- break ;
77
- default :
29
+
30
+ Triple::EnvironmentType Kind =
31
+ StringSwitch<Triple::EnvironmentType>(Parts[0 ])
32
+ .Case (" ps" , Triple::EnvironmentType::Pixel)
33
+ .Case (" vs" , Triple::EnvironmentType::Vertex)
34
+ .Case (" gs" , Triple::EnvironmentType::Geometry)
35
+ .Case (" hs" , Triple::EnvironmentType::Hull)
36
+ .Case (" ds" , Triple::EnvironmentType::Domain)
37
+ .Case (" cs" , Triple::EnvironmentType::Compute)
38
+ .Case (" lib" , Triple::EnvironmentType::Library)
39
+ .Case (" ms" , Triple::EnvironmentType::Mesh)
40
+ .Case (" as" , Triple::EnvironmentType::Amplification)
41
+ .Default (Triple::EnvironmentType::UnknownEnvironment);
42
+ if (Kind == Triple::EnvironmentType::UnknownEnvironment)
78
43
return " " ;
79
- }
80
- if (profile[Idx++] != ' _' )
44
+
45
+ unsigned Major = StringSwitch<unsigned >(Parts[1 ])
46
+ .Case (" 4" , 4 )
47
+ .Case (" 5" , 5 )
48
+ .Case (" 6" , 6 )
49
+ .Default (0 );
50
+ if (Major == 0 )
81
51
return " " ;
82
52
83
- static const unsigned kOfflineMinor = 0xF ;
84
- unsigned Minor;
85
- switch (profile[Idx++]) {
86
- case ' 0' :
87
- Minor = 0 ;
88
- break ;
89
- case ' 1' :
90
- Minor = 1 ;
53
+ const unsigned OfflineMinor = 0xF ;
54
+ const unsigned InvalidMinor = -1 ;
55
+ unsigned Minor = StringSwitch<unsigned >(Parts[2 ])
56
+ .Case (" 0" , 0 )
57
+ .Case (" 1" , 1 )
58
+ .Case (" 2" , 2 )
59
+ .Case (" 3" , 3 )
60
+ .Case (" 4" , 4 )
61
+ .Case (" 5" , 5 )
62
+ .Case (" 6" , 6 )
63
+ .Case (" 7" , 7 )
64
+ .Case (" x" , OfflineMinor)
65
+ .Default (InvalidMinor);
66
+ if (Minor == InvalidMinor)
67
+ return " " ;
68
+
69
+ if (Major != 6 && Minor > 1 )
70
+ return " " ;
71
+
72
+ if (Minor == OfflineMinor && Kind != Triple::EnvironmentType::Library)
73
+ return " " ;
74
+
75
+ switch (Kind) {
76
+ default :
91
77
break ;
92
- case ' 2' :
93
- if (Major == 6 ) {
94
- Minor = 2 ;
95
- break ;
96
- } else
97
- return " " ;
98
- case ' 3' :
99
- if (Major == 6 ) {
100
- Minor = 3 ;
101
- break ;
102
- } else
103
- return " " ;
104
- case ' 4' :
105
- if (Major == 6 ) {
106
- Minor = 4 ;
107
- break ;
108
- } else
78
+ case Triple::EnvironmentType::Library: {
79
+ if (Major < 6 )
109
80
return " " ;
110
- case ' 5' :
111
- if (Major == 6 ) {
112
- Minor = 5 ;
113
- break ;
114
- } else
115
- " " ;
116
- case ' 6' :
117
- if (Major == 6 ) {
118
- Minor = 6 ;
119
- break ;
120
- } else
81
+ if (Major == 6 && Minor < 3 )
121
82
return " " ;
122
- case ' 7' :
123
- if (Major == 6 ) {
124
- Minor = 7 ;
125
- break ;
126
- } else
83
+ } break ;
84
+ case Triple::EnvironmentType::Amplification:
85
+ case Triple::EnvironmentType::Mesh: {
86
+ if (Major < 6 )
127
87
return " " ;
128
- case ' x' :
129
- if (kind == Triple::EnvironmentType::Library && Major == 6 ) {
130
- Minor = kOfflineMinor ;
131
- break ;
132
- } else
88
+ if (Major == 6 && Minor < 5 )
133
89
return " " ;
134
- default :
135
- return " " ;
90
+ } break ;
136
91
}
137
- if (profile.size () != Idx && profile[Idx++] != 0 )
138
- return " " ;
92
+
139
93
// dxil-unknown-shadermodel-hull
140
- llvm::Triple T ( Twine ( " dxil " ), Twine ( " unknown " ),
141
- Twine ( " shadermodel " )
142
- . concat ( Twine (Major))
143
- . concat ( " . " )
144
- . concat ( Twine (Minor)),
145
- Triple::getEnvironmentTypeName (kind)) ;
94
+ llvm::Triple T;
95
+ T. setArch (Triple::ArchType::dxil);
96
+ T. setOSName ( Triple::getOSTypeName (Triple::OSType::ShaderModel). str () +
97
+ VersionTuple (Major, Minor). getAsString ());
98
+ T. setEnvironment (Kind);
99
+ ;
146
100
return T.getTriple ();
147
101
}
148
102
@@ -157,14 +111,14 @@ std::string
157
111
DirectXToolChain::ComputeEffectiveClangTriple (const ArgList &Args,
158
112
types::ID InputType) const {
159
113
if (Arg *A = Args.getLastArg (options::OPT_target_profile)) {
160
- StringRef profile = A->getValue ();
161
- std::string triple = tryParseProfile (profile );
162
- if (triple == " " ) {
163
- getDriver ().Diag (diag::err_drv_invalid_directx_shader_module) << profile ;
164
- triple = ToolChain::ComputeEffectiveClangTriple (Args, InputType);
114
+ StringRef Profile = A->getValue ();
115
+ std::string Triple = tryParseProfile (Profile );
116
+ if (Triple == " " ) {
117
+ getDriver ().Diag (diag::err_drv_invalid_directx_shader_module) << Profile ;
118
+ Triple = ToolChain::ComputeEffectiveClangTriple (Args, InputType);
165
119
}
166
120
A->claim ();
167
- return triple ;
121
+ return Triple ;
168
122
} else {
169
123
return ToolChain::ComputeEffectiveClangTriple (Args, InputType);
170
124
}
0 commit comments