1- // ===--- DirectX .cpp - DirectX ToolChain Implementations ----------*- C++ -*-===//
1+ // ===--- HLSL .cpp - HLSL ToolChain Implementations ---- ----------*- C++ -*-===//
22//
33// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
44// See https://llvm.org/LICENSE.txt for license information.
55// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
66//
77// ===----------------------------------------------------------------------===//
88
9- #include " DirectX.h"
10- #include " llvm/ADT/Triple.h"
9+ #include " HLSL.h"
1110#include " CommonArgs.h"
1211#include " clang/Driver/DriverDiagnostic.h"
1312#include " llvm/ADT/StringSwitch.h"
13+ #include " llvm/ADT/Triple.h"
1414
1515using namespace clang ::driver;
1616using namespace clang ::driver::tools;
@@ -20,6 +20,88 @@ using namespace llvm::opt;
2020using namespace llvm ;
2121
2222namespace {
23+
24+ const unsigned OfflineLibMinor = 0xF ;
25+ const unsigned MaxShaderModel6Minor = 7 ;
26+ bool isLegalShaderModel (Triple &T) {
27+ if (T.getOS () != Triple::OSType::ShaderModel)
28+ return false ;
29+
30+ auto Kind = T.getEnvironment ();
31+
32+ switch (Kind) {
33+ default :
34+ return false ;
35+ case Triple::EnvironmentType::Vertex:
36+ case Triple::EnvironmentType::Hull:
37+ case Triple::EnvironmentType::Domain:
38+ case Triple::EnvironmentType::Geometry:
39+ 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+ }
76+ } 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+ }
97+ } break ;
98+ default :
99+ return false ;
100+ }
101+
102+ return true ;
103+ }
104+
23105std::string tryParseProfile (StringRef Profile) {
24106 // [ps|vs|gs|hs|ds|cs|ms|as]_[major]_[minor]
25107 SmallVector<StringRef, 3 > Parts;
@@ -50,7 +132,6 @@ std::string tryParseProfile(StringRef Profile) {
50132 if (Major == 0 )
51133 return " " ;
52134
53- const unsigned OfflineMinor = 0xF ;
54135 const unsigned InvalidMinor = -1 ;
55136 unsigned Minor = StringSwitch<unsigned >(Parts[2 ])
56137 .Case (" 0" , 0 )
@@ -61,55 +142,33 @@ std::string tryParseProfile(StringRef Profile) {
61142 .Case (" 5" , 5 )
62143 .Case (" 6" , 6 )
63144 .Case (" 7" , 7 )
64- .Case (" x" , OfflineMinor )
145+ .Case (" x" , OfflineLibMinor )
65146 .Default (InvalidMinor);
66147 if (Minor == InvalidMinor)
67148 return " " ;
68149
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 :
77- break ;
78- case Triple::EnvironmentType::Library: {
79- if (Major < 6 )
80- return " " ;
81- if (Major == 6 && Minor < 3 )
82- return " " ;
83- } break ;
84- case Triple::EnvironmentType::Amplification:
85- case Triple::EnvironmentType::Mesh: {
86- if (Major < 6 )
87- return " " ;
88- if (Major == 6 && Minor < 5 )
89- return " " ;
90- } break ;
91- }
92-
93150 // dxil-unknown-shadermodel-hull
94151 llvm::Triple T;
95152 T.setArch (Triple::ArchType::dxil);
96153 T.setOSName (Triple::getOSTypeName (Triple::OSType::ShaderModel).str () +
97154 VersionTuple (Major, Minor).getAsString ());
98155 T.setEnvironment (Kind);
99- ;
100- return T.getTriple ();
156+ if (isLegalShaderModel (T))
157+ return T.getTriple ();
158+ else
159+ return " " ;
101160}
102161
103162} // namespace
104163
105164// / DirectX Toolchain
106- DirectXToolChain::DirectXToolChain (const Driver &D, const llvm::Triple &Triple,
107- const ArgList &Args)
165+ HLSLToolChain::HLSLToolChain (const Driver &D, const llvm::Triple &Triple,
166+ const ArgList &Args)
108167 : ToolChain(D, Triple, Args) {}
109168
110169std::string
111- DirectXToolChain ::ComputeEffectiveClangTriple (const ArgList &Args,
112- types::ID InputType) const {
170+ HLSLToolChain ::ComputeEffectiveClangTriple (const ArgList &Args,
171+ types::ID InputType) const {
113172 if (Arg *A = Args.getLastArg (options::OPT_target_profile)) {
114173 StringRef Profile = A->getValue ();
115174 std::string Triple = tryParseProfile (Profile);
0 commit comments