Skip to content

Commit 53b6a16

Browse files
committed
[SPIR-V] Add SPIR-V logical triple.
Clang implements SPIR-V with both Physical32 and Physical64 addressing models. This commit adds a new triple value for the Logical addressing model. Differential Revision: https://reviews.llvm.org/D155978
1 parent 3bff611 commit 53b6a16

File tree

7 files changed

+203
-22
lines changed

7 files changed

+203
-22
lines changed

clang/lib/Basic/Targets.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -665,6 +665,9 @@ std::unique_ptr<TargetInfo> AllocateTarget(const llvm::Triple &Triple,
665665
return nullptr;
666666
return std::make_unique<SPIR64TargetInfo>(Triple, Opts);
667667
}
668+
case llvm::Triple::spirv: {
669+
return std::make_unique<SPIRVTargetInfo>(Triple, Opts);
670+
}
668671
case llvm::Triple::spirv32: {
669672
if (os != llvm::Triple::UnknownOS ||
670673
Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)

clang/lib/Basic/Targets/SPIR.cpp

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,19 +33,24 @@ void SPIR64TargetInfo::getTargetDefines(const LangOptions &Opts,
3333
DefineStd(Builder, "SPIR64", Opts);
3434
}
3535

36+
void BaseSPIRVTargetInfo::getTargetDefines(const LangOptions &Opts,
37+
MacroBuilder &Builder) const {
38+
DefineStd(Builder, "SPIRV", Opts);
39+
}
40+
3641
void SPIRVTargetInfo::getTargetDefines(const LangOptions &Opts,
3742
MacroBuilder &Builder) const {
38-
DefineStd(Builder, "SPIRV", Opts);
43+
BaseSPIRVTargetInfo::getTargetDefines(Opts, Builder);
3944
}
4045

4146
void SPIRV32TargetInfo::getTargetDefines(const LangOptions &Opts,
4247
MacroBuilder &Builder) const {
43-
SPIRVTargetInfo::getTargetDefines(Opts, Builder);
48+
BaseSPIRVTargetInfo::getTargetDefines(Opts, Builder);
4449
DefineStd(Builder, "SPIRV32", Opts);
4550
}
4651

4752
void SPIRV64TargetInfo::getTargetDefines(const LangOptions &Opts,
4853
MacroBuilder &Builder) const {
49-
SPIRVTargetInfo::getTargetDefines(Opts, Builder);
54+
BaseSPIRVTargetInfo::getTargetDefines(Opts, Builder);
5055
DefineStd(Builder, "SPIRV64", Opts);
5156
}

clang/lib/Basic/Targets/SPIR.h

Lines changed: 38 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -93,10 +93,6 @@ class LLVM_LIBRARY_VISIBILITY BaseSPIRTargetInfo : public TargetInfo {
9393
: TargetInfo(Triple) {
9494
assert((Triple.isSPIR() || Triple.isSPIRV()) &&
9595
"Invalid architecture for SPIR or SPIR-V.");
96-
assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
97-
"SPIR(-V) target must use unknown OS");
98-
assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
99-
"SPIR(-V) target must use unknown environment type");
10096
TLSSupported = false;
10197
VLASupported = false;
10298
LongWidth = LongAlign = 64;
@@ -284,31 +280,53 @@ class LLVM_LIBRARY_VISIBILITY SPIR64TargetInfo : public SPIRTargetInfo {
284280
MacroBuilder &Builder) const override;
285281
};
286282

287-
class LLVM_LIBRARY_VISIBILITY SPIRVTargetInfo : public BaseSPIRTargetInfo {
283+
class LLVM_LIBRARY_VISIBILITY BaseSPIRVTargetInfo : public BaseSPIRTargetInfo {
288284
public:
289-
SPIRVTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
285+
BaseSPIRVTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
290286
: BaseSPIRTargetInfo(Triple, Opts) {
291287
assert(Triple.isSPIRV() && "Invalid architecture for SPIR-V.");
292-
assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
293-
"SPIR-V target must use unknown OS");
294-
assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
295-
"SPIR-V target must use unknown environment type");
288+
}
289+
290+
bool hasFeature(StringRef Feature) const override {
291+
return Feature == "spirv";
296292
}
297293

298294
void getTargetDefines(const LangOptions &Opts,
299295
MacroBuilder &Builder) const override;
296+
};
300297

301-
bool hasFeature(StringRef Feature) const override {
302-
return Feature == "spirv";
298+
class LLVM_LIBRARY_VISIBILITY SPIRVTargetInfo : public BaseSPIRVTargetInfo {
299+
public:
300+
SPIRVTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
301+
: BaseSPIRVTargetInfo(Triple, Opts) {
302+
assert(Triple.getArch() == llvm::Triple::spirv &&
303+
"Invalid architecture for Logical SPIR-V.");
304+
assert(Triple.getOS() == llvm::Triple::ShaderModel &&
305+
"Logical SPIR-V requires a valid ShaderModel.");
306+
assert(Triple.getEnvironment() >= llvm::Triple::Pixel &&
307+
Triple.getEnvironment() <= llvm::Triple::Amplification &&
308+
"Logical SPIR-V environment must be a valid shader stage.");
309+
310+
// SPIR-V IDs are represented with a single 32-bit word.
311+
SizeType = TargetInfo::UnsignedInt;
312+
resetDataLayout("e-i64:64-v16:16-v24:32-v32:32-v48:64-"
313+
"v96:128-v192:256-v256:256-v512:512-v1024:1024");
303314
}
315+
316+
void getTargetDefines(const LangOptions &Opts,
317+
MacroBuilder &Builder) const override;
304318
};
305319

306-
class LLVM_LIBRARY_VISIBILITY SPIRV32TargetInfo : public SPIRVTargetInfo {
320+
class LLVM_LIBRARY_VISIBILITY SPIRV32TargetInfo : public BaseSPIRVTargetInfo {
307321
public:
308322
SPIRV32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
309-
: SPIRVTargetInfo(Triple, Opts) {
323+
: BaseSPIRVTargetInfo(Triple, Opts) {
310324
assert(Triple.getArch() == llvm::Triple::spirv32 &&
311325
"Invalid architecture for 32-bit SPIR-V.");
326+
assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
327+
"32-bit SPIR-V target must use unknown OS");
328+
assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
329+
"32-bit SPIR-V target must use unknown environment type");
312330
PointerWidth = PointerAlign = 32;
313331
SizeType = TargetInfo::UnsignedInt;
314332
PtrDiffType = IntPtrType = TargetInfo::SignedInt;
@@ -320,12 +338,16 @@ class LLVM_LIBRARY_VISIBILITY SPIRV32TargetInfo : public SPIRVTargetInfo {
320338
MacroBuilder &Builder) const override;
321339
};
322340

323-
class LLVM_LIBRARY_VISIBILITY SPIRV64TargetInfo : public SPIRVTargetInfo {
341+
class LLVM_LIBRARY_VISIBILITY SPIRV64TargetInfo : public BaseSPIRVTargetInfo {
324342
public:
325343
SPIRV64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
326-
: SPIRVTargetInfo(Triple, Opts) {
344+
: BaseSPIRVTargetInfo(Triple, Opts) {
327345
assert(Triple.getArch() == llvm::Triple::spirv64 &&
328346
"Invalid architecture for 64-bit SPIR-V.");
347+
assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
348+
"64-bit SPIR-V target must use unknown OS");
349+
assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
350+
"64-bit SPIR-V target must use unknown environment type");
329351
PointerWidth = PointerAlign = 64;
330352
SizeType = TargetInfo::UnsignedLong;
331353
PtrDiffType = IntPtrType = TargetInfo::SignedLong;

clang/lib/Frontend/CompilerInvocation.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4143,7 +4143,8 @@ bool CompilerInvocation::ParseLangArgs(LangOptions &Opts, ArgList &Args,
41434143

41444144
// Validate options for HLSL
41454145
if (Opts.HLSL) {
4146-
bool SupportedTarget = T.getArch() == llvm::Triple::dxil &&
4146+
bool SupportedTarget = (T.getArch() == llvm::Triple::dxil ||
4147+
T.getArch() == llvm::Triple::spirv) &&
41474148
T.getOS() == llvm::Triple::ShaderModel;
41484149
if (!SupportedTarget)
41494150
Diags.Report(diag::err_drv_hlsl_unsupported_target) << T.str();

llvm/include/llvm/TargetParser/Triple.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ class Triple {
9696
hsail64, // AMD HSAIL with 64-bit pointers
9797
spir, // SPIR: standard portable IR for OpenCL 32-bit version
9898
spir64, // SPIR: standard portable IR for OpenCL 64-bit version
99+
spirv, // SPIR-V with logical memory layout.
99100
spirv32, // SPIR-V with 32-bit pointers
100101
spirv64, // SPIR-V with 64-bit pointers
101102
kalimba, // Kalimba: generic kalimba
@@ -760,9 +761,10 @@ class Triple {
760761
return getArch() == Triple::spir || getArch() == Triple::spir64;
761762
}
762763

763-
/// Tests whether the target is SPIR-V (32/64-bit).
764+
/// Tests whether the target is SPIR-V (32/64-bit/Logical).
764765
bool isSPIRV() const {
765-
return getArch() == Triple::spirv32 || getArch() == Triple::spirv64;
766+
return getArch() == Triple::spirv32 || getArch() == Triple::spirv64 ||
767+
getArch() == Triple::spirv;
766768
}
767769

768770
/// Tests whether the target is NVPTX (32- or 64-bit).

llvm/lib/TargetParser/Triple.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ StringRef Triple::getArchTypeName(ArchType Kind) {
7070
case sparcv9: return "sparcv9";
7171
case spir64: return "spir64";
7272
case spir: return "spir";
73+
case spirv: return "spirv";
7374
case spirv32: return "spirv32";
7475
case spirv64: return "spirv64";
7576
case systemz: return "s390x";
@@ -154,6 +155,7 @@ StringRef Triple::getArchTypePrefix(ArchType Kind) {
154155
case spir:
155156
case spir64: return "spir";
156157

158+
case spirv:
157159
case spirv32:
158160
case spirv64: return "spirv";
159161

@@ -376,6 +378,7 @@ Triple::ArchType Triple::getArchTypeForLLVMName(StringRef Name) {
376378
.Case("hsail64", hsail64)
377379
.Case("spir", spir)
378380
.Case("spir64", spir64)
381+
.Case("spirv", spirv)
379382
.Case("spirv32", spirv32)
380383
.Case("spirv64", spirv64)
381384
.Case("kalimba", kalimba)
@@ -516,6 +519,8 @@ static Triple::ArchType parseArch(StringRef ArchName) {
516519
.Case("hsail64", Triple::hsail64)
517520
.Case("spir", Triple::spir)
518521
.Case("spir64", Triple::spir64)
522+
.Cases("spirv", "spirv1.0", "spirv1.1", "spirv1.2",
523+
"spirv1.3", "spirv1.4", "spirv1.5", Triple::spirv)
519524
.Cases("spirv32", "spirv32v1.0", "spirv32v1.1", "spirv32v1.2",
520525
"spirv32v1.3", "spirv32v1.4", "spirv32v1.5", Triple::spirv32)
521526
.Cases("spirv64", "spirv64v1.0", "spirv64v1.1", "spirv64v1.2",
@@ -859,6 +864,7 @@ static Triple::ObjectFormatType getDefaultFormat(const Triple &T) {
859864
case Triple::wasm64:
860865
return Triple::Wasm;
861866

867+
case Triple::spirv:
862868
case Triple::spirv32:
863869
case Triple::spirv64:
864870
return Triple::SPIRV;
@@ -1442,6 +1448,7 @@ static unsigned getArchPointerBitWidth(llvm::Triple::ArchType Arch) {
14421448
case llvm::Triple::renderscript64:
14431449
case llvm::Triple::riscv64:
14441450
case llvm::Triple::sparcv9:
1451+
case llvm::Triple::spirv:
14451452
case llvm::Triple::spir64:
14461453
case llvm::Triple::spirv64:
14471454
case llvm::Triple::systemz:
@@ -1536,6 +1543,7 @@ Triple Triple::get32BitArchVariant() const {
15361543
case Triple::riscv64: T.setArch(Triple::riscv32); break;
15371544
case Triple::sparcv9: T.setArch(Triple::sparc); break;
15381545
case Triple::spir64: T.setArch(Triple::spir); break;
1546+
case Triple::spirv:
15391547
case Triple::spirv64:
15401548
T.setArch(Triple::spirv32, getSubArch());
15411549
break;
@@ -1614,6 +1622,7 @@ Triple Triple::get64BitArchVariant() const {
16141622
case Triple::riscv32: T.setArch(Triple::riscv64); break;
16151623
case Triple::sparc: T.setArch(Triple::sparcv9); break;
16161624
case Triple::spir: T.setArch(Triple::spir64); break;
1625+
case Triple::spirv:
16171626
case Triple::spirv32:
16181627
T.setArch(Triple::spirv64, getSubArch());
16191628
break;
@@ -1656,6 +1665,7 @@ Triple Triple::getBigEndianArchVariant() const {
16561665
case Triple::shave:
16571666
case Triple::spir64:
16581667
case Triple::spir:
1668+
case Triple::spirv:
16591669
case Triple::spirv32:
16601670
case Triple::spirv64:
16611671
case Triple::wasm32:
@@ -1765,6 +1775,7 @@ bool Triple::isLittleEndian() const {
17651775
case Triple::sparcel:
17661776
case Triple::spir64:
17671777
case Triple::spir:
1778+
case Triple::spirv:
17681779
case Triple::spirv32:
17691780
case Triple::spirv64:
17701781
case Triple::tcele:

0 commit comments

Comments
 (0)