Skip to content

Commit 6d89014

Browse files
authored
[DXIL] Set DXIL Version in DXIL target triple based on shader model version (#91407)
This change set restores commit 080978d that was reverted to address ASAN failures and includes a fix for the ASAN failures. Following is the description of the change: An earlier commit provided a way to decouple DXIL version from Shader Model version by representing the DXIL version as `SubArch` in the DXIL Target Triple and adding corresponding valid DXIL Arch types. This change constructs DXIL target triple with DXIL version that is deduced from Shader Model version specified in the following scenarios: 1. When compilation target profile is specified: For e.g., DXIL target triple `dxilv1.8-unknown-shader6.8-library` is constructed when `-T lib_6_8` is specified. 2. When DXIL target triple without DXIL version is specified: For e.g., DXIL target triple `dxilv1.8-pc-shadermodel6.8-library` is constructed when `-mtriple=dxil-pc-shadermodel6.8-library` is specified. Updated relevant HLSL tests that check for target triple.
1 parent 5636eb8 commit 6d89014

File tree

10 files changed

+166
-21
lines changed

10 files changed

+166
-21
lines changed

clang/lib/Basic/Targets.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -760,7 +760,7 @@ using namespace clang::targets;
760760
TargetInfo *
761761
TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
762762
const std::shared_ptr<TargetOptions> &Opts) {
763-
llvm::Triple Triple(Opts->Triple);
763+
llvm::Triple Triple(llvm::Triple::normalize(Opts->Triple));
764764

765765
// Construct the target
766766
std::unique_ptr<TargetInfo> Target = AllocateTarget(Triple, *Opts);

clang/lib/Driver/ToolChains/HLSL.cpp

Lines changed: 42 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,9 +98,49 @@ std::optional<std::string> tryParseProfile(StringRef Profile) {
9898
else if (llvm::getAsUnsignedInteger(Parts[2], 0, Minor))
9999
return std::nullopt;
100100

101-
// dxil-unknown-shadermodel-hull
101+
// Determine DXIL version using the minor version number of Shader
102+
// Model version specified in target profile. Prior to decoupling DXIL version
103+
// numbering from that of Shader Model DXIL version 1.Y corresponds to SM 6.Y.
104+
// E.g., dxilv1.Y-unknown-shadermodelX.Y-hull
102105
llvm::Triple T;
103-
T.setArch(Triple::ArchType::dxil);
106+
Triple::SubArchType SubArch = llvm::Triple::NoSubArch;
107+
switch (Minor) {
108+
case 0:
109+
SubArch = llvm::Triple::DXILSubArch_v1_0;
110+
break;
111+
case 1:
112+
SubArch = llvm::Triple::DXILSubArch_v1_1;
113+
break;
114+
case 2:
115+
SubArch = llvm::Triple::DXILSubArch_v1_2;
116+
break;
117+
case 3:
118+
SubArch = llvm::Triple::DXILSubArch_v1_3;
119+
break;
120+
case 4:
121+
SubArch = llvm::Triple::DXILSubArch_v1_4;
122+
break;
123+
case 5:
124+
SubArch = llvm::Triple::DXILSubArch_v1_5;
125+
break;
126+
case 6:
127+
SubArch = llvm::Triple::DXILSubArch_v1_6;
128+
break;
129+
case 7:
130+
SubArch = llvm::Triple::DXILSubArch_v1_7;
131+
break;
132+
case 8:
133+
SubArch = llvm::Triple::DXILSubArch_v1_8;
134+
break;
135+
case OfflineLibMinor:
136+
// Always consider minor version x as the latest supported DXIL version
137+
SubArch = llvm::Triple::LatestDXILSubArch;
138+
break;
139+
default:
140+
// No DXIL Version corresponding to specified Shader Model version found
141+
return std::nullopt;
142+
}
143+
T.setArch(Triple::ArchType::dxil, SubArch);
104144
T.setOSName(Triple::getOSTypeName(Triple::OSType::ShaderModel).str() +
105145
VersionTuple(Major, Minor).getAsString());
106146
T.setEnvironment(Kind);

clang/test/CodeGenHLSL/basic-target.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,4 @@
77
// RUN: %clang -target dxil-pc-shadermodel6.0-geometry -S -emit-llvm -o - %s | FileCheck %s
88

99
// CHECK: target datalayout = "e-m:e-p:32:32-i1:32-i8:8-i16:16-i32:32-i64:64-f16:16-f32:32-f64:64-n8:16:32:64"
10-
// CHECK: target triple = "dxil-pc-shadermodel6.0-{{[a-z]+}}"
10+
// CHECK: target triple = "dxilv1.0-pc-shadermodel6.0-{{[a-z]+}}"

clang/test/Driver/dxc_dxv_path.hlsl

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,12 @@
77
// DXV_PATH:dxv{{(.exe)?}}" "-" "-o" "-"
88

99
// RUN: %clang_dxc -I test -Vd -Tlib_6_3 -### %s 2>&1 | FileCheck %s --check-prefix=VD
10-
// VD:"-cc1"{{.*}}"-triple" "dxil-unknown-shadermodel6.3-library"
10+
// VD:"-cc1"{{.*}}"-triple" "dxilv1.3-unknown-shadermodel6.3-library"
1111
// VD-NOT:dxv not found
1212

1313
// RUN: %clang_dxc -Tlib_6_3 -ccc-print-bindings --dxv-path=%T -Fo %t.dxo %s 2>&1 | FileCheck %s --check-prefix=BINDINGS
14-
// BINDINGS: "dxil-unknown-shadermodel6.3-library" - "clang", inputs: ["[[INPUT:.+]]"], output: "[[DXC:.+]].dxo"
15-
// BINDINGS-NEXT: "dxil-unknown-shadermodel6.3-library" - "hlsl::Validator", inputs: ["[[DXC]].dxo"]
14+
// BINDINGS: "dxilv1.3-unknown-shadermodel6.3-library" - "clang", inputs: ["[[INPUT:.+]]"], output: "[[DXC:.+]].dxo"
15+
// BINDINGS-NEXT: "dxilv1.3-unknown-shadermodel6.3-library" - "hlsl::Validator", inputs: ["[[DXC]].dxo"]
1616

1717
// RUN: %clang_dxc -Tlib_6_3 -ccc-print-phases --dxv-path=%T -Fo %t.dxc %s 2>&1 | FileCheck %s --check-prefix=PHASES
1818

clang/test/Options/enable_16bit_types_validation.hlsl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,11 @@
99
// HV_invalid_2017: error: '-enable-16bit-types' option requires target HLSL Version >= 2018 and shader model >= 6.2, but HLSL Version is 'hlsl2017' and shader model is '6.4'
1010
// TP_invalid: error: '-enable-16bit-types' option requires target HLSL Version >= 2018 and shader model >= 6.2, but HLSL Version is 'hlsl2021' and shader model is '6.0'
1111

12-
// valid_2021: "dxil-unknown-shadermodel6.4-library"
12+
// valid_2021: "dxilv1.4-unknown-shadermodel6.4-library"
1313
// valid_2021-SAME: "-std=hlsl2021"
1414
// valid_2021-SAME: "-fnative-half-type"
1515

16-
// valid_2018: "dxil-unknown-shadermodel6.4-library"
16+
// valid_2018: "dxilv1.4-unknown-shadermodel6.4-library"
1717
// valid_2018-SAME: "-std=hlsl2018"
1818
// valid_2018-SAME: "-fnative-half-type"
1919

clang/unittests/Driver/DXCModeTest.cpp

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -68,25 +68,27 @@ TEST(DxcModeTest, TargetProfileValidation) {
6868
IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts = new DiagnosticOptions();
6969
DiagnosticsEngine Diags(DiagID, &*DiagOpts, DiagConsumer);
7070

71-
validateTargetProfile("-Tvs_6_0", "dxil--shadermodel6.0-vertex",
71+
validateTargetProfile("-Tvs_6_0", "dxilv1.0--shadermodel6.0-vertex",
7272
InMemoryFileSystem, Diags);
73-
validateTargetProfile("-Ths_6_1", "dxil--shadermodel6.1-hull",
73+
validateTargetProfile("-Ths_6_1", "dxilv1.1--shadermodel6.1-hull",
7474
InMemoryFileSystem, Diags);
75-
validateTargetProfile("-Tds_6_2", "dxil--shadermodel6.2-domain",
75+
validateTargetProfile("-Tds_6_2", "dxilv1.2--shadermodel6.2-domain",
7676
InMemoryFileSystem, Diags);
77-
validateTargetProfile("-Tds_6_2", "dxil--shadermodel6.2-domain",
77+
validateTargetProfile("-Tds_6_2", "dxilv1.2--shadermodel6.2-domain",
7878
InMemoryFileSystem, Diags);
79-
validateTargetProfile("-Tgs_6_3", "dxil--shadermodel6.3-geometry",
79+
validateTargetProfile("-Tgs_6_3", "dxilv1.3--shadermodel6.3-geometry",
8080
InMemoryFileSystem, Diags);
81-
validateTargetProfile("-Tps_6_4", "dxil--shadermodel6.4-pixel",
81+
validateTargetProfile("-Tps_6_4", "dxilv1.4--shadermodel6.4-pixel",
8282
InMemoryFileSystem, Diags);
83-
validateTargetProfile("-Tcs_6_5", "dxil--shadermodel6.5-compute",
83+
validateTargetProfile("-Tcs_6_5", "dxilv1.5--shadermodel6.5-compute",
8484
InMemoryFileSystem, Diags);
85-
validateTargetProfile("-Tms_6_6", "dxil--shadermodel6.6-mesh",
85+
validateTargetProfile("-Tms_6_6", "dxilv1.6--shadermodel6.6-mesh",
8686
InMemoryFileSystem, Diags);
87-
validateTargetProfile("-Tas_6_7", "dxil--shadermodel6.7-amplification",
87+
validateTargetProfile("-Tas_6_7", "dxilv1.7--shadermodel6.7-amplification",
8888
InMemoryFileSystem, Diags);
89-
validateTargetProfile("-Tlib_6_x", "dxil--shadermodel6.15-library",
89+
validateTargetProfile("-Tcs_6_8", "dxilv1.8--shadermodel6.8-compute",
90+
InMemoryFileSystem, Diags);
91+
validateTargetProfile("-Tlib_6_x", "dxilv1.8--shadermodel6.15-library",
9092
InMemoryFileSystem, Diags);
9193

9294
// Invalid tests.

llvm/include/llvm/TargetParser/Triple.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,7 @@ class Triple {
176176
DXILSubArch_v1_6,
177177
DXILSubArch_v1_7,
178178
DXILSubArch_v1_8,
179+
LatestDXILSubArch = DXILSubArch_v1_8,
179180
};
180181
enum VendorType {
181182
UnknownVendor,

llvm/lib/IR/Verifier.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -152,8 +152,8 @@ struct VerifierSupport {
152152
bool TreatBrokenDebugInfoAsError = true;
153153

154154
explicit VerifierSupport(raw_ostream *OS, const Module &M)
155-
: OS(OS), M(M), MST(&M), TT(M.getTargetTriple()), DL(M.getDataLayout()),
156-
Context(M.getContext()) {}
155+
: OS(OS), M(M), MST(&M), TT(Triple::normalize(M.getTargetTriple())),
156+
DL(M.getDataLayout()), Context(M.getContext()) {}
157157

158158
private:
159159
void Write(const Module *M) {

llvm/lib/TargetParser/Triple.cpp

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,31 @@ StringRef Triple::getArchName(ArchType Kind, SubArchType SubArch) {
115115
if (SubArch == AArch64SubArch_arm64e)
116116
return "arm64e";
117117
break;
118+
case Triple::dxil:
119+
switch (SubArch) {
120+
case Triple::NoSubArch:
121+
case Triple::DXILSubArch_v1_0:
122+
return "dxilv1.0";
123+
case Triple::DXILSubArch_v1_1:
124+
return "dxilv1.1";
125+
case Triple::DXILSubArch_v1_2:
126+
return "dxilv1.2";
127+
case Triple::DXILSubArch_v1_3:
128+
return "dxilv1.3";
129+
case Triple::DXILSubArch_v1_4:
130+
return "dxilv1.4";
131+
case Triple::DXILSubArch_v1_5:
132+
return "dxilv1.5";
133+
case Triple::DXILSubArch_v1_6:
134+
return "dxilv1.6";
135+
case Triple::DXILSubArch_v1_7:
136+
return "dxilv1.7";
137+
case Triple::DXILSubArch_v1_8:
138+
return "dxilv1.8";
139+
default:
140+
break;
141+
}
142+
break;
118143
default:
119144
break;
120145
}
@@ -1014,6 +1039,53 @@ Triple::Triple(const Twine &ArchStr, const Twine &VendorStr, const Twine &OSStr,
10141039
ObjectFormat = getDefaultFormat(*this);
10151040
}
10161041

1042+
static VersionTuple parseVersionFromName(StringRef Name);
1043+
1044+
static StringRef getDXILArchNameFromShaderModel(StringRef ShaderModelStr) {
1045+
VersionTuple Ver =
1046+
parseVersionFromName(ShaderModelStr.drop_front(strlen("shadermodel")));
1047+
// Default DXIL minor version when Shader Model version is anything other
1048+
// than 6.[0...8] or 6.x (which translates to latest current SM version)
1049+
const unsigned SMMajor = 6;
1050+
if (!Ver.empty()) {
1051+
if (Ver.getMajor() == SMMajor) {
1052+
if (std::optional<unsigned> SMMinor = Ver.getMinor()) {
1053+
switch (*SMMinor) {
1054+
case 0:
1055+
return Triple::getArchName(Triple::dxil, Triple::DXILSubArch_v1_0);
1056+
case 1:
1057+
return Triple::getArchName(Triple::dxil, Triple::DXILSubArch_v1_1);
1058+
case 2:
1059+
return Triple::getArchName(Triple::dxil, Triple::DXILSubArch_v1_2);
1060+
case 3:
1061+
return Triple::getArchName(Triple::dxil, Triple::DXILSubArch_v1_3);
1062+
case 4:
1063+
return Triple::getArchName(Triple::dxil, Triple::DXILSubArch_v1_4);
1064+
case 5:
1065+
return Triple::getArchName(Triple::dxil, Triple::DXILSubArch_v1_5);
1066+
case 6:
1067+
return Triple::getArchName(Triple::dxil, Triple::DXILSubArch_v1_6);
1068+
case 7:
1069+
return Triple::getArchName(Triple::dxil, Triple::DXILSubArch_v1_7);
1070+
case 8:
1071+
return Triple::getArchName(Triple::dxil, Triple::DXILSubArch_v1_8);
1072+
default:
1073+
report_fatal_error("Unsupported Shader Model version", false);
1074+
}
1075+
}
1076+
}
1077+
} else {
1078+
// Special case: DXIL minor version is set to LatestCurrentDXILMinor for
1079+
// shadermodel6.x is
1080+
if (ShaderModelStr == "shadermodel6.x") {
1081+
return Triple::getArchName(Triple::dxil, Triple::LatestDXILSubArch);
1082+
}
1083+
}
1084+
// DXIL version corresponding to Shader Model version other than 6.Minor
1085+
// is 1.0
1086+
return Triple::getArchName(Triple::dxil, Triple::DXILSubArch_v1_0);
1087+
}
1088+
10171089
std::string Triple::normalize(StringRef Str) {
10181090
bool IsMinGW32 = false;
10191091
bool IsCygwin = false;
@@ -1206,6 +1278,20 @@ std::string Triple::normalize(StringRef Str) {
12061278
}
12071279
}
12081280

1281+
// Normalize DXIL triple if it does not include DXIL version number.
1282+
// Determine DXIL version number using the minor version number of Shader
1283+
// Model version specified in target triple, if any. Prior to decoupling DXIL
1284+
// version numbering from that of Shader Model DXIL version 1.Y corresponds to
1285+
// SM 6.Y. E.g., dxilv1.Y-unknown-shadermodelX.Y-hull
1286+
if (Components[0] == "dxil") {
1287+
if (Components.size() > 4) {
1288+
Components.resize(4);
1289+
}
1290+
// Add DXIL version only if shadermodel is specified in the triple
1291+
if (OS == Triple::ShaderModel) {
1292+
Components[0] = getDXILArchNameFromShaderModel(Components[2]);
1293+
}
1294+
}
12091295
// Stick the corrected components back together to form the normalized string.
12101296
return join(Components, "-");
12111297
}

llvm/unittests/TargetParser/TripleTest.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2533,4 +2533,20 @@ TEST(TripleTest, isArmMClass) {
25332533
EXPECT_TRUE(T.isArmMClass());
25342534
}
25352535
}
2536+
2537+
TEST(TripleTest, DXILNormaizeWithVersion) {
2538+
EXPECT_EQ("dxilv1.0-unknown-shadermodel6.0",
2539+
Triple::normalize("dxilv1.0--shadermodel6.0"));
2540+
EXPECT_EQ("dxilv1.0-unknown-shadermodel6.0",
2541+
Triple::normalize("dxil--shadermodel6.0"));
2542+
EXPECT_EQ("dxilv1.1-unknown-shadermodel6.1-library",
2543+
Triple::normalize("dxil-shadermodel6.1-unknown-library"));
2544+
EXPECT_EQ("dxilv1.8-unknown-shadermodel6.x-unknown",
2545+
Triple::normalize("dxil-unknown-shadermodel6.x-unknown"));
2546+
EXPECT_EQ("dxilv1.8-unknown-shadermodel6.x-unknown",
2547+
Triple::normalize("dxil-unknown-shadermodel6.x-unknown"));
2548+
EXPECT_EQ("dxil-unknown-unknown-unknown", Triple::normalize("dxil---"));
2549+
EXPECT_EQ("dxilv1.0-pc-shadermodel5.0-compute",
2550+
Triple::normalize("dxil-shadermodel5.0-pc-compute"));
2551+
}
25362552
} // end anonymous namespace

0 commit comments

Comments
 (0)