jhuber6 created this revision. jhuber6 added reviewers: tra, yaxunl, jdoerfert, JonChesterfield. Herald added a project: All. jhuber6 requested review of this revision. Herald added subscribers: cfe-commits, sstefan1, MaskRay. Herald added a project: clang.
The new driver currently crashses when attempting to use the '-fsyntax-only' option. This is because the option causes all output to be given the `TY_Nothing' type which should signal the end of the pipeline. The new driver was not treating this correctly and attempting to use empty input. This patch fixes the handling so we do not attempt to continue when the input is nothing. One concession is that we must now check when generating the arguments for Clang if the input is of 'TY_Nothing'. This is because the new driver will only create code if the device code is a dependency on the host, creating the output without the dependency would require a complete rewrite of the logic as we do not maintain any state between calls to 'BuildOffloadingActions' so I believe this is the most straightforward method. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D133161 Files: clang/lib/Driver/Driver.cpp clang/lib/Driver/ToolChains/Clang.cpp clang/test/Driver/cuda-bindings.cu clang/test/Driver/hip-binding.hip clang/test/Driver/openmp-offload.c
Index: clang/test/Driver/openmp-offload.c =================================================================== --- clang/test/Driver/openmp-offload.c +++ 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" Index: clang/test/Driver/hip-binding.hip =================================================================== --- clang/test/Driver/hip-binding.hip +++ 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" Index: clang/test/Driver/cuda-bindings.cu =================================================================== --- clang/test/Driver/cuda-bindings.cu +++ clang/test/Driver/cuda-bindings.cu @@ -163,3 +163,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" Index: clang/lib/Driver/ToolChains/Clang.cpp =================================================================== --- clang/lib/Driver/ToolChains/Clang.cpp +++ clang/lib/Driver/ToolChains/Clang.cpp @@ -4500,8 +4500,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(); Index: clang/lib/Driver/Driver.cpp =================================================================== --- clang/lib/Driver/Driver.cpp +++ clang/lib/Driver/Driver.cpp @@ -4317,10 +4317,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<CompileJobAction>(A) && isa<CompileJobAction>(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. @@ -4388,11 +4392,14 @@ nullptr, Action::OFK_None); } + // If false, pass all generated inputs to the host individually. + bool SingleDeviceOutput = !llvm::any_of(OffloadActions, [](Action *A) { + return A->getType() == types::TY_Nothing; + }) && isa<CompileJobAction>(HostAction); OffloadAction::HostDependence HDep( *HostAction, *C.getSingleOffloadToolChain<Action::OFK_Host>(), /*BoundArch=*/nullptr, isa<CompileJobAction>(HostAction) ? DDep : DDeps); - return C.MakeAction<OffloadAction>( - HDep, isa<CompileJobAction>(HostAction) ? DDep : DDeps); + return C.MakeAction<OffloadAction>(HDep, SingleDeviceOutput ? DDep : DDeps); } Action *Driver::ConstructPhaseAction(
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits