diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -4309,10 +4309,14 @@ auto TCAndArch = TCAndArchs.begin(); for (Action *&A : DeviceActions) { + if (A->getType() == types::TY_Nothing) + continue; + A = ConstructPhaseAction(C, Args, Phase, A, Kind); if (isa(A) && isa(HostAction) && - Kind == Action::OFK_OpenMP) { + Kind == Action::OFK_OpenMP && + HostAction->getType() != types::TY_Nothing) { // OpenMP offloading has a dependency on the host compile action to // identify which declarations need to be emitted. This shouldn't be // collapsed with any other actions so we can use it in the device. @@ -4380,11 +4384,15 @@ nullptr, Action::OFK_None); } + // If we are unable to embed a single device output into the host, we need to + // add each device output as a host dependency to ensure they are still built. + bool SingleDeviceOutput = !llvm::any_of(OffloadActions, [](Action *A) { + return A->getType() == types::TY_Nothing; + }) && isa(HostAction); OffloadAction::HostDependence HDep( *HostAction, *C.getSingleOffloadToolChain(), /*BoundArch=*/nullptr, isa(HostAction) ? DDep : DDeps); - return C.MakeAction( - HDep, isa(HostAction) ? DDep : DDeps); + return C.MakeAction(HDep, SingleDeviceOutput ? DDep : DDeps); } Action *Driver::ConstructPhaseAction( diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -4496,8 +4496,8 @@ const InputInfo *CudaDeviceInput = nullptr; const InputInfo *OpenMPDeviceInput = nullptr; for (const InputInfo &I : Inputs) { - if (&I == &Input) { - // This is the primary input. + if (&I == &Input || I.getType() == types::TY_Nothing) { + // This is the primary input or contains nothing. } else if (IsHeaderModulePrecompile && types::getPrecompiledType(I.getType()) == types::TY_PCH) { types::ID Expected = HeaderModuleInput.getType(); diff --git a/clang/test/Driver/cuda-bindings.cu b/clang/test/Driver/cuda-bindings.cu --- a/clang/test/Driver/cuda-bindings.cu +++ b/clang/test/Driver/cuda-bindings.cu @@ -216,3 +216,14 @@ // RUN: --offload-arch=sm_70 --offload-arch=sm_52 --offload-device-only -c -o %t %s 2>&1 \ // RUN: | FileCheck -check-prefix=MULTI-D-ONLY-O %s // MULTI-D-ONLY-O: error: cannot specify -o when generating multiple output files + +// +// Check to ensure that we can use '-fsyntax-only' for CUDA output with the new +// driver. +// +// RUN: %clang -### -target powerpc64le-ibm-linux-gnu --offload-new-driver \ +// RUN: -fsyntax-only --offload-arch=sm_70 --offload-arch=sm_52 -c %s 2>&1 \ +// RUN: | FileCheck -check-prefix=SYNTAX-ONLY %s +// SYNTAX-ONLY: "-cc1" "-triple" "nvptx64-nvidia-cuda"{{.*}}"-fsyntax-only" +// SYNTAX-ONLY: "-cc1" "-triple" "nvptx64-nvidia-cuda"{{.*}}"-fsyntax-only" +// SYNTAX-ONLY: "-cc1" "-triple" "powerpc64le-ibm-linux-gnu"{{.*}}"-fsyntax-only" diff --git a/clang/test/Driver/hip-binding.hip b/clang/test/Driver/hip-binding.hip --- a/clang/test/Driver/hip-binding.hip +++ b/clang/test/Driver/hip-binding.hip @@ -68,3 +68,14 @@ // RUN: --offload-arch=gfx90a --offload-arch=gfx908 --offload-device-only -c -o %t %s 2>&1 \ // RUN: | FileCheck -check-prefix=MULTI-D-ONLY-O %s // MULTI-D-ONLY-O: error: cannot specify -o when generating multiple output files + +// +// Check to ensure that we can use '-fsyntax-only' for HIP output with the new +// driver. +// +// RUN: %clang -### -target x86_64-unknown-linux-gnu --offload-new-driver \ +// RUN: -fsyntax-only --offload-arch=gfx90a --offload-arch=gfx908 -c %s 2>&1 \ +// RUN: | FileCheck -check-prefix=SYNTAX-ONLY %s +// SYNTAX-ONLY: "-cc1" "-triple" "amdgcn-amd-amdhsa"{{.*}}"-fsyntax-only" +// SYNTAX-ONLY: "-cc1" "-triple" "amdgcn-amd-amdhsa"{{.*}}"-fsyntax-only" +// SYNTAX-ONLY: "-cc1" "-triple" "x86_64-unknown-linux-gnu"{{.*}}"-fsyntax-only" diff --git a/clang/test/Driver/openmp-offload.c b/clang/test/Driver/openmp-offload.c --- a/clang/test/Driver/openmp-offload.c +++ b/clang/test/Driver/openmp-offload.c @@ -189,3 +189,20 @@ // RUN: -mllvm -abc %s 2>&1 | FileCheck -check-prefix=CHK-NEW-DRIVER-MLLVM %s // CHK-NEW-DRIVER-MLLVM: clang-linker-wrapper{{.*}} "-abc" + +// +// Ensure that we generate the correct bindings for '-fsyntax-only' for OpenMP. +// +// RUN: %clang -### --target=powerpc64le-linux -fopenmp=libomp -fopenmp-targets=powerpc64le-ibm-linux-gnu \ +// RUN: -fsyntax-only -ccc-print-bindings %s 2>&1 | FileCheck -check-prefix=CHK-SYNTAX-ONLY %s +// CHK-SYNTAX-ONLY: # "powerpc64le-ibm-linux-gnu" - "clang", inputs: ["[[INPUT:.+]]"], output: (nothing) +// CHK-SYNTAX-ONLY: # "powerpc64le-unknown-linux" - "clang", inputs: ["[[INPUT]]", (nothing)], output: (nothing) + +// +// Ensure that we can generate the correct arguments for '-fsyntax-only' for +// OpenMP. +// +// RUN: %clang -### --target=powerpc64le-linux -fopenmp=libomp -fopenmp-targets=powerpc64le-ibm-linux-gnu \ +// RUN: -fsyntax-only %s 2>&1 | FileCheck -check-prefix=CHK-SYNTAX-ONLY-ARGS %s +// CHK-SYNTAX-ONLY-ARGS: "-cc1" "-triple" "powerpc64le-ibm-linux-gnu"{{.*}}"-fsyntax-only" +// CHK-SYNTAX-ONLY-ARGS: "-cc1" "-triple" "powerpc64le-unknown-linux"{{.*}}"-fsyntax-only"