Skip to content

Commit bb957a8

Browse files
committed
[CUDA] Make the new driver properly ignore non-CUDA inputs
The new driver generated offloadinga actions for each active toolchain. However, for CUDA and HIP it is possible for the toolchain to be active but one of the files is not a valid input. This can occur if the user compiles both a CUDA and C source file in the same compiler invocation. This patch adds some simple logic to quit if the input is not valid as well. Reviewed By: tra, MaskRay Differential Revision: https://reviews.llvm.org/D129885
1 parent f32ccc2 commit bb957a8

File tree

2 files changed

+79
-43
lines changed

2 files changed

+79
-43
lines changed

Diff for: clang/lib/Driver/Driver.cpp

+8
Original file line numberDiff line numberDiff line change
@@ -4432,6 +4432,11 @@ Action *Driver::BuildOffloadingActions(Compilation &C,
44324432
types::ID InputType = Input.first;
44334433
const Arg *InputArg = Input.second;
44344434

4435+
// The toolchain can be active for unsupported file types.
4436+
if ((Kind == Action::OFK_Cuda && !types::isCuda(InputType)) ||
4437+
(Kind == Action::OFK_HIP && !types::isHIP(InputType)))
4438+
continue;
4439+
44354440
// Get the product of all bound architectures and toolchains.
44364441
SmallVector<std::pair<const ToolChain *, StringRef>> TCAndArchs;
44374442
for (const ToolChain *TC : ToolChains)
@@ -4486,6 +4491,9 @@ Action *Driver::BuildOffloadingActions(Compilation &C,
44864491
if (offloadDeviceOnly())
44874492
return C.MakeAction<OffloadAction>(DDeps, types::TY_Nothing);
44884493

4494+
if (OffloadActions.empty())
4495+
return HostAction;
4496+
44894497
OffloadAction::DeviceDependences DDep;
44904498
if (C.isOffloadingHostKind(Action::OFK_Cuda) &&
44914499
!Args.hasFlag(options::OPT_fgpu_rdc, options::OPT_fno_gpu_rdc, false)) {

Diff for: clang/test/Driver/cuda-phases.cu

+71-43
Original file line numberDiff line numberDiff line change
@@ -221,48 +221,76 @@
221221
//
222222
// Test the phases generated when using the new offloading driver.
223223
//
224-
// RUN: %clang -### -target powerpc64le-ibm-linux-gnu -ccc-print-phases --offload-new-driver -fgpu-rdc \
225-
// RUN: --offload-arch=sm_52 --offload-arch=sm_70 %s 2>&1 | FileCheck --check-prefix=NEW-DRIVER-RDC %s
226-
// NEW-DRIVER-RDC: 0: input, "[[INPUT:.+]]", cuda
227-
// NEW-DRIVER-RDC: 1: preprocessor, {0}, cuda-cpp-output
228-
// NEW-DRIVER-RDC: 2: compiler, {1}, ir
229-
// NEW-DRIVER-RDC: 3: input, "[[INPUT]]", cuda, (device-cuda, sm_52)
230-
// NEW-DRIVER-RDC: 4: preprocessor, {3}, cuda-cpp-output, (device-cuda, sm_52)
231-
// NEW-DRIVER-RDC: 5: compiler, {4}, ir, (device-cuda, sm_52)
232-
// NEW-DRIVER-RDC: 6: backend, {5}, assembler, (device-cuda, sm_52)
233-
// NEW-DRIVER-RDC: 7: assembler, {6}, object, (device-cuda, sm_52)
234-
// NEW-DRIVER-RDC: 8: offload, "device-cuda (nvptx64-nvidia-cuda:sm_52)" {7}, object
235-
// NEW-DRIVER-RDC: 9: input, "[[INPUT]]", cuda, (device-cuda, sm_70)
236-
// NEW-DRIVER-RDC: 10: preprocessor, {9}, cuda-cpp-output, (device-cuda, sm_70)
237-
// NEW-DRIVER-RDC: 11: compiler, {10}, ir, (device-cuda, sm_70)
238-
// NEW-DRIVER-RDC: 12: backend, {11}, assembler, (device-cuda, sm_70)
239-
// NEW-DRIVER-RDC: 13: assembler, {12}, object, (device-cuda, sm_70)
240-
// NEW-DRIVER-RDC: 14: offload, "device-cuda (nvptx64-nvidia-cuda:sm_70)" {13}, object
241-
// NEW-DRIVER-RDC: 15: clang-offload-packager, {8, 14}, image
242-
// NEW-DRIVER-RDC: 16: offload, " (powerpc64le-ibm-linux-gnu)" {2}, " (powerpc64le-ibm-linux-gnu)" {15}, ir
243-
// NEW-DRIVER-RDC: 17: backend, {16}, assembler, (host-cuda)
244-
// NEW-DRIVER-RDC: 18: assembler, {17}, object, (host-cuda)
245-
// NEW-DRIVER-RDC: 19: clang-linker-wrapper, {18}, image, (host-cuda)
224+
// RUN: %clang -### --target=powerpc64le-ibm-linux-gnu -ccc-print-phases --offload-new-driver -fgpu-rdc \
225+
// RUN: --offload-arch=sm_52 --offload-arch=sm_70 %s 2>&1 | FileCheck --check-prefix=NEW-DRIVER-RDC %s
226+
// NEW-DRIVER-RDC: 0: input, "[[INPUT:.+]]", cuda
227+
// NEW-DRIVER-RDC-NEXT: 1: preprocessor, {0}, cuda-cpp-output
228+
// NEW-DRIVER-RDC-NEXT: 2: compiler, {1}, ir
229+
// NEW-DRIVER-RDC-NEXT: 3: input, "[[INPUT]]", cuda, (device-cuda, sm_52)
230+
// NEW-DRIVER-RDC-NEXT: 4: preprocessor, {3}, cuda-cpp-output, (device-cuda, sm_52)
231+
// NEW-DRIVER-RDC-NEXT: 5: compiler, {4}, ir, (device-cuda, sm_52)
232+
// NEW-DRIVER-RDC-NEXT: 6: backend, {5}, assembler, (device-cuda, sm_52)
233+
// NEW-DRIVER-RDC-NEXT: 7: assembler, {6}, object, (device-cuda, sm_52)
234+
// NEW-DRIVER-RDC-NEXT: 8: offload, "device-cuda (nvptx64-nvidia-cuda:sm_52)" {7}, object
235+
// NEW-DRIVER-RDC-NEXT: 9: input, "[[INPUT]]", cuda, (device-cuda, sm_70)
236+
// NEW-DRIVER-RDC-NEXT: 10: preprocessor, {9}, cuda-cpp-output, (device-cuda, sm_70)
237+
// NEW-DRIVER-RDC-NEXT: 11: compiler, {10}, ir, (device-cuda, sm_70)
238+
// NEW-DRIVER-RDC-NEXT: 12: backend, {11}, assembler, (device-cuda, sm_70)
239+
// NEW-DRIVER-RDC-NEXT: 13: assembler, {12}, object, (device-cuda, sm_70)
240+
// NEW-DRIVER-RDC-NEXT: 14: offload, "device-cuda (nvptx64-nvidia-cuda:sm_70)" {13}, object
241+
// NEW-DRIVER-RDC-NEXT: 15: clang-offload-packager, {8, 14}, image
242+
// NEW-DRIVER-RDC-NEXT: 16: offload, " (powerpc64le-ibm-linux-gnu)" {2}, " (powerpc64le-ibm-linux-gnu)" {15}, ir
243+
// NEW-DRIVER-RDC-NEXT: 17: backend, {16}, assembler, (host-cuda)
244+
// NEW-DRIVER-RDC-NEXT: 18: assembler, {17}, object, (host-cuda)
245+
// NEW-DRIVER-RDC-NEXT: 19: clang-linker-wrapper, {18}, image, (host-cuda)
246246

247247
// RUN: %clang -### -target powerpc64le-ibm-linux-gnu -ccc-print-phases --offload-new-driver -fgpu-rdc \
248-
// RUN: --offload-arch=sm_52 --offload-arch=sm_70 %s 2>&1 | FileCheck --check-prefix=NEW-DRIVER %s
249-
// NEW-DRIVER: 0: input, "[[INPUT:.+]]", cuda
250-
// NEW-DRIVER: 1: preprocessor, {0}, cuda-cpp-output
251-
// NEW-DRIVER: 2: compiler, {1}, ir
252-
// NEW-DRIVER: 3: input, "[[INPUT]]", cuda, (device-cuda, sm_52)
253-
// NEW-DRIVER: 4: preprocessor, {3}, cuda-cpp-output, (device-cuda, sm_52)
254-
// NEW-DRIVER: 5: compiler, {4}, ir, (device-cuda, sm_52)
255-
// NEW-DRIVER: 6: backend, {5}, assembler, (device-cuda, sm_52)
256-
// NEW-DRIVER: 7: assembler, {6}, object, (device-cuda, sm_52)
257-
// NEW-DRIVER: 8: offload, "device-cuda (nvptx64-nvidia-cuda:sm_52)" {7}, object
258-
// NEW-DRIVER: 9: input, "[[INPUT]]", cuda, (device-cuda, sm_70)
259-
// NEW-DRIVER: 10: preprocessor, {9}, cuda-cpp-output, (device-cuda, sm_70)
260-
// NEW-DRIVER: 11: compiler, {10}, ir, (device-cuda, sm_70)
261-
// NEW-DRIVER: 12: backend, {11}, assembler, (device-cuda, sm_70)
262-
// NEW-DRIVER: 13: assembler, {12}, object, (device-cuda, sm_70)
263-
// NEW-DRIVER: 14: offload, "device-cuda (nvptx64-nvidia-cuda:sm_70)" {13}, object
264-
// NEW-DRIVER: 15: clang-offload-packager, {8, 14}, image
265-
// NEW-DRIVER: 16: offload, " (powerpc64le-ibm-linux-gnu)" {2}, " (powerpc64le-ibm-linux-gnu)" {15}, ir
266-
// NEW-DRIVER: 17: backend, {16}, assembler, (host-cuda)
267-
// NEW-DRIVER: 18: assembler, {17}, object, (host-cuda)
268-
// NEW-DRIVER: 19: clang-linker-wrapper, {18}, image, (host-cuda)
248+
// RUN: --offload-arch=sm_52 --offload-arch=sm_70 %s 2>&1 | FileCheck --check-prefix=NEW-DRIVER %s
249+
// NEW-DRIVER: 0: input, "[[INPUT:.+]]", cuda
250+
// NEW-DRIVER-NEXT: 1: preprocessor, {0}, cuda-cpp-output
251+
// NEW-DRIVER-NEXT: 2: compiler, {1}, ir
252+
// NEW-DRIVER-NEXT: 3: input, "[[INPUT]]", cuda, (device-cuda, sm_52)
253+
// NEW-DRIVER-NEXT: 4: preprocessor, {3}, cuda-cpp-output, (device-cuda, sm_52)
254+
// NEW-DRIVER-NEXT: 5: compiler, {4}, ir, (device-cuda, sm_52)
255+
// NEW-DRIVER-NEXT: 6: backend, {5}, assembler, (device-cuda, sm_52)
256+
// NEW-DRIVER-NEXT: 7: assembler, {6}, object, (device-cuda, sm_52)
257+
// NEW-DRIVER-NEXT: 8: offload, "device-cuda (nvptx64-nvidia-cuda:sm_52)" {7}, object
258+
// NEW-DRIVER-NEXT: 9: input, "[[INPUT]]", cuda, (device-cuda, sm_70)
259+
// NEW-DRIVER-NEXT: 10: preprocessor, {9}, cuda-cpp-output, (device-cuda, sm_70)
260+
// NEW-DRIVER-NEXT: 11: compiler, {10}, ir, (device-cuda, sm_70)
261+
// NEW-DRIVER-NEXT: 12: backend, {11}, assembler, (device-cuda, sm_70)
262+
// NEW-DRIVER-NEXT: 13: assembler, {12}, object, (device-cuda, sm_70)
263+
// NEW-DRIVER-NEXT: 14: offload, "device-cuda (nvptx64-nvidia-cuda:sm_70)" {13}, object
264+
// NEW-DRIVER-NEXT: 15: clang-offload-packager, {8, 14}, image
265+
// NEW-DRIVER-NEXT: 16: offload, " (powerpc64le-ibm-linux-gnu)" {2}, " (powerpc64le-ibm-linux-gnu)" {15}, ir
266+
// NEW-DRIVER-NEXT: 17: backend, {16}, assembler, (host-cuda)
267+
// NEW-DRIVER-NEXT: 18: assembler, {17}, object, (host-cuda)
268+
// NEW-DRIVER-NEXT: 19: clang-linker-wrapper, {18}, image, (host-cuda)
269+
270+
// RUN: %clang -### --target=powerpc64le-ibm-linux-gnu -ccc-print-phases --offload-new-driver \
271+
// RUN: --offload-arch=sm_52 --offload-arch=sm_70 %s %S/Inputs/empty.cpp 2>&1 | FileCheck --check-prefix=NON-CUDA-INPUT %s
272+
// NON-CUDA-INPUT: 0: input, "[[CUDA:.+]]", cuda, (host-cuda)
273+
// NON-CUDA-INPUT-NEXT: 1: preprocessor, {0}, cuda-cpp-output, (host-cuda)
274+
// NON-CUDA-INPUT-NEXT: 2: compiler, {1}, ir, (host-cuda)
275+
// NON-CUDA-INPUT-NEXT: 3: input, "[[CUDA]]", cuda, (device-cuda, sm_52)
276+
// NON-CUDA-INPUT-NEXT: 4: preprocessor, {3}, cuda-cpp-output, (device-cuda, sm_52)
277+
// NON-CUDA-INPUT-NEXT: 5: compiler, {4}, ir, (device-cuda, sm_52)
278+
// NON-CUDA-INPUT-NEXT: 6: backend, {5}, assembler, (device-cuda, sm_52)
279+
// NON-CUDA-INPUT-NEXT: 7: assembler, {6}, object, (device-cuda, sm_52)
280+
// NON-CUDA-INPUT-NEXT: 8: offload, "device-cuda (nvptx64-nvidia-cuda:sm_52)" {7}, object
281+
// NON-CUDA-INPUT-NEXT: 9: input, "[[CUDA]]", cuda, (device-cuda, sm_70)
282+
// NON-CUDA-INPUT-NEXT: 10: preprocessor, {9}, cuda-cpp-output, (device-cuda, sm_70)
283+
// NON-CUDA-INPUT-NEXT: 11: compiler, {10}, ir, (device-cuda, sm_70)
284+
// NON-CUDA-INPUT-NEXT: 12: backend, {11}, assembler, (device-cuda, sm_70)
285+
// NON-CUDA-INPUT-NEXT: 13: assembler, {12}, object, (device-cuda, sm_70)
286+
// NON-CUDA-INPUT-NEXT: 14: offload, "device-cuda (nvptx64-nvidia-cuda:sm_70)" {13}, object
287+
// NON-CUDA-INPUT-NEXT: 15: linker, {8, 14}, cuda-fatbin, (device-cuda)
288+
// NON-CUDA-INPUT-NEXT: 16: offload, "host-cuda (powerpc64le-ibm-linux-gnu)" {2}, "device-cuda (nvptx64-nvidia-cuda)" {15}, ir
289+
// NON-CUDA-INPUT-NEXT: 17: backend, {16}, assembler, (host-cuda)
290+
// NON-CUDA-INPUT-NEXT: 18: assembler, {17}, object, (host-cuda)
291+
// NON-CUDA-INPUT-NEXT: 19: input, "[[CPP:.+]]", c++, (host-cuda)
292+
// NON-CUDA-INPUT-NEXT: 20: preprocessor, {19}, c++-cpp-output, (host-cuda)
293+
// NON-CUDA-INPUT-NEXT: 21: compiler, {20}, ir, (host-cuda)
294+
// NON-CUDA-INPUT-NEXT: 22: backend, {21}, assembler, (host-cuda)
295+
// NON-CUDA-INPUT-NEXT: 23: assembler, {22}, object, (host-cuda)
296+
// NON-CUDA-INPUT-NEXT: 24: clang-linker-wrapper, {18, 23}, image, (host-cuda)

0 commit comments

Comments
 (0)