diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index 3670054dc7ae0..4b180c19cfd29 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -1733,12 +1733,13 @@ Compilation *Driver::BuildCompilation(ArrayRef ArgList) { if (Args.getLastArg(options::OPT_fsycl_dump_device_code_EQ)) DumpDeviceCode = true; - if (const Arg *A = Args.getLastArg(options::OPT_offload_host_only, - options::OPT_offload_device_only, - options::OPT_offload_host_device)) { + if (const Arg *A = Args.getLastArg( + options::OPT_offload_host_only, options::OPT_offload_device_only, + options::OPT_offload_host_device, options::OPT_fsycl_device_only)) { if (A->getOption().matches(options::OPT_offload_host_only)) Offload = OffloadHost; - else if (A->getOption().matches(options::OPT_offload_device_only)) + else if (A->getOption().matches(options::OPT_offload_device_only) || + A->getOption().matches(options::OPT_fsycl_device_only)) Offload = OffloadDevice; else Offload = OffloadHostDevice; @@ -4947,7 +4948,7 @@ class OffloadingActionBuilder final { getDeviceDependences(OffloadAction::DeviceDependences &DA, phases::ID CurPhase, phases::ID FinalPhase, PhasesTy &Phases) override { - bool SYCLDeviceOnly = Args.hasArg(options::OPT_fsycl_device_only); + bool SYCLDeviceOnly = C.getDriver().offloadDeviceOnly(); if (CurPhase == phases::Preprocess) { // Do not perform the host compilation when doing preprocessing only // with -fsycl-device-only. @@ -7881,9 +7882,9 @@ Action *Driver::BuildOffloadingActions(Compilation &C, break; } - // Backend/Assemble actions are not used for the SYCL device side - if (Kind == Action::OFK_SYCL && - (Phase == phases::Backend || Phase == phases::Assemble)) + // Assemble actions are not used for the SYCL device side. Both compile + // and backend actions are used to generate IR and textual IR if needed. + if (Kind == Action::OFK_SYCL && Phase == phases::Assemble) continue; auto TCAndArch = TCAndArchs.begin(); @@ -8138,12 +8139,14 @@ Action *Driver::ConstructPhaseAction( return C.MakeAction(Input, Output); } if (Args.hasArg(options::OPT_emit_llvm) || - (((Input->getOffloadingToolChain() && - Input->getOffloadingToolChain()->getTriple().isAMDGPU()) || - TargetDeviceOffloadKind == Action::OFK_HIP) && - (Args.hasFlag(options::OPT_fgpu_rdc, options::OPT_fno_gpu_rdc, - false) || - TargetDeviceOffloadKind == Action::OFK_OpenMP))) { + ((TargetDeviceOffloadKind == Action::OFK_SYCL && + C.getDriver().getUseNewOffloadingDriver()) || + (((Input->getOffloadingToolChain() && + Input->getOffloadingToolChain()->getTriple().isAMDGPU()) || + TargetDeviceOffloadKind == Action::OFK_HIP) && + (Args.hasFlag(options::OPT_fgpu_rdc, options::OPT_fno_gpu_rdc, + false) || + TargetDeviceOffloadKind == Action::OFK_OpenMP)))) { types::ID Output = Args.hasArg(options::OPT_S) && (TargetDeviceOffloadKind == Action::OFK_None || @@ -9400,7 +9403,7 @@ const char *Driver::GetNamedOutputPath(Compilation &C, const JobAction &JA, if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o)) return C.addResultFile(FinalOutput->getValue(), &JA); // Output to destination for -fsycl-device-only and Windows -o - if (C.getArgs().hasArg(options::OPT_fsycl_device_only)) + if (offloadDeviceOnly() && JA.getOffloadingDeviceKind() == Action::OFK_SYCL) if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT__SLASH_o)) return C.addResultFile(FinalOutput->getValue(), &JA); } diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index a0fec17563bf1..8d0ae6a74c677 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -10359,7 +10359,7 @@ static void getOtherSPIRVTransOpts(Compilation &C, C.getDriver().getFinalPhase(C.getArgs()) != phases::Link && TCArgs.getLastArgValue(options::OPT_fsycl_device_obj_EQ) .equals_insensitive("spirv") && - !TCArgs.hasArg(options::OPT_fsycl_device_only); + !C.getDriver().offloadDeviceOnly(); bool ShouldPreserveMetadataInFinalImage = TCArgs.hasArg(options::OPT_fsycl_preserve_device_nonsemantic_metadata); bool ShouldPreserveMetadata = diff --git a/clang/lib/Driver/ToolChains/Cuda.cpp b/clang/lib/Driver/ToolChains/Cuda.cpp index a0c5dd5ed9b7b..20eb94e141220 100644 --- a/clang/lib/Driver/ToolChains/Cuda.cpp +++ b/clang/lib/Driver/ToolChains/Cuda.cpp @@ -980,8 +980,8 @@ void CudaToolChain::addClangTargetOptions( } } - auto NoLibSpirv = DriverArgs.hasArg(options::OPT_fno_sycl_libspirv, - options::OPT_fsycl_device_only); + auto NoLibSpirv = DriverArgs.hasArg(options::OPT_fno_sycl_libspirv) || + getDriver().offloadDeviceOnly(); if (DeviceOffloadingKind == Action::OFK_SYCL && !NoLibSpirv) { std::string LibSpirvFile; diff --git a/clang/lib/Driver/ToolChains/HIPAMD.cpp b/clang/lib/Driver/ToolChains/HIPAMD.cpp index 567982e9a88ec..f223357a95e4c 100644 --- a/clang/lib/Driver/ToolChains/HIPAMD.cpp +++ b/clang/lib/Driver/ToolChains/HIPAMD.cpp @@ -284,8 +284,8 @@ void HIPAMDToolChain::addClangTargetOptions( CC1Args); } - auto NoLibSpirv = DriverArgs.hasArg(options::OPT_fno_sycl_libspirv, - options::OPT_fsycl_device_only); + auto NoLibSpirv = DriverArgs.hasArg(options::OPT_fno_sycl_libspirv) || + getDriver().offloadDeviceOnly(); if (DeviceOffloadingKind == Action::OFK_SYCL && !NoLibSpirv) { std::string LibSpirvFile; diff --git a/clang/test/Driver/sycl-offload-new-driver.c b/clang/test/Driver/sycl-offload-new-driver.c index fa9b8e4289872..a8bfdae1c327c 100644 --- a/clang/test/Driver/sycl-offload-new-driver.c +++ b/clang/test/Driver/sycl-offload-new-driver.c @@ -9,16 +9,18 @@ // OFFLOAD-NEW-DRIVER: 4: input, "[[INPUT]]", c++, (device-sycl) // OFFLOAD-NEW-DRIVER: 5: preprocessor, {4}, c++-cpp-output, (device-sycl) // OFFLOAD-NEW-DRIVER: 6: compiler, {5}, ir, (device-sycl) -// OFFLOAD-NEW-DRIVER: 7: offload, "device-sycl (nvptx64-nvidia-cuda)" {6}, ir -// OFFLOAD-NEW-DRIVER: 8: input, "[[INPUT]]", c++, (device-sycl) -// OFFLOAD-NEW-DRIVER: 9: preprocessor, {8}, c++-cpp-output, (device-sycl) -// OFFLOAD-NEW-DRIVER: 10: compiler, {9}, ir, (device-sycl) -// OFFLOAD-NEW-DRIVER: 11: offload, "device-sycl (spir64-unknown-unknown)" {10}, ir -// OFFLOAD-NEW-DRIVER: 12: clang-offload-packager, {7, 11}, image, (device-sycl) -// OFFLOAD-NEW-DRIVER: 13: offload, "host-sycl (x86_64-unknown-linux-gnu)" {3}, "device-sycl (x86_64-unknown-linux-gnu)" {12}, ir -// OFFLOAD-NEW-DRIVER: 14: backend, {13}, assembler, (host-sycl) -// OFFLOAD-NEW-DRIVER: 15: assembler, {14}, object, (host-sycl) -// OFFLOAD-NEW-DRIVER: 16: clang-linker-wrapper, {15}, image, (host-sycl) +// OFFLOAD-NEW-DRIVER: 7: backend, {6}, ir, (device-sycl) +// OFFLOAD-NEW-DRIVER: 8: offload, "device-sycl (nvptx64-nvidia-cuda)" {7}, ir +// OFFLOAD-NEW-DRIVER: 9: input, "[[INPUT]]", c++, (device-sycl) +// OFFLOAD-NEW-DRIVER: 10: preprocessor, {9}, c++-cpp-output, (device-sycl) +// OFFLOAD-NEW-DRIVER: 11: compiler, {10}, ir, (device-sycl) +// OFFLOAD-NEW-DRIVER: 12: backend, {11}, ir, (device-sycl) +// OFFLOAD-NEW-DRIVER: 13: offload, "device-sycl (spir64-unknown-unknown)" {12}, ir +// OFFLOAD-NEW-DRIVER: 14: clang-offload-packager, {8, 13}, image, (device-sycl) +// OFFLOAD-NEW-DRIVER: 15: offload, "host-sycl (x86_64-unknown-linux-gnu)" {3}, "device-sycl (x86_64-unknown-linux-gnu)" {14}, ir +// OFFLOAD-NEW-DRIVER: 16: backend, {15}, assembler, (host-sycl) +// OFFLOAD-NEW-DRIVER: 17: assembler, {16}, object, (host-sycl) +// OFFLOAD-NEW-DRIVER: 18: clang-linker-wrapper, {17}, image, (host-sycl) /// Check the toolflow for SYCL compilation using new offload model // RUN: %clangxx -### --target=x86_64-unknown-linux-gnu -fsycl -fsycl-targets=spir64 --offload-new-driver %s 2>&1 | FileCheck -check-prefix=CHK-FLOW %s @@ -47,3 +49,16 @@ // RUN: | FileCheck -check-prefix WRAPPER_OPTIONS_POSTLINK %s // WRAPPER_OPTIONS_POSTLINK: clang-linker-wrapper{{.*}} "--triple=spir64" // WRAPPER_OPTIONS_POSTLINK-SAME: "--sycl-post-link-options=-post-link-opt -O2 -spec-const=native -device-globals -split=auto -emit-only-kernels-as-entry-points -emit-param-info -symbols -emit-exported-symbols -split-esimd -lower-esimd" + +// -fsycl-device-only behavior +// RUN: %clangxx --target=x86_64-unknown-linux-gnu -fsycl --offload-new-driver \ +// RUN: -fsycl-device-only -ccc-print-phases %s 2>&1 \ +// RUN | FileCheck -check-prefix DEVICE_ONLY %s +// RUN: %clangxx --target=x86_64-unknown-linux-gnu -fsycl --offload-new-driver \ +// RUN: --offload-device-only -ccc-print-phases %s 2>&1 \ +// RUN: | FileCheck -check-prefix DEVICE_ONLY %s +// DEVICE_ONLY: 0: input, "{{.*}}", c++, (device-sycl) +// DEVICE_ONLY: 1: preprocessor, {0}, c++-cpp-output, (device-sycl) +// DEVICE_ONLY: 2: compiler, {1}, ir, (device-sycl) +// DEVICE_ONLY: 3: backend, {2}, ir, (device-sycl) +// DEVICE_ONLY: 4: offload, "device-sycl (spir64-unknown-unknown)" {3}, none