Skip to content

Commit 9587118

Browse files
committed
Add DXIL triple
This patch adds triple support for: * dxil architecture * shadermodel OS (with version parsing) * shader stages as environment Reviewed By: MaskRay, pete Differential Revision: https://reviews.llvm.org/D122031
1 parent acdd41b commit 9587118

File tree

3 files changed

+140
-2
lines changed

3 files changed

+140
-2
lines changed

llvm/include/llvm/ADT/Triple.h

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ class Triple {
5656
bpfel, // eBPF or extended BPF or 64-bit BPF (little endian)
5757
bpfeb, // eBPF or extended BPF or 64-bit BPF (big endian)
5858
csky, // CSKY: csky
59+
dxil, // DXIL 32-bit DirectX bytecode
5960
hexagon, // Hexagon: hexagon
6061
loongarch32, // LoongArch (32-bit): loongarch32
6162
loongarch64, // LoongArch (64-bit): loongarch64
@@ -208,7 +209,8 @@ class Triple {
208209
Hurd, // GNU/Hurd
209210
WASI, // Experimental WebAssembly OS
210211
Emscripten,
211-
LastOSType = Emscripten
212+
ShaderModel, // DirectX ShaderModel
213+
LastOSType = ShaderModel
212214
};
213215
enum EnvironmentType {
214216
UnknownEnvironment,
@@ -235,7 +237,19 @@ class Triple {
235237
CoreCLR,
236238
Simulator, // Simulator variants of other systems, e.g., Apple's iOS
237239
MacABI, // Mac Catalyst variant of Apple's iOS deployment target.
238-
LastEnvironmentType = MacABI
240+
241+
// Shader Stages
242+
Pixel,
243+
Vertex,
244+
Geometry,
245+
Hull,
246+
Domain,
247+
Compute,
248+
Library,
249+
Mesh,
250+
Amplification,
251+
252+
LastEnvironmentType = Amplification
239253
};
240254
enum ObjectFormatType {
241255
UnknownObjectFormat,
@@ -679,6 +693,11 @@ class Triple {
679693
getEnvironment() == Triple::MuslX32;
680694
}
681695

696+
/// Tests whether the target is DXIL.
697+
bool isDXIL() const {
698+
return getArch() == Triple::dxil;
699+
}
700+
682701
/// Tests whether the target is SPIR (32- or 64-bit).
683702
bool isSPIR() const {
684703
return getArch() == Triple::spir || getArch() == Triple::spir64;

llvm/lib/Support/Triple.cpp

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ StringRef Triple::getArchTypeName(ArchType Kind) {
3737
case bpfeb: return "bpfeb";
3838
case bpfel: return "bpfel";
3939
case csky: return "csky";
40+
case dxil: return "dxil";
4041
case hexagon: return "hexagon";
4142
case hsail64: return "hsail64";
4243
case hsail: return "hsail";
@@ -169,6 +170,8 @@ StringRef Triple::getArchTypePrefix(ArchType Kind) {
169170

170171
case loongarch32:
171172
case loongarch64: return "loongarch";
173+
174+
case dxil: return "dx";
172175
}
173176
}
174177

@@ -235,6 +238,7 @@ StringRef Triple::getOSTypeName(OSType Kind) {
235238
case WatchOS: return "watchos";
236239
case Win32: return "windows";
237240
case ZOS: return "zos";
241+
case ShaderModel: return "shadermodel";
238242
}
239243

240244
llvm_unreachable("Invalid OSType");
@@ -264,6 +268,15 @@ StringRef Triple::getEnvironmentTypeName(EnvironmentType Kind) {
264268
case MuslEABIHF: return "musleabihf";
265269
case MuslX32: return "muslx32";
266270
case Simulator: return "simulator";
271+
case Pixel: return "pixel";
272+
case Vertex: return "vertex";
273+
case Geometry: return "geometry";
274+
case Hull: return "hull";
275+
case Domain: return "domain";
276+
case Compute: return "compute";
277+
case Library: return "library";
278+
case Mesh: return "mesh";
279+
case Amplification: return "amplification";
267280
}
268281

269282
llvm_unreachable("Invalid EnvironmentType!");
@@ -348,6 +361,7 @@ Triple::ArchType Triple::getArchTypeForLLVMName(StringRef Name) {
348361
.Case("csky", csky)
349362
.Case("loongarch32", loongarch32)
350363
.Case("loongarch64", loongarch64)
364+
.Case("dxil", dxil)
351365
.Default(UnknownArch);
352366
}
353367

@@ -485,6 +499,7 @@ static Triple::ArchType parseArch(StringRef ArchName) {
485499
.Case("csky", Triple::csky)
486500
.Case("loongarch32", Triple::loongarch32)
487501
.Case("loongarch64", Triple::loongarch64)
502+
.Case("dxil", Triple::dxil)
488503
.Default(Triple::UnknownArch);
489504

490505
// Some architectures require special parsing logic just to compute the
@@ -559,6 +574,7 @@ static Triple::OSType parseOS(StringRef OSName) {
559574
.StartsWith("hurd", Triple::Hurd)
560575
.StartsWith("wasi", Triple::WASI)
561576
.StartsWith("emscripten", Triple::Emscripten)
577+
.StartsWith("shadermodel", Triple::ShaderModel)
562578
.Default(Triple::UnknownOS);
563579
}
564580

@@ -585,6 +601,15 @@ static Triple::EnvironmentType parseEnvironment(StringRef EnvironmentName) {
585601
.StartsWith("coreclr", Triple::CoreCLR)
586602
.StartsWith("simulator", Triple::Simulator)
587603
.StartsWith("macabi", Triple::MacABI)
604+
.StartsWith("pixel", Triple::Pixel)
605+
.StartsWith("vertex", Triple::Vertex)
606+
.StartsWith("geometry", Triple::Geometry)
607+
.StartsWith("hull", Triple::Hull)
608+
.StartsWith("domain", Triple::Domain)
609+
.StartsWith("compute", Triple::Compute)
610+
.StartsWith("library", Triple::Library)
611+
.StartsWith("mesh", Triple::Mesh)
612+
.StartsWith("amplification", Triple::Amplification)
588613
.Default(Triple::UnknownEnvironment);
589614
}
590615

@@ -791,6 +816,9 @@ static Triple::ObjectFormatType getDefaultFormat(const Triple &T) {
791816
case Triple::spirv64:
792817
// TODO: In future this will be Triple::SPIRV.
793818
return Triple::UnknownObjectFormat;
819+
820+
case Triple::dxil:
821+
return Triple::UnknownObjectFormat;
794822
}
795823
llvm_unreachable("unknown architecture");
796824
}
@@ -1316,6 +1344,7 @@ static unsigned getArchPointerBitWidth(llvm::Triple::ArchType Arch) {
13161344
case llvm::Triple::arm:
13171345
case llvm::Triple::armeb:
13181346
case llvm::Triple::csky:
1347+
case llvm::Triple::dxil:
13191348
case llvm::Triple::hexagon:
13201349
case llvm::Triple::hsail:
13211350
case llvm::Triple::kalimba:
@@ -1405,6 +1434,7 @@ Triple Triple::get32BitArchVariant() const {
14051434
case Triple::arm:
14061435
case Triple::armeb:
14071436
case Triple::csky:
1437+
case Triple::dxil:
14081438
case Triple::hexagon:
14091439
case Triple::hsail:
14101440
case Triple::kalimba:
@@ -1468,6 +1498,7 @@ Triple Triple::get64BitArchVariant() const {
14681498
case Triple::arc:
14691499
case Triple::avr:
14701500
case Triple::csky:
1501+
case Triple::dxil:
14711502
case Triple::hexagon:
14721503
case Triple::kalimba:
14731504
case Triple::lanai:
@@ -1548,6 +1579,7 @@ Triple Triple::getBigEndianArchVariant() const {
15481579
case Triple::amdil64:
15491580
case Triple::amdil:
15501581
case Triple::avr:
1582+
case Triple::dxil:
15511583
case Triple::hexagon:
15521584
case Triple::hsail64:
15531585
case Triple::hsail:
@@ -1650,6 +1682,7 @@ bool Triple::isLittleEndian() const {
16501682
case Triple::avr:
16511683
case Triple::bpfel:
16521684
case Triple::csky:
1685+
case Triple::dxil:
16531686
case Triple::hexagon:
16541687
case Triple::hsail64:
16551688
case Triple::hsail:

llvm/unittests/ADT/TripleTest.cpp

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -620,6 +620,61 @@ TEST(TripleTest, ParsedIDs) {
620620
EXPECT_EQ(Triple::UnknownEnvironment, T.getEnvironment());
621621
EXPECT_TRUE(T.isArch32Bit());
622622

623+
T = Triple("dxil-unknown-shadermodel-pixel");
624+
EXPECT_EQ(Triple::dxil, T.getArch());
625+
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
626+
EXPECT_EQ(Triple::ShaderModel, T.getOS());
627+
EXPECT_EQ(Triple::Pixel, T.getEnvironment());
628+
629+
T = Triple("dxil-unknown-shadermodel-vertex");
630+
EXPECT_EQ(Triple::dxil, T.getArch());
631+
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
632+
EXPECT_EQ(Triple::ShaderModel, T.getOS());
633+
EXPECT_EQ(Triple::Vertex, T.getEnvironment());
634+
635+
T = Triple("dxil-unknown-shadermodel-geometry");
636+
EXPECT_EQ(Triple::dxil, T.getArch());
637+
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
638+
EXPECT_EQ(Triple::ShaderModel, T.getOS());
639+
EXPECT_EQ(Triple::Geometry, T.getEnvironment());
640+
641+
642+
T = Triple("dxil-unknown-shadermodel-hull");
643+
EXPECT_EQ(Triple::dxil, T.getArch());
644+
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
645+
EXPECT_EQ(Triple::ShaderModel, T.getOS());
646+
EXPECT_EQ(Triple::Hull, T.getEnvironment());
647+
648+
T = Triple("dxil-unknown-shadermodel-domain");
649+
EXPECT_EQ(Triple::dxil, T.getArch());
650+
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
651+
EXPECT_EQ(Triple::ShaderModel, T.getOS());
652+
EXPECT_EQ(Triple::Domain, T.getEnvironment());
653+
654+
T = Triple("dxil-unknown-shadermodel-compute");
655+
EXPECT_EQ(Triple::dxil, T.getArch());
656+
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
657+
EXPECT_EQ(Triple::ShaderModel, T.getOS());
658+
EXPECT_EQ(Triple::Compute, T.getEnvironment());
659+
660+
T = Triple("dxil-unknown-shadermodel-library");
661+
EXPECT_EQ(Triple::dxil, T.getArch());
662+
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
663+
EXPECT_EQ(Triple::ShaderModel, T.getOS());
664+
EXPECT_EQ(Triple::Library, T.getEnvironment());
665+
666+
T = Triple("dxil-unknown-shadermodel-mesh");
667+
EXPECT_EQ(Triple::dxil, T.getArch());
668+
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
669+
EXPECT_EQ(Triple::ShaderModel, T.getOS());
670+
EXPECT_EQ(Triple::Mesh, T.getEnvironment());
671+
672+
T = Triple("dxil-unknown-shadermodel-amplification");
673+
EXPECT_EQ(Triple::dxil, T.getArch());
674+
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
675+
EXPECT_EQ(Triple::ShaderModel, T.getOS());
676+
EXPECT_EQ(Triple::Amplification, T.getEnvironment());
677+
623678
T = Triple("huh");
624679
EXPECT_EQ(Triple::UnknownArch, T.getArch());
625680
}
@@ -973,6 +1028,12 @@ TEST(TripleTest, BitWidthPredicates) {
9731028
EXPECT_FALSE(T.isArch32Bit());
9741029
EXPECT_TRUE(T.isArch64Bit());
9751030
EXPECT_TRUE(T.isLoongArch());
1031+
1032+
T.setArch(Triple::dxil);
1033+
EXPECT_FALSE(T.isArch16Bit());
1034+
EXPECT_TRUE(T.isArch32Bit());
1035+
EXPECT_FALSE(T.isArch64Bit());
1036+
EXPECT_TRUE(T.isDXIL());
9761037
}
9771038

9781039
TEST(TripleTest, BitWidthArchVariants) {
@@ -1163,6 +1224,10 @@ TEST(TripleTest, BitWidthArchVariants) {
11631224
T.setArch(Triple::xcore);
11641225
EXPECT_EQ(Triple::xcore, T.get32BitArchVariant().getArch());
11651226
EXPECT_EQ(Triple::UnknownArch, T.get64BitArchVariant().getArch());
1227+
1228+
T.setArch(Triple::dxil);
1229+
EXPECT_EQ(Triple::dxil, T.get32BitArchVariant().getArch());
1230+
EXPECT_EQ(Triple::UnknownArch, T.get64BitArchVariant().getArch());
11661231
}
11671232

11681233
TEST(TripleTest, EndianArchVariants) {
@@ -1311,6 +1376,11 @@ TEST(TripleTest, EndianArchVariants) {
13111376
EXPECT_TRUE(T.isLittleEndian());
13121377
EXPECT_EQ(Triple::UnknownArch, T.getBigEndianArchVariant().getArch());
13131378
EXPECT_EQ(Triple::loongarch64, T.getLittleEndianArchVariant().getArch());
1379+
1380+
T.setArch(Triple::dxil);
1381+
EXPECT_TRUE(T.isLittleEndian());
1382+
EXPECT_EQ(Triple::UnknownArch, T.getBigEndianArchVariant().getArch());
1383+
EXPECT_EQ(Triple::dxil, T.getLittleEndianArchVariant().getArch());
13141384
}
13151385

13161386
TEST(TripleTest, getOSVersion) {
@@ -1451,6 +1521,22 @@ TEST(TripleTest, getOSVersion) {
14511521
T = Triple("x86_64-apple-driverkit");
14521522
Version = T.getDriverKitVersion();
14531523
EXPECT_EQ(VersionTuple(19, 0), Version);
1524+
1525+
T = Triple("dxil-unknown-shadermodel6.6-pixel");
1526+
EXPECT_EQ(Triple::dxil, T.getArch());
1527+
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
1528+
EXPECT_EQ(Triple::ShaderModel, T.getOS());
1529+
Version = T.getOSVersion();
1530+
EXPECT_EQ(VersionTuple(6, 6), Version);
1531+
EXPECT_EQ(Triple::Pixel, T.getEnvironment());
1532+
1533+
T = Triple("dxil-unknown-shadermodel6.0-pixel");
1534+
EXPECT_EQ(Triple::dxil, T.getArch());
1535+
EXPECT_EQ(Triple::UnknownVendor, T.getVendor());
1536+
EXPECT_EQ(Triple::ShaderModel, T.getOS());
1537+
Version = T.getOSVersion();
1538+
EXPECT_EQ(VersionTuple(6, 0), Version);
1539+
EXPECT_EQ(Triple::Pixel, T.getEnvironment());
14541540
}
14551541

14561542
TEST(TripleTest, getEnvironmentVersion) {

0 commit comments

Comments
 (0)