tambre updated this revision to Diff 248949.
tambre added a comment.
Add missing error message
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D75811/new/
https://reviews.llvm.org/D75811
Files:
clang/include/clang/Basic/Cuda.h
clang/include/clang/Basic/DiagnosticDriverKinds.td
clang/include/clang/Driver/Options.td
clang/lib/Basic/Cuda.cpp
clang/lib/Driver/Driver.cpp
clang/lib/Driver/ToolChains/Cuda.cpp
clang/lib/Driver/ToolChains/Cuda.h
Index: clang/lib/Driver/ToolChains/Cuda.h
===================================================================
--- clang/lib/Driver/ToolChains/Cuda.h
+++ clang/lib/Driver/ToolChains/Cuda.h
@@ -188,6 +188,7 @@
const llvm::opt::ArgList &Args) const override;
unsigned GetDefaultDwarfVersion() const override { return 2; }
+ CudaVersion getCudaVersion() const;
const ToolChain &HostTC;
CudaInstallationDetector CudaInstallation;
Index: clang/lib/Driver/ToolChains/Cuda.cpp
===================================================================
--- clang/lib/Driver/ToolChains/Cuda.cpp
+++ clang/lib/Driver/ToolChains/Cuda.cpp
@@ -884,3 +884,7 @@
const ArgList &Args) const {
return HostTC.computeMSVCVersion(D, Args);
}
+
+CudaVersion CudaToolChain::getCudaVersion() const {
+ return CudaInstallation.version();
+}
Index: clang/lib/Driver/Driver.cpp
===================================================================
--- clang/lib/Driver/Driver.cpp
+++ clang/lib/Driver/Driver.cpp
@@ -634,12 +634,17 @@
llvm::Triple CudaTriple(DeviceTripleStr);
// Use the CUDA and host triples as the key into the ToolChains map,
// because the device toolchain we create depends on both.
- auto &CudaTC = ToolChains[CudaTriple.str() + "/" + HostTriple.str()];
- if (!CudaTC) {
- CudaTC = std::make_unique<toolchains::CudaToolChain>(
- *this, CudaTriple, *HostTC, C.getInputArgs(), OFK);
+ auto &Toolchain = ToolChains[CudaTriple.str() + "/" + HostTriple.str()];
+ if (!Toolchain) {
+ std::unique_ptr<toolchains::CudaToolChain> CudaTC =
+ std::make_unique<toolchains::CudaToolChain>(
+ *this, CudaTriple, *HostTC, C.getInputArgs(), OFK);
+ C.getArgs().AddJoinedArg(
+ nullptr, getOpts().getOption(options::OPT_cuda_version_EQ),
+ CudaVersionToString(CudaTC->getCudaVersion()));
+ Toolchain = std::move(CudaTC);
}
- C.addOffloadDeviceToolChain(CudaTC.get(), OFK);
+ C.addOffloadDeviceToolChain(Toolchain.get(), OFK);
} else if (IsHIP) {
const ToolChain *HostTC = C.getSingleOffloadToolChain<Action::OFK_Host>();
const llvm::Triple &HostTriple = HostTC->getTriple();
@@ -2566,7 +2571,16 @@
CudaActionBuilder(Compilation &C, DerivedArgList &Args,
const Driver::InputList &Inputs)
: CudaActionBuilderBase(C, Args, Inputs, Action::OFK_Cuda) {
- DefaultCudaArch = CudaArch::SM_20;
+ StringRef VersionString =
+ Args.getLastArgValue(options::OPT_cuda_version_EQ);
+ CudaVersion Version = CudaStringToVersion(VersionString);
+
+ if (Version == CudaVersion::UNKNOWN) {
+ C.getDriver().Diag(clang::diag::err_drv_cuda_unknown_version)
+ << VersionString;
+ }
+
+ DefaultCudaArch = MinArchForCudaVersion(Version);
}
ActionBuilderReturnCode
Index: clang/lib/Basic/Cuda.cpp
===================================================================
--- clang/lib/Basic/Cuda.cpp
+++ clang/lib/Basic/Cuda.cpp
@@ -362,6 +362,14 @@
}
}
+CudaArch MinArchForCudaVersion(CudaVersion V) {
+ if (V >= CudaVersion::CUDA_90) {
+ return CudaArch::SM_30;
+ } else {
+ return CudaArch::SM_20;
+ }
+}
+
static CudaVersion ToCudaVersion(llvm::VersionTuple Version) {
int IVer =
Version.getMajor() * 10 + Version.getMinor().getValueOr(0);
Index: clang/include/clang/Driver/Options.td
===================================================================
--- clang/include/clang/Driver/Options.td
+++ clang/include/clang/Driver/Options.td
@@ -563,6 +563,9 @@
def cuda_compile_host_device : Flag<["--"], "cuda-compile-host-device">,
HelpText<"Compile CUDA code for both host and device (default). Has no "
"effect on non-CUDA compilations.">;
+def cuda_version_EQ : Joined<["--"], "cuda-version=">, Flags<[DriverOption]>,
+ MetaVarName<"<version>">, Values<"<major>.<minor>">,
+ HelpText<"Used to choose default architecture if no other options are given.">;
def cuda_include_ptx_EQ : Joined<["--"], "cuda-include-ptx=">, Flags<[DriverOption]>,
HelpText<"Include PTX for the following GPU architecture (e.g. sm_35) or 'all'. May be specified more than once.">;
def no_cuda_include_ptx_EQ : Joined<["--"], "no-cuda-include-ptx=">, Flags<[DriverOption]>,
Index: clang/include/clang/Basic/DiagnosticDriverKinds.td
===================================================================
--- clang/include/clang/Basic/DiagnosticDriverKinds.td
+++ clang/include/clang/Basic/DiagnosticDriverKinds.td
@@ -64,6 +64,7 @@
"Unknown CUDA version %0. Assuming the latest supported version %1">,
InGroup<CudaUnknownVersion>;
def err_drv_cuda_host_arch : Error<"unsupported architecture '%0' for host compilation.">;
+def err_drv_cuda_unknown_version : Error<"unknown CUDA version '%0'">;
def err_drv_mix_cuda_hip : Error<"Mixed Cuda and HIP compilation is not supported.">;
def err_drv_invalid_thread_model_for_target : Error<
"invalid thread model '%0' in '%1' for this target">;
Index: clang/include/clang/Basic/Cuda.h
===================================================================
--- clang/include/clang/Basic/Cuda.h
+++ clang/include/clang/Basic/Cuda.h
@@ -109,6 +109,9 @@
/// Get the latest CudaVersion that supports the given CudaArch.
CudaVersion MaxVersionForCudaArch(CudaArch A);
+/// Get the minimum CudaArch supported by the given CudaVersion.
+CudaArch MinArchForCudaVersion(CudaVersion V);
+
// Various SDK-dependent features that affect CUDA compilation
enum class CudaFeature {
// CUDA-9.2+ uses a new API for launching kernels.
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits