summaryrefslogtreecommitdiffstats
path: root/clang/lib/Driver/Driver.cpp
diff options
context:
space:
mode:
authorJustin Lebar <jlebar@google.com>2016-03-30 23:30:25 +0000
committerJustin Lebar <jlebar@google.com>2016-03-30 23:30:25 +0000
commit0e450a5d61795a2ca9160a34a75855fd1d16e16c (patch)
tree55df0906abcc6113db21e29bac5208b6c230f3d5 /clang/lib/Driver/Driver.cpp
parentba122ab42fe54aee3427dc61b765cc8a9dad9d85 (diff)
downloadbcm5719-llvm-0e450a5d61795a2ca9160a34a75855fd1d16e16c.tar.gz
bcm5719-llvm-0e450a5d61795a2ca9160a34a75855fd1d16e16c.zip
[CUDA] Don't initialize the CUDA toolchain if we don't have any CUDA inputs.
Summary: This prevents errors when you invoke clang with a flag that the NVPTX toolchain doesn't support. For example, on x86-64, clang -mthread-model single -x c++ /dev/null -o /dev/null should output just one error about "invalid thread model 'single' in '-mthread-model single' for this target"; x86-64 doesn't support -mthread-model, but we shouldn't also instantiate a NVPTX target! Reviewers: echristo Subscribers: tra, sunfish, cfe-commits Differential Revision: http://reviews.llvm.org/D18629 llvm-svn: 264965
Diffstat (limited to 'clang/lib/Driver/Driver.cpp')
-rw-r--r--clang/lib/Driver/Driver.cpp17
1 files changed, 13 insertions, 4 deletions
diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp
index e434e68c7b9..a5f9ebbdb15 100644
--- a/clang/lib/Driver/Driver.cpp
+++ b/clang/lib/Driver/Driver.cpp
@@ -507,10 +507,6 @@ Compilation *Driver::BuildCompilation(ArrayRef<const char *> ArgList) {
// The compilation takes ownership of Args.
Compilation *C = new Compilation(*this, TC, UArgs.release(), TranslatedArgs);
- C->setCudaDeviceToolChain(
- &getToolChain(C->getArgs(), llvm::Triple(TC.getTriple().isArch64Bit()
- ? "nvptx64-nvidia-cuda"
- : "nvptx-nvidia-cuda")));
if (!HandleImmediateArgs(*C))
return C;
@@ -518,6 +514,19 @@ Compilation *Driver::BuildCompilation(ArrayRef<const char *> ArgList) {
InputList Inputs;
BuildInputs(C->getDefaultToolChain(), *TranslatedArgs, Inputs);
+ // Initialize the CUDA device TC only if we have any CUDA Inputs. This is
+ // necessary so that we don't break compilations that pass flags that are
+ // incompatible with the NVPTX TC (e.g. -mthread-model single).
+ if (llvm::any_of(Inputs, [](const std::pair<types::ID, const Arg *> &I) {
+ return I.first == types::TY_CUDA || I.first == types::TY_PP_CUDA ||
+ I.first == types::TY_CUDA_DEVICE;
+ })) {
+ C->setCudaDeviceToolChain(
+ &getToolChain(C->getArgs(), llvm::Triple(TC.getTriple().isArch64Bit()
+ ? "nvptx64-nvidia-cuda"
+ : "nvptx-nvidia-cuda")));
+ }
+
// Construct the list of abstract actions to perform for this compilation. On
// MachO targets this uses the driver-driver and universal actions.
if (TC.getTriple().isOSBinFormatMachO())
OpenPOWER on IntegriCloud