aboutsummaryrefslogtreecommitdiff
path: root/clang/lib
diff options
context:
space:
mode:
authorNathan Gauër <brioche@google.com>2023-07-21 16:50:10 +0200
committerNathan Gauër <brioche@google.com>2023-09-11 10:15:24 +0200
commit53b6a169e453a2a91d3713ca16fa089853c670a8 (patch)
tree5e4171a1a2395e3020d4c4912709bdfac36128b7 /clang/lib
parent3bff611068ae70e3273a46bbc72bc66b66f98c1c (diff)
downloadllvm-53b6a169e453a2a91d3713ca16fa089853c670a8.zip
llvm-53b6a169e453a2a91d3713ca16fa089853c670a8.tar.gz
llvm-53b6a169e453a2a91d3713ca16fa089853c670a8.tar.bz2
[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
Diffstat (limited to 'clang/lib')
-rw-r--r--clang/lib/Basic/Targets.cpp3
-rw-r--r--clang/lib/Basic/Targets/SPIR.cpp11
-rw-r--r--clang/lib/Basic/Targets/SPIR.h54
-rw-r--r--clang/lib/Frontend/CompilerInvocation.cpp3
4 files changed, 51 insertions, 20 deletions
diff --git a/clang/lib/Basic/Targets.cpp b/clang/lib/Basic/Targets.cpp
index 2afffc4..69576db 100644
--- a/clang/lib/Basic/Targets.cpp
+++ b/clang/lib/Basic/Targets.cpp
@@ -665,6 +665,9 @@ std::unique_ptr<TargetInfo> AllocateTarget(const llvm::Triple &Triple,
return nullptr;
return std::make_unique<SPIR64TargetInfo>(Triple, Opts);
}
+ case llvm::Triple::spirv: {
+ return std::make_unique<SPIRVTargetInfo>(Triple, Opts);
+ }
case llvm::Triple::spirv32: {
if (os != llvm::Triple::UnknownOS ||
Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
diff --git a/clang/lib/Basic/Targets/SPIR.cpp b/clang/lib/Basic/Targets/SPIR.cpp
index 09d482a..dc92017 100644
--- a/clang/lib/Basic/Targets/SPIR.cpp
+++ b/clang/lib/Basic/Targets/SPIR.cpp
@@ -33,19 +33,24 @@ void SPIR64TargetInfo::getTargetDefines(const LangOptions &Opts,
DefineStd(Builder, "SPIR64", Opts);
}
+void BaseSPIRVTargetInfo::getTargetDefines(const LangOptions &Opts,
+ MacroBuilder &Builder) const {
+ DefineStd(Builder, "SPIRV", Opts);
+}
+
void SPIRVTargetInfo::getTargetDefines(const LangOptions &Opts,
MacroBuilder &Builder) const {
- DefineStd(Builder, "SPIRV", Opts);
+ BaseSPIRVTargetInfo::getTargetDefines(Opts, Builder);
}
void SPIRV32TargetInfo::getTargetDefines(const LangOptions &Opts,
MacroBuilder &Builder) const {
- SPIRVTargetInfo::getTargetDefines(Opts, Builder);
+ BaseSPIRVTargetInfo::getTargetDefines(Opts, Builder);
DefineStd(Builder, "SPIRV32", Opts);
}
void SPIRV64TargetInfo::getTargetDefines(const LangOptions &Opts,
MacroBuilder &Builder) const {
- SPIRVTargetInfo::getTargetDefines(Opts, Builder);
+ BaseSPIRVTargetInfo::getTargetDefines(Opts, Builder);
DefineStd(Builder, "SPIRV64", Opts);
}
diff --git a/clang/lib/Basic/Targets/SPIR.h b/clang/lib/Basic/Targets/SPIR.h
index a7ea03e..9ab2b7c6 100644
--- a/clang/lib/Basic/Targets/SPIR.h
+++ b/clang/lib/Basic/Targets/SPIR.h
@@ -93,10 +93,6 @@ protected:
: TargetInfo(Triple) {
assert((Triple.isSPIR() || Triple.isSPIRV()) &&
"Invalid architecture for SPIR or SPIR-V.");
- assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
- "SPIR(-V) target must use unknown OS");
- assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
- "SPIR(-V) target must use unknown environment type");
TLSSupported = false;
VLASupported = false;
LongWidth = LongAlign = 64;
@@ -284,31 +280,53 @@ public:
MacroBuilder &Builder) const override;
};
-class LLVM_LIBRARY_VISIBILITY SPIRVTargetInfo : public BaseSPIRTargetInfo {
+class LLVM_LIBRARY_VISIBILITY BaseSPIRVTargetInfo : public BaseSPIRTargetInfo {
public:
- SPIRVTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
+ BaseSPIRVTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
: BaseSPIRTargetInfo(Triple, Opts) {
assert(Triple.isSPIRV() && "Invalid architecture for SPIR-V.");
- assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
- "SPIR-V target must use unknown OS");
- assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
- "SPIR-V target must use unknown environment type");
+ }
+
+ bool hasFeature(StringRef Feature) const override {
+ return Feature == "spirv";
}
void getTargetDefines(const LangOptions &Opts,
MacroBuilder &Builder) const override;
+};
- bool hasFeature(StringRef Feature) const override {
- return Feature == "spirv";
+class LLVM_LIBRARY_VISIBILITY SPIRVTargetInfo : public BaseSPIRVTargetInfo {
+public:
+ SPIRVTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
+ : BaseSPIRVTargetInfo(Triple, Opts) {
+ assert(Triple.getArch() == llvm::Triple::spirv &&
+ "Invalid architecture for Logical SPIR-V.");
+ assert(Triple.getOS() == llvm::Triple::ShaderModel &&
+ "Logical SPIR-V requires a valid ShaderModel.");
+ assert(Triple.getEnvironment() >= llvm::Triple::Pixel &&
+ Triple.getEnvironment() <= llvm::Triple::Amplification &&
+ "Logical SPIR-V environment must be a valid shader stage.");
+
+ // SPIR-V IDs are represented with a single 32-bit word.
+ SizeType = TargetInfo::UnsignedInt;
+ resetDataLayout("e-i64:64-v16:16-v24:32-v32:32-v48:64-"
+ "v96:128-v192:256-v256:256-v512:512-v1024:1024");
}
+
+ void getTargetDefines(const LangOptions &Opts,
+ MacroBuilder &Builder) const override;
};
-class LLVM_LIBRARY_VISIBILITY SPIRV32TargetInfo : public SPIRVTargetInfo {
+class LLVM_LIBRARY_VISIBILITY SPIRV32TargetInfo : public BaseSPIRVTargetInfo {
public:
SPIRV32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
- : SPIRVTargetInfo(Triple, Opts) {
+ : BaseSPIRVTargetInfo(Triple, Opts) {
assert(Triple.getArch() == llvm::Triple::spirv32 &&
"Invalid architecture for 32-bit SPIR-V.");
+ assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
+ "32-bit SPIR-V target must use unknown OS");
+ assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
+ "32-bit SPIR-V target must use unknown environment type");
PointerWidth = PointerAlign = 32;
SizeType = TargetInfo::UnsignedInt;
PtrDiffType = IntPtrType = TargetInfo::SignedInt;
@@ -320,12 +338,16 @@ public:
MacroBuilder &Builder) const override;
};
-class LLVM_LIBRARY_VISIBILITY SPIRV64TargetInfo : public SPIRVTargetInfo {
+class LLVM_LIBRARY_VISIBILITY SPIRV64TargetInfo : public BaseSPIRVTargetInfo {
public:
SPIRV64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
- : SPIRVTargetInfo(Triple, Opts) {
+ : BaseSPIRVTargetInfo(Triple, Opts) {
assert(Triple.getArch() == llvm::Triple::spirv64 &&
"Invalid architecture for 64-bit SPIR-V.");
+ assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
+ "64-bit SPIR-V target must use unknown OS");
+ assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
+ "64-bit SPIR-V target must use unknown environment type");
PointerWidth = PointerAlign = 64;
SizeType = TargetInfo::UnsignedLong;
PtrDiffType = IntPtrType = TargetInfo::SignedLong;
diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp
index 51644e8..73a3d31 100644
--- a/clang/lib/Frontend/CompilerInvocation.cpp
+++ b/clang/lib/Frontend/CompilerInvocation.cpp
@@ -4143,7 +4143,8 @@ bool CompilerInvocation::ParseLangArgs(LangOptions &Opts, ArgList &Args,
// Validate options for HLSL
if (Opts.HLSL) {
- bool SupportedTarget = T.getArch() == llvm::Triple::dxil &&
+ bool SupportedTarget = (T.getArch() == llvm::Triple::dxil ||
+ T.getArch() == llvm::Triple::spirv) &&
T.getOS() == llvm::Triple::ShaderModel;
if (!SupportedTarget)
Diags.Report(diag::err_drv_hlsl_unsupported_target) << T.str();