From ea371ec2b269e2efa84a93e7360b85c5b1c6dcc9 Mon Sep 17 00:00:00 2001 From: Jacob Lambert Date: Wed, 22 Oct 2025 19:32:30 -0700 Subject: [PATCH 1/3] [HIP] Move HIP to the new driver by default Summary: This patch matches CUDA, moving the HIP compilation jobs to the new driver by default. The old behavior will return with --no-offload-new-driver. The main difference is that objects compiled with the old driver are no longer compatible and will need to be recompiled or the old driver used. Authored by @jhuber6 --- clang/lib/Driver/Driver.cpp | 26 +++++++------- clang/lib/Driver/ToolChains/Clang.cpp | 7 ++-- clang/lib/Driver/ToolChains/Darwin.cpp | 4 ++- clang/test/Driver/cl-offload.cu | 5 ++- clang/test/Driver/cuda-arch-translation.cu | 36 +++++++++---------- ...-file-flag-with-multiple-offload-archs.hip | 5 +-- clang/test/Driver/hip-code-object-version.hip | 5 +-- clang/test/Driver/hip-gz-options.hip | 7 ++-- clang/test/Driver/hip-macros.hip | 3 -- clang/test/Driver/hip-offload-arch.hip | 4 +-- clang/test/Driver/hip-options.hip | 11 ++---- clang/test/Driver/hip-sanitize-options.hip | 2 +- clang/test/Driver/hip-save-temps.hip | 12 +++---- clang/test/Driver/hip-thinlto.hip | 8 ++--- .../test/Driver/hip-toolchain-device-only.hip | 4 --- clang/test/Driver/hip-toolchain-mllvm.hip | 2 -- clang/test/Driver/hip-toolchain-no-rdc.hip | 18 ++++++++-- clang/test/Driver/hip-toolchain-opt.hip | 35 ++++++------------ .../Driver/hipspv-link-static-library.hip | 4 +-- clang/test/Driver/hipspv-pass-plugin.hip | 8 ++--- clang/test/Driver/hipspv-toolchain.hip | 2 +- clang/unittests/Tooling/ToolingTest.cpp | 6 ++-- 22 files changed, 96 insertions(+), 118 deletions(-) diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index 081069d211641..0f647e690a74a 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -4398,15 +4398,9 @@ void Driver::BuildActions(Compilation &C, DerivedArgList &Args, void Driver::BuildDefaultActions(Compilation &C, DerivedArgList &Args, const InputList &Inputs, ActionList &Actions) const { - - bool UseNewOffloadingDriver = - C.isOffloadingHostKind(Action::OFK_OpenMP) || - C.isOffloadingHostKind(Action::OFK_SYCL) || - Args.hasFlag(options::OPT_foffload_via_llvm, - options::OPT_fno_offload_via_llvm, false) || - Args.hasFlag(options::OPT_offload_new_driver, - options::OPT_no_offload_new_driver, - C.isOffloadingHostKind(Action::OFK_Cuda)); + bool UseNewOffloadingDriver = Args.hasFlag( + options::OPT_offload_new_driver, options::OPT_no_offload_new_driver, + C.getActiveOffloadKinds() != Action::OFK_None); bool HIPNoRDC = C.isOffloadingHostKind(Action::OFK_HIP) && @@ -5036,8 +5030,8 @@ Action *Driver::BuildOffloadingActions(Compilation &C, bool ShouldBundleHIP = Args.hasFlag(options::OPT_gpu_bundle_output, options::OPT_no_gpu_bundle_output, false) || - (HIPNoRDC && offloadDeviceOnly() && - llvm::none_of(OffloadActions, [](Action *A) { + (!Args.getLastArg(options::OPT_no_gpu_bundle_output) && HIPNoRDC && + offloadDeviceOnly() && llvm::none_of(OffloadActions, [](Action *A) { return A->getType() != types::TY_Image; })); @@ -5212,8 +5206,13 @@ Action *Driver::ConstructPhaseAction( Args.hasArg(options::OPT_S) ? types::TY_LTO_IR : types::TY_LTO_BC; return C.MakeAction(Input, Output); } + + bool IsAMDGCNSPIRV = Input->getOffloadingToolChain() && + Input->getOffloadingToolChain()->getTriple().getOS() == + llvm::Triple::OSType::AMDHSA && + Input->getOffloadingToolChain()->getTriple().isSPIRV(); if (Args.hasArg(options::OPT_emit_llvm) || - TargetDeviceOffloadKind == Action::OFK_SYCL || + TargetDeviceOffloadKind == Action::OFK_SYCL || IsAMDGCNSPIRV || (((Input->getOffloadingToolChain() && Input->getOffloadingToolChain()->getTriple().isAMDGPU()) || TargetDeviceOffloadKind == Action::OFK_HIP) && @@ -5233,7 +5232,8 @@ Action *Driver::ConstructPhaseAction( (TargetDeviceOffloadKind == Action::OFK_HIP && !Args.hasFlag(options::OPT_offload_new_driver, options::OPT_no_offload_new_driver, - C.isOffloadingHostKind(Action::OFK_Cuda)))) + C.getActiveOffloadKinds() != + Action::OFK_None))) ? types::TY_LLVM_IR : types::TY_LLVM_BC; return C.MakeAction(Input, Output); diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index 369a2c2e58cb5..1ca8104d7fb99 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -4897,7 +4897,7 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, (JA.isHostOffloading(C.getActiveOffloadKinds()) && Args.hasFlag(options::OPT_offload_new_driver, options::OPT_no_offload_new_driver, - C.isOffloadingHostKind(Action::OFK_Cuda))); + C.getActiveOffloadKinds() != Action::OFK_None)); bool IsRDCMode = Args.hasFlag(options::OPT_fgpu_rdc, options::OPT_fno_gpu_rdc, false); @@ -5265,7 +5265,7 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, if (IsDeviceOffloadAction && !JA.isDeviceOffloading(Action::OFK_OpenMP) && !Args.hasFlag(options::OPT_offload_new_driver, options::OPT_no_offload_new_driver, - C.isOffloadingHostKind(Action::OFK_Cuda)) && + C.getActiveOffloadKinds() != Action::OFK_None) && !Triple.isAMDGPU()) { D.Diag(diag::err_drv_unsupported_opt_for_target) << Args.getLastArg(options::OPT_foffload_lto, @@ -6829,7 +6829,7 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, CmdArgs.append({"--offload-new-driver", "-foffload-via-llvm"}); } else if (Args.hasFlag(options::OPT_offload_new_driver, options::OPT_no_offload_new_driver, - C.isOffloadingHostKind(Action::OFK_Cuda))) { + C.getActiveOffloadKinds() != Action::OFK_None)) { CmdArgs.push_back("--offload-new-driver"); } @@ -9254,6 +9254,7 @@ void LinkerWrapper::ConstructJob(Compilation &C, const JobAction &JA, OPT_fno_lto, OPT_flto, OPT_flto_partitions_EQ, + OPT_hipspv_pass_plugin_EQ, OPT_flto_EQ}; const llvm::DenseSet LinkerOptions{OPT_mllvm, OPT_Zlinker_input}; auto ShouldForwardForToolChain = [&](Arg *A, const ToolChain &TC) { diff --git a/clang/lib/Driver/ToolChains/Darwin.cpp b/clang/lib/Driver/ToolChains/Darwin.cpp index 234683f2f4882..8138eefed4a96 100644 --- a/clang/lib/Driver/ToolChains/Darwin.cpp +++ b/clang/lib/Driver/ToolChains/Darwin.cpp @@ -573,7 +573,9 @@ void darwin::Linker::ConstructJob(Compilation &C, const JobAction &JA, const InputInfoList &Inputs, const ArgList &Args, const char *LinkingOutput) const { - assert(Output.getType() == types::TY_Image && "Invalid linker output type."); + assert((Output.getType() == types::TY_Image || + Output.getType() == types::TY_Object) && + "Invalid linker output type."); // If the number of arguments surpasses the system limits, we will encode the // input files in a separate file, shortening the command line. To this end, diff --git a/clang/test/Driver/cl-offload.cu b/clang/test/Driver/cl-offload.cu index 8bd1a3ff56e6c..b516892ab3f19 100644 --- a/clang/test/Driver/cl-offload.cu +++ b/clang/test/Driver/cl-offload.cu @@ -20,11 +20,10 @@ // CUDA-SAME: "-Weverything" // CUDA: link -// HIP: "-cc1" "-triple" "x86_64-pc-windows-msvc{{.*}}" "-aux-triple" "amdgcn-amd-amdhsa" -// HIP-SAME: "-Weverything" // HIP: "-cc1" "-triple" "amdgcn-amd-amdhsa" "-aux-triple" "x86_64-pc-windows-msvc" // HIP-SAME: "-Weverything" -// HIP: {{lld.* "-flavor" "gnu" "-m" "elf64_amdgpu"}} +// HIP: "-cc1" "-triple" "x86_64-pc-windows-msvc{{.*}}" "-aux-triple" "amdgcn-amd-amdhsa" +// HIP-SAME: "-Weverything" // HIP: {{link.* "amdhip64.lib"}} // CMake uses this option when finding packages for HIP, so diff --git a/clang/test/Driver/cuda-arch-translation.cu b/clang/test/Driver/cuda-arch-translation.cu index b4a521df2e6f5..65234d091efd7 100644 --- a/clang/test/Driver/cuda-arch-translation.cu +++ b/clang/test/Driver/cuda-arch-translation.cu @@ -66,7 +66,7 @@ // CUDA-SAME: -m64 // CUDA: fatbinary -// HIP: clang-offload-bundler +// HIP: llvm-offload-binary // SM20:--image3=kind=elf,sm=20{{.*}} // SM21:--image3=kind=elf,sm=21{{.*}} @@ -81,20 +81,20 @@ // SM61:--image3=kind=elf,sm=61{{.*}} // SM62:--image3=kind=elf,sm=62{{.*}} // SM70:--image3=kind=elf,sm=70{{.*}} -// GFX600:-targets=host-x86_64-unknown-linux-gnu,hipv4-amdgcn-amd-amdhsa--gfx600 -// GFX601:-targets=host-x86_64-unknown-linux-gnu,hipv4-amdgcn-amd-amdhsa--gfx601 -// GFX602:-targets=host-x86_64-unknown-linux-gnu,hipv4-amdgcn-amd-amdhsa--gfx602 -// GFX700:-targets=host-x86_64-unknown-linux-gnu,hipv4-amdgcn-amd-amdhsa--gfx700 -// GFX701:-targets=host-x86_64-unknown-linux-gnu,hipv4-amdgcn-amd-amdhsa--gfx701 -// GFX702:-targets=host-x86_64-unknown-linux-gnu,hipv4-amdgcn-amd-amdhsa--gfx702 -// GFX703:-targets=host-x86_64-unknown-linux-gnu,hipv4-amdgcn-amd-amdhsa--gfx703 -// GFX704:-targets=host-x86_64-unknown-linux-gnu,hipv4-amdgcn-amd-amdhsa--gfx704 -// GFX705:-targets=host-x86_64-unknown-linux-gnu,hipv4-amdgcn-amd-amdhsa--gfx705 -// GFX801:-targets=host-x86_64-unknown-linux-gnu,hipv4-amdgcn-amd-amdhsa--gfx801 -// GFX802:-targets=host-x86_64-unknown-linux-gnu,hipv4-amdgcn-amd-amdhsa--gfx802 -// GFX803:-targets=host-x86_64-unknown-linux-gnu,hipv4-amdgcn-amd-amdhsa--gfx803 -// GFX805:-targets=host-x86_64-unknown-linux-gnu,hipv4-amdgcn-amd-amdhsa--gfx805 -// GFX810:-targets=host-x86_64-unknown-linux-gnu,hipv4-amdgcn-amd-amdhsa--gfx810 -// GFX900:-targets=host-x86_64-unknown-linux-gnu,hipv4-amdgcn-amd-amdhsa--gfx900 -// GFX902:-targets=host-x86_64-unknown-linux-gnu,hipv4-amdgcn-amd-amdhsa--gfx902 -// SPIRV:-targets=host-x86_64-unknown-linux-gnu,hip-spirv64-amd-amdhsa--amdgcnspirv +// GFX600:triple=amdgcn-amd-amdhsa,arch=gfx600 +// GFX601:triple=amdgcn-amd-amdhsa,arch=gfx601 +// GFX602:triple=amdgcn-amd-amdhsa,arch=gfx602 +// GFX700:triple=amdgcn-amd-amdhsa,arch=gfx700 +// GFX701:triple=amdgcn-amd-amdhsa,arch=gfx701 +// GFX702:triple=amdgcn-amd-amdhsa,arch=gfx702 +// GFX703:triple=amdgcn-amd-amdhsa,arch=gfx703 +// GFX704:triple=amdgcn-amd-amdhsa,arch=gfx704 +// GFX705:triple=amdgcn-amd-amdhsa,arch=gfx705 +// GFX801:triple=amdgcn-amd-amdhsa,arch=gfx801 +// GFX802:triple=amdgcn-amd-amdhsa,arch=gfx802 +// GFX803:triple=amdgcn-amd-amdhsa,arch=gfx803 +// GFX805:triple=amdgcn-amd-amdhsa,arch=gfx805 +// GFX810:triple=amdgcn-amd-amdhsa,arch=gfx810 +// GFX900:triple=amdgcn-amd-amdhsa,arch=gfx900 +// GFX902:triple=amdgcn-amd-amdhsa,arch=gfx902 +// SPIRV:triple=spirv64-amd-amdhsa,arch=amdgcnspirv diff --git a/clang/test/Driver/dep-file-flag-with-multiple-offload-archs.hip b/clang/test/Driver/dep-file-flag-with-multiple-offload-archs.hip index f17e56acfb7f7..a73587d77d679 100644 --- a/clang/test/Driver/dep-file-flag-with-multiple-offload-archs.hip +++ b/clang/test/Driver/dep-file-flag-with-multiple-offload-archs.hip @@ -1,12 +1,9 @@ // RUN: %clang -### -nogpuinc -nogpulib --offload-arch=gfx1030 --offload-arch=gfx1100 --offload-arch=gfx1101 --target=x86_64-linux-gnu -MD -MF tmp.d %s 2>&1 | FileCheck %s // CHECK-NOT: {{.*}}clang{{.*}}"-target-cpu" "gfx1030"{{.*}}"-dependency-file" "tmp.d" -// CHECK: {{.*}}lld{{.*}}"-plugin-opt=mcpu=gfx1030" // CHECK-NOT: {{.*}}clang{{.*}}"-target-cpu" "gfx1100"{{.*}}"-dependency-file" "tmp.d" -// CHECK: {{.*}}lld{{.*}}"-plugin-opt=mcpu=gfx1100" // CHECK-NOT: {{.*}}clang{{.*}}"-target-cpu" "gfx1101"{{.*}}"-dependency-file" "tmp.d" -// CHECK: {{.*}}lld{{.*}}"-plugin-opt=mcpu=gfx1101" -// CHECK: {{.*}}clang-offload-bundler +// CHECK: {{.*}}llvm-offload-binary // CHECK: {{.*}}clang{{.*}}"-target-cpu"{{.*}}"-dependency-file" "tmp.d" void main(){} diff --git a/clang/test/Driver/hip-code-object-version.hip b/clang/test/Driver/hip-code-object-version.hip index 6767c27761d0a..d4887609f4547 100644 --- a/clang/test/Driver/hip-code-object-version.hip +++ b/clang/test/Driver/hip-code-object-version.hip @@ -7,7 +7,6 @@ // V4: "-mcode-object-version=4" // V4: "-mllvm" "--amdhsa-code-object-version=4" -// V4: "-targets=host-x86_64-unknown-linux-gnu,hipv4-amdgcn-amd-amdhsa--gfx906" // Check bundle ID for code object version 5. @@ -18,7 +17,6 @@ // V5: "-mcode-object-version=5" // V5: "-mllvm" "--amdhsa-code-object-version=5" -// V5: "-targets=host-x86_64-unknown-linux-gnu,hipv4-amdgcn-amd-amdhsa--gfx906" // Check bundle ID for code object version 6. @@ -29,11 +27,10 @@ // V6: "-mcode-object-version=6" // V6: "-mllvm" "--amdhsa-code-object-version=6" -// V6: "-targets=host-x86_64-unknown-linux-gnu,hipv4-amdgcn-amd-amdhsa--gfx906" // Check bundle ID for code object version default -// RUN: %clang -### --target=x86_64-linux-gnu \ +// RUN: %clang -### --target=x86_64-linux-gnu --no-offload-new-driver \ // RUN: --offload-arch=gfx906 -nogpuinc -nogpulib \ // RUN: %s 2>&1 | FileCheck -check-prefix=VD %s diff --git a/clang/test/Driver/hip-gz-options.hip b/clang/test/Driver/hip-gz-options.hip index 36de8e8404020..6d2709a172784 100644 --- a/clang/test/Driver/hip-gz-options.hip +++ b/clang/test/Driver/hip-gz-options.hip @@ -1,14 +1,13 @@ // REQUIRES: zlib // RUN: %clang -### --target=x86_64-unknown-linux-gnu \ -// RUN: --offload-arch=gfx906 %s -nogpulib -nogpuinc \ +// RUN: --offload-arch=gfx906 %s -nogpulib -nogpuinc \ // RUN: -ggdb -gz=zlib 2>&1 | FileCheck %s // RUN: %clang -### --target=x86_64-unknown-linux-gnu \ // RUN: -fgpu-rdc --offload-arch=gfx906 %s -nogpulib -nogpuinc \ // RUN: -ggdb -gz=zlib 2>&1 | FileCheck %s -// CHECK-DAG: {{".*clang(-[0-9]+)?(.exe)?" .* "--compress-debug-sections=zlib"}} -// CHECK-DAG: {{".*lld(.exe)?" .* "--compress-debug-sections=zlib"}} -// CHECK-DAG: {{".*clang(-[0-9]+)?(.exe)?" .* "--compress-debug-sections=zlib"}} +// CHECK-DAG: {{".*clang(-[0-9]+)?(.exe)?" .* "-triple" "amdgcn-amd-amdhsa" .* "--compress-debug-sections=zlib"}} +// CHECK-DAG: {{".*clang(-[0-9]+)?(.exe)?" .* "-triple" "x86_64-unknown-linux-gnu".* "--compress-debug-sections=zlib"}} // CHECK: "--compress-debug-sections=zlib" diff --git a/clang/test/Driver/hip-macros.hip b/clang/test/Driver/hip-macros.hip index 516e01a6c4743..94bc5f5590192 100644 --- a/clang/test/Driver/hip-macros.hip +++ b/clang/test/Driver/hip-macros.hip @@ -77,8 +77,6 @@ // RUN: %clang -E -dM --offload-arch=gfx942 --cuda-device-only -nogpuinc -nogpulib \ // RUN: %s 2>&1 | FileCheck --check-prefixes=NOPTS %s // PTS-DAG: #define __HIP_API_PER_THREAD_DEFAULT_STREAM__ 1 -// PTS-DAG: #define __HIP_API_PER_THREAD_DEFAULT_STREAM__ 1 -// PTS-DAG: #define HIP_API_PER_THREAD_DEFAULT_STREAM 1 // PTS-DAG: #define HIP_API_PER_THREAD_DEFAULT_STREAM 1 // NOPTS-NOT: #define __HIP_API_PER_THREAD_DEFAULT_STREAM__ // NOPTS-NOT: #define HIP_API_PER_THREAD_DEFAULT_STREAM @@ -89,4 +87,3 @@ // RUN: %s 2>&1 | FileCheck --check-prefix=APPROX %s // NOAPPROX-NOT: #define __CLANG_GPU_APPROX_TRANSCENDENTALS__ // APPROX: #define __CLANG_GPU_APPROX_TRANSCENDENTALS__ 1 -// APPROX: #define __CLANG_GPU_APPROX_TRANSCENDENTALS__ 1 diff --git a/clang/test/Driver/hip-offload-arch.hip b/clang/test/Driver/hip-offload-arch.hip index dd65a0e103ec6..1af53baf63da7 100644 --- a/clang/test/Driver/hip-offload-arch.hip +++ b/clang/test/Driver/hip-offload-arch.hip @@ -4,5 +4,5 @@ // RUN: -nogpuinc -nogpulib \ // RUN: %s 2>&1 | FileCheck %s -// CHECK: {{"[^"]*clang[^"]*".* "-target-cpu" "gfx1030"}} -// CHECK: {{"[^"]*clang[^"]*".* "-target-cpu" "gfx1031"}} +// CHECK: "-cc1" "-triple" "amdgcn-amd-amdhsa"{{.*}}"-target-cpu" "gfx1030" +// CHECK: "-cc1" "-triple" "amdgcn-amd-amdhsa"{{.*}}"-target-cpu" "gfx1031" diff --git a/clang/test/Driver/hip-options.hip b/clang/test/Driver/hip-options.hip index 09f1ffa62d348..43713cc7bc5b8 100644 --- a/clang/test/Driver/hip-options.hip +++ b/clang/test/Driver/hip-options.hip @@ -83,16 +83,12 @@ // RUN: --cuda-gpu-arch=gfx906 -foffload-lto=thin -fwhole-program-vtables %s 2>&1 \ // RUN: | FileCheck -check-prefix=HIPTHINLTO %s -// RUN: %clang -### --target=x86_64-unknown-linux-gnu -nogpuinc -nogpulib \ -// RUN: --cuda-gpu-arch=gfx906 -fgpu-rdc -foffload-lto=thin -fwhole-program-vtables %s 2>&1 \ -// RUN: | FileCheck -check-prefix=HIPTHINLTO %s - // Ensure we don't error about -fwhole-program-vtables for the non-device offload compile. // HIPTHINLTO-NOT: error: invalid argument '-fwhole-program-vtables' only allowed with '-flto' // HIPTHINLTO-NOT: "-cc1"{{.*}} "-triple" "x86_64-unknown-linux-gnu" {{.*}} "-flto-unit" // HIPTHINLTO: "-cc1"{{.*}} "-triple" "amdgcn-amd-amdhsa" {{.*}} "-flto=thin" "-flto-unit" {{.*}} "-fwhole-program-vtables" // HIPTHINLTO-NOT: "-cc1"{{.*}} "-triple" "x86_64-unknown-linux-gnu" {{.*}} "-flto-unit" -// HIPTHINLTO: lld{{.*}}"-plugin-opt=mcpu=gfx906" "-plugin-opt=thinlto" "-plugin-opt=-force-import-all" +// HIPTHINLTO: clang-linker-wrapper{{.*}} "--device-compiler=amdgcn-amd-amdhsa=-flto=thin" // Check that -flto=thin is handled correctly, particularly with -fwhole-program-vtables. // @@ -120,10 +116,7 @@ // RUN: %clang -### --target=x86_64-unknown-linux-gnu -nogpuinc -nogpulib \ // RUN: --cuda-gpu-arch=gfx906 -fgpu-rdc -Xoffload-linker --build-id=md5 %s 2>&1 \ // RUN: | FileCheck -check-prefix=OFL-LINK %s -// RUN: %clang -### --target=x86_64-unknown-linux-gnu -nogpuinc -nogpulib \ -// RUN: --cuda-gpu-arch=gfx906 -Xoffload-linker --build-id=md5 %s 2>&1 \ -// RUN: | FileCheck -check-prefix=OFL-LINK %s -// OFL-LINK: lld{{.*}}"--build-id=md5" +// OFL-LINK: clang-linker-wrapper{{.*}}"--device-linker=--build-id=md5" // RUN: %clang -### --target=x86_64-unknown-linux-gnu -nogpuinc -nogpulib \ // RUN: --offload-arch=gfx906 -fhip-kernel-arg-name %s 2>&1 \ diff --git a/clang/test/Driver/hip-sanitize-options.hip b/clang/test/Driver/hip-sanitize-options.hip index 0c9c15b61fdc9..8e7e5e3986fb6 100644 --- a/clang/test/Driver/hip-sanitize-options.hip +++ b/clang/test/Driver/hip-sanitize-options.hip @@ -56,8 +56,8 @@ // NORDC-NOT: {{"[^"]*lld(\.exe){0,1}".*}} "[[OUT]]" {{".*asanrtl.bc" ".*hip.bc"}} // NORDC: {{"[^"]*clang[^"]*".* "-triple" "x86_64-unknown-linux-gnu".* "-fsanitize=address"}} -// RDC: {{"[^"]*clang[^"]*".* "-triple" "x86_64-unknown-linux-gnu".* "-fsanitize=address"}} // RDC: {{"[^"]*clang[^"]*".* "-emit-llvm-bc".* "-fcuda-is-device".* "-mlink-bitcode-file" ".*asanrtl.bc".* "-fsanitize=address".*}} "-o" "[[OUT:[^"]*.bc]]" +// RDC: {{"[^"]*clang[^"]*".* "-triple" "x86_64-unknown-linux-gnu".* "-fsanitize=address"}} // RDC-NOT: {{"[^"]*lld(\.exe){0,1}".*}} "[[OUT]]" {{".*asanrtl.bc" ".*hip.bc"}} // FAIL: error: cannot find ROCm device library for ABI version 5; provide its path via '--rocm-path' or '--rocm-device-lib-path', or pass '-nogpulib' to build without ROCm device library diff --git a/clang/test/Driver/hip-save-temps.hip b/clang/test/Driver/hip-save-temps.hip index 142c3f1611a36..2e8489f65d7e0 100644 --- a/clang/test/Driver/hip-save-temps.hip +++ b/clang/test/Driver/hip-save-temps.hip @@ -1,31 +1,31 @@ // -fno-gpu-rdc without -o with -c // RUN: %clang -### --target=x86_64-linux-gnu -nogpulib -save-temps \ -// RUN: -nogpuinc --offload-arch=gfx900 -c %s 2>&1 | \ +// RUN: --no-offload-new-driver -nogpuinc --offload-arch=gfx900 -c %s 2>&1 | \ // RUN: FileCheck -check-prefixes=CHECK,NORDC %s // -fno-gpu-rdc without -o // RUN: %clang -### --target=x86_64-linux-gnu -nogpulib -save-temps \ -// RUN: -nogpuinc --offload-arch=gfx900 %s 2>&1 | \ +// RUN: --no-offload-new-driver -nogpuinc --offload-arch=gfx900 %s 2>&1 | \ // RUN: FileCheck -check-prefixes=CHECK,NORDC,NOUT %s // -fno-gpu-rdc with -o // RUN: %clang -### --target=x86_64-linux-gnu -nogpulib -save-temps \ -// RUN: -nogpuinc -o executable --offload-arch=gfx900 %s 2>&1 | \ +// RUN: --no-offload-new-driver -nogpuinc -o executable --offload-arch=gfx900 %s 2>&1 | \ // RUN: FileCheck -check-prefixes=CHECK,NORDC,WOUT %s // -fgpu-rdc without -o with -c // RUN: %clang -### --target=x86_64-linux-gnu -nogpulib -save-temps \ -// RUN: -nogpuinc -fgpu-rdc --offload-arch=gfx900 -c %s 2>&1 | \ +// RUN: --no-offload-new-driver -nogpuinc -fgpu-rdc --offload-arch=gfx900 -c %s 2>&1 | \ // RUN: FileCheck -check-prefixes=CHECK,RDC,RDCC %s // -fgpu-rdc without -o // RUN: %clang -### --target=x86_64-linux-gnu -nogpulib -save-temps \ -// RUN: -nogpuinc -fgpu-rdc --offload-arch=gfx900 %s 2>&1 | \ +// RUN: --no-offload-new-driver -nogpuinc -fgpu-rdc --offload-arch=gfx900 %s 2>&1 | \ // RUN: FileCheck -check-prefixes=CHECK,RDC,RDCL,NOUT %s // -fgpu-rdc with -o // UN: %clang -### --target=x86_64-linux-gnu -nogpulib -save-temps \ -// UN: -nogpuinc -o executable -fgpu-rdc --offload-arch=gfx900 %s 2>&1 | \ +// UN: --offload-new-driver -nogpuinc -o executable -fgpu-rdc --offload-arch=gfx900 %s 2>&1 | \ // UN: FileCheck -check-prefixes=CHECK,RDC,RDCL,WOUT %s // -fgpu-rdc host object path diff --git a/clang/test/Driver/hip-thinlto.hip b/clang/test/Driver/hip-thinlto.hip index bcb7d4e6cb52e..53fd0485cb16b 100644 --- a/clang/test/Driver/hip-thinlto.hip +++ b/clang/test/Driver/hip-thinlto.hip @@ -1,9 +1,9 @@ // RUN: %clang -foffload-lto=thin -nogpulib -nogpuinc %s -### 2>&1 | FileCheck %s -// CHECK: -plugin-opt=thinlto -// CHECK-SAME: -plugin-opt=-force-import-all -// CHECK-SAME: -plugin-opt=-avail-extern-to-local -// CHECK-SAME: -plugin-opt=-avail-extern-gv-in-addrspace-to-local=3 +// CHECK: "--device-compiler=amdgcn-amd-amdhsa=-flto=thin" +// CHECK-SAME: "--device-linker=amdgcn-amd-amdhsa=-plugin-opt=-force-import-all" +// CHECK-SAME: "--device-linker=amdgcn-amd-amdhsa=-plugin-opt=-avail-extern-to-local" +// CHECK-SAME: "--device-linker=amdgcn-amd-amdhsa=-plugin-opt=-avail-extern-gv-in-addrspace-to-local=3" int main(int, char *[]) { return 0; } diff --git a/clang/test/Driver/hip-toolchain-device-only.hip b/clang/test/Driver/hip-toolchain-device-only.hip index 8c696669a5e4f..196117a798736 100644 --- a/clang/test/Driver/hip-toolchain-device-only.hip +++ b/clang/test/Driver/hip-toolchain-device-only.hip @@ -21,7 +21,3 @@ // CHECK: [[LLD]] "-flavor" "gnu" "-m" "elf64_amdgpu" "--no-undefined" "-shared" // CHECK-SAME: "-o" "[[IMG_DEV_A_900:.*out]]" [[OBJ_DEV_A_900]] - -// CHECK: [[BUNDLER:".*clang-offload-bundler"]] "-type=o" -// CHECK-SAME: "-targets={{.*}},hip{{.*}}-amdgcn-amd-amdhsa--gfx803,hip{{.*}}-amdgcn-amd-amdhsa--gfx900" -// CHECK-SAME: "-input={{.*}}" "-input=[[IMG_DEV_A_803]]" "-input=[[IMG_DEV_A_900]]" "-output=[[BUNDLE_A:.*hipfb]]" diff --git a/clang/test/Driver/hip-toolchain-mllvm.hip b/clang/test/Driver/hip-toolchain-mllvm.hip index 33018cc398915..bedb053b9006c 100644 --- a/clang/test/Driver/hip-toolchain-mllvm.hip +++ b/clang/test/Driver/hip-toolchain-mllvm.hip @@ -30,13 +30,11 @@ // CHECK-SAME: "-aux-triple" "x86_64-unknown-linux-gnu" // CHECK-SAME: {{.*}} "-target-cpu" "gfx803" // CHECK-SAME: {{.*}} "-mllvm" "-unroll-count=10" {{.*}} -// CHECK: [[LLD:".*lld.*"]] {{.*}}"-m" "elf64_amdgpu"{{.*}} "-plugin-opt=-unroll-count=10"{{.*}} "-plugin-opt=-inline-threshold=100" // CHECK: [[CLANG]] "-cc1" "-triple" "amdgcn-amd-amdhsa" // CHECK-SAME: "-aux-triple" "x86_64-unknown-linux-gnu" // CHECK-SAME: {{.*}} "-target-cpu" "gfx900" // CHECK-SAME: {{.*}} "-mllvm" "-unroll-count=10" {{.*}} -// CHECK: [[LLD:".*lld.*"]] {{.*}} "-plugin-opt=-unroll-count=10"{{.*}} "-plugin-opt=-inline-threshold=100" // NEG-NOT: {{".*opt"}} // NEG-NOT: {{".*llc"}} diff --git a/clang/test/Driver/hip-toolchain-no-rdc.hip b/clang/test/Driver/hip-toolchain-no-rdc.hip index dc8f0a97ad371..3b64d13a172a4 100644 --- a/clang/test/Driver/hip-toolchain-no-rdc.hip +++ b/clang/test/Driver/hip-toolchain-no-rdc.hip @@ -4,7 +4,7 @@ // RUN: --hip-device-lib=lib1.bc --hip-device-lib=lib2.bc \ // RUN: --hip-device-lib-path=%S/Inputs/hip_multiple_inputs/lib1 \ // RUN: --hip-device-lib-path=%S/Inputs/hip_multiple_inputs/lib2 \ -// RUN: -fuse-ld=lld -B%S/Inputs/lld -nogpuinc \ +// RUN: -fuse-ld=lld -B%S/Inputs/lld -nogpuinc --no-offload-new-driver \ // RUN: %S/Inputs/hip_multiple_inputs/a.cu \ // RUN: %S/Inputs/hip_multiple_inputs/b.hip \ // RUN: 2>&1 | FileCheck -check-prefixes=CHECK,LINK,OLD %s @@ -14,7 +14,7 @@ // RUN: --hip-device-lib=lib1.bc --hip-device-lib=lib2.bc \ // RUN: --hip-device-lib-path=%S/Inputs/hip_multiple_inputs/lib1 \ // RUN: --hip-device-lib-path=%S/Inputs/hip_multiple_inputs/lib2 \ -// RUN: -fuse-ld=lld -B%S/Inputs/lld -nogpuinc -c \ +// RUN: -fuse-ld=lld -B%S/Inputs/lld -nogpuinc -c --no-offload-new-driver \ // RUN: %S/Inputs/hip_multiple_inputs/a.cu \ // RUN: %S/Inputs/hip_multiple_inputs/b.hip \ // RUN: 2>&1 | FileCheck -check-prefixes=CHECK,OLD %s @@ -36,11 +36,16 @@ // RUN: %t/a.o %t/b.o \ // RUN: 2>&1 | FileCheck -check-prefixes=LKONLY %s -// RUN: %clang -### --target=x86_64-linux-gnu \ +// RUN: %clang -### --target=x86_64-linux-gnu --no-offload-new-driver \ // RUN: --offload-arch=amdgcnspirv --offload-arch=gfx900 \ // RUN: %s -nogpuinc -nogpulib \ // RUN: 2>&1 | FileCheck -check-prefixes=AMDGCNSPIRV %s +// RUN: %clang -### --target=x86_64-linux-gnu --offload-new-driver \ +// RUN: --offload-arch=amdgcnspirv --offload-arch=gfx900 \ +// RUN: %s -nogpuinc -nogpulib \ +// RUN: 2>&1 | FileCheck -check-prefixes=AMDGCNSPIRV-NEW %s + // // Compile device code in a.cu to code object for gfx803. // @@ -214,3 +219,10 @@ // AMDGCNSPIRV: {{".*clang-offload-bundler.*"}} "-type=o" // AMDGCNSPIRV-SAME: "-targets={{.*}}hipv4-spirv64-amd-amdhsa--amdgcnspirv,hipv4-amdgcn-amd-amdhsa--gfx900" // AMDGCNSPIRV-SAME: "-input=[[AMDGCNSPV_CO]]" "-input=[[GFX900_CO]]" + +// Check verbose printing with the new driver. +// RUN: %clang -### --target=x86_64-linux-gnu -fno-gpu-rdc -nogpulib -nogpuinc \ +// RUN: --offload-new-driver --offload-arch=gfx908 -v %s 2>&1 | FileCheck %s --check-prefix=VERBOSE +// VERBOSE: clang-linker-wrapper +// VERBOSE-NOT: --device-compiler=amdgcn-amd-amdhsa=-v +// VERBOSE-NOT: --wrapper-verbose diff --git a/clang/test/Driver/hip-toolchain-opt.hip b/clang/test/Driver/hip-toolchain-opt.hip index b104f6fff2034..bb033717deada 100644 --- a/clang/test/Driver/hip-toolchain-opt.hip +++ b/clang/test/Driver/hip-toolchain-opt.hip @@ -74,30 +74,6 @@ // O0-CGO2-SAME: "-O0" // O0-CGO2-NOT: "--lto-CGO2" -// ALL-NOT: "{{.*}}opt" - -// ALL-NOT: "{{.*}}llc" - -// ALL: "{{.*}}lld{{.*}}" {{.*}} "-plugin-opt=mcpu=gfx900" -// DEFAULT-NOT: "-plugin-opt=O{{.*}}" -// O0-SAME: "-plugin-opt=O0" -// O0-SAME: "--lto-CGO0" -// O1-SAME: "-plugin-opt=O1" -// O1-SAME: "--lto-CGO1" -// O2-SAME: "-plugin-opt=O2" -// O2-SAME: "--lto-CGO2" -// O3-SAME: "-plugin-opt=O3" -// O3-SAME: "--lto-CGO3" -// Os-SAME: "-plugin-opt=O2" -// Os-SAME: "--lto-CGO2" -// Oz-SAME: "-plugin-opt=O2" -// Oz-SAME: "--lto-CGO2" -// Og-SAME: "-plugin-opt=O1" -// Og-SAME: "--lto-CGO1" -// O0-CGO2-SAME: "-plugin-opt=O0" -// O0-CGO2-SAME: "--lto-CGO0" -// O0-CGO2-SAME: "--lto-CGO2" - // ALL: "-cc1" "-triple" "x86_64-unknown-linux-gnu" // DEFAULT-NOT: "-O{{.}}" // O0-SAME: "-O0" @@ -109,3 +85,14 @@ // Og-SAME: "-Og" // O0-CGO2-SAME: "-O0" // O0-CGO2-NOT: "--lto-CGO2" + +// ALL: "{{.*}}clang-linker-wrapper{{.*}}" "--should-extract=gfx900" +// DEFAULT-NOT: "--device-compiler=amdgcn-amd-amdhsa=-O{{.*}}" +// O0-SAME: "--device-compiler=amdgcn-amd-amdhsa=-O0" +// O1-SAME: "--device-compiler=amdgcn-amd-amdhsa=-O1" +// O2-SAME: "--device-compiler=amdgcn-amd-amdhsa=-O2" +// O3-SAME: "--device-compiler=amdgcn-amd-amdhsa=-O3" +// Os-SAME: "--device-compiler=amdgcn-amd-amdhsa=-Os" +// Oz-SAME: "--device-compiler=amdgcn-amd-amdhsa=-Oz" +// Og-SAME: "--device-compiler=amdgcn-amd-amdhsa=-Og" +// O0-CGO2-SAME: "--device-compiler=amdgcn-amd-amdhsa=-O0" diff --git a/clang/test/Driver/hipspv-link-static-library.hip b/clang/test/Driver/hipspv-link-static-library.hip index 03126ae589a09..49365cb75adca 100644 --- a/clang/test/Driver/hipspv-link-static-library.hip +++ b/clang/test/Driver/hipspv-link-static-library.hip @@ -9,13 +9,13 @@ // Test that -l options are passed to llvm-link for --offload=spirv64 // RUN: %clang -### --target=x86_64-linux-gnu --offload=spirv64 \ -// RUN: --hip-path=%S/Inputs/hipspv -nohipwrapperinc %s \ +// RUN: --no-offload-new-driver --hip-path=%S/Inputs/hipspv -nohipwrapperinc %s \ // RUN: -L%t -lSDL \ // RUN: 2>&1 | FileCheck -check-prefix=SDL-LINK %s // Test that .a files are properly unbundled and passed to llvm-link // RUN: %clang -### --target=x86_64-linux-gnu --offload=spirv64 \ -// RUN: --hip-path=%S/Inputs/hipspv -nohipwrapperinc %s \ +// RUN: --no-offload-new-driver --hip-path=%S/Inputs/hipspv -nohipwrapperinc %s \ // RUN: %t/libSDL.a \ // RUN: 2>&1 | FileCheck -check-prefix=SDL-ARCHIVE %s diff --git a/clang/test/Driver/hipspv-pass-plugin.hip b/clang/test/Driver/hipspv-pass-plugin.hip index fc3c64b057352..de6e07b57bd6f 100644 --- a/clang/test/Driver/hipspv-pass-plugin.hip +++ b/clang/test/Driver/hipspv-pass-plugin.hip @@ -1,19 +1,19 @@ // UNSUPPORTED: system-windows // RUN: %clang -### -target x86_64-linux-gnu --offload=spirv64 \ -// RUN: --hip-path=%S/Inputs/hipspv -nogpuinc %s \ +// RUN: --no-offload-new-driver --hip-path=%S/Inputs/hipspv -nogpuinc %s \ // RUN: 2>&1 | FileCheck --check-prefixes=FROM-HIP-PATH %s // RUN: %clang -### -target x86_64-linux-gnu --offload=spirv64 \ -// RUN: -nogpuinc -nogpulib --hipspv-pass-plugin=%S/Inputs/pass-plugin.so %s \ +// RUN: --no-offload-new-driver -nogpuinc -nogpulib --hipspv-pass-plugin=%S/Inputs/pass-plugin.so %s \ // RUN: 2>&1 | FileCheck --check-prefixes=FROM-OPTION %s // RUN: not %clang -### --target=x86_64-linux-gnu --offload=spirv64 \ -// RUN: -nogpuinc -nogpulib --hipspv-pass-plugin=foo.so %s \ +// RUN: --no-offload-new-driver -nogpuinc -nogpulib --hipspv-pass-plugin=foo.so %s \ // RUN: 2>&1 | FileCheck --check-prefixes=FROM-OPTION-INVALID %s // RUN: %clang -### -target x86_64-linux-gnu --offload=spirv64 \ -// RUN: -nogpuinc -nogpulib %s \ +// RUN: --no-offload-new-driver -nogpuinc -nogpulib %s \ // RUN: 2>&1 | FileCheck --check-prefixes=NO-PLUGIN %s // FROM-HIP-PATH: {{".*opt"}} {{".*.bc"}} "-load-pass-plugin" diff --git a/clang/test/Driver/hipspv-toolchain.hip b/clang/test/Driver/hipspv-toolchain.hip index 3c175ebf433cc..76997a27e4065 100644 --- a/clang/test/Driver/hipspv-toolchain.hip +++ b/clang/test/Driver/hipspv-toolchain.hip @@ -41,7 +41,7 @@ // RUN: && chmod +x %t/versioned/llvm-spirv-%llvm-version-major // RUN: env "PATH=%t/versioned" %clang -### -target x86_64-linux-gnu \ // RUN: --offload=spirv64 --hip-path=%S/Inputs/hipspv -nohipwrapperinc \ -// RUN: %s 2>&1 \ +// RUN: --no-offload-new-driver %s 2>&1 \ // RUN: | FileCheck -DVERSION=%llvm-version-major \ // RUN: --check-prefix=VERSIONED %s diff --git a/clang/unittests/Tooling/ToolingTest.cpp b/clang/unittests/Tooling/ToolingTest.cpp index 25e1d67eb2294..53b5140fdbdb6 100644 --- a/clang/unittests/Tooling/ToolingTest.cpp +++ b/clang/unittests/Tooling/ToolingTest.cpp @@ -443,9 +443,9 @@ TEST_F(CommandLineExtractorTest, AcceptOffloadingCompile) { TEST_F(CommandLineExtractorTest, AcceptOffloadingSyntaxOnly) { addFile("test.c", "int main() {}\n"); const char *Args[] = { - "clang", "-target", "arm64-apple-macosx11.0.0", - "-fsyntax-only", "-x", "hip", - "test.c", "-nogpulib", "-nogpuinc"}; + "clang", "-target", "arm64-apple-macosx11.0.0", "-fsyntax-only", + "-x", "hip", "--no-offload-new-driver", "test.c", + "-nogpulib", "-nogpuinc"}; EXPECT_NE(extractCC1Arguments(Args), nullptr); } From 8e208601782648fe7593feaae510a1f0e9e66286 Mon Sep 17 00:00:00 2001 From: Joseph Huber Date: Wed, 22 Oct 2025 09:46:29 -0500 Subject: [PATCH 2/3] [HIP] Hack around CMake incorrectly parsing OpenMP support in HIP mode (#164482) Summary: The new driver uses an embedded clang job to handle the device compilation. This correctly returns the linker as being `ld.lld`. The CMake parser to detect things like OpenMP support in the linker will parse the output of `-v` for the linker job. If the user is also using LLD for their linker, it will think this job is the linker and then fail as it does not see the required libraries. For these special HIP compilations, just print the linker wrapper invocation and nothing else. This will still show users the steps used to generate the binary but it will hack around this issue. --- clang/lib/Driver/ToolChains/Clang.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index 1ca8104d7fb99..9d470782befaa 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -9263,6 +9263,9 @@ void LinkerWrapper::ConstructJob(Compilation &C, const JobAction &JA, }; auto ShouldForward = [&](const llvm::DenseSet &Set, Arg *A, const ToolChain &TC) { + // CMake hack to avoid printing verbose informatoin for HIP non-RDC mode. + if (A->getOption().matches(OPT_v) && JA.getType() == types::TY_Object) + return false; return (Set.contains(A->getOption().getID()) || (A->getOption().getGroup().isValid() && Set.contains(A->getOption().getGroup().getID()))) && @@ -9360,7 +9363,12 @@ void LinkerWrapper::ConstructJob(Compilation &C, const JobAction &JA, CmdArgs.push_back( Args.MakeArgString("--host-triple=" + getToolChain().getTripleString())); - if (Args.hasArg(options::OPT_v)) + + // CMake hack, suppress passing verbose arguments for the special-case HIP + // non-RDC mode compilation. This confuses default CMake implicit linker + // argument parsing when the language is set to HIP and the system linker is + // also `ld.lld`. + if (Args.hasArg(options::OPT_v) && JA.getType() != types::TY_Object) CmdArgs.push_back("--wrapper-verbose"); if (Arg *A = Args.getLastArg(options::OPT_cuda_path_EQ)) CmdArgs.push_back( From 051b2c8ae7d675dbdd0cb9173b292d9749609dd1 Mon Sep 17 00:00:00 2001 From: Jacob Lambert Date: Tue, 4 Nov 2025 23:35:44 -0800 Subject: [PATCH 3/3] switch back to clang-offload-packager --- clang/test/Driver/cuda-arch-translation.cu | 2 +- clang/test/Driver/dep-file-flag-with-multiple-offload-archs.hip | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/clang/test/Driver/cuda-arch-translation.cu b/clang/test/Driver/cuda-arch-translation.cu index 65234d091efd7..232a2bb1114e3 100644 --- a/clang/test/Driver/cuda-arch-translation.cu +++ b/clang/test/Driver/cuda-arch-translation.cu @@ -66,7 +66,7 @@ // CUDA-SAME: -m64 // CUDA: fatbinary -// HIP: llvm-offload-binary +// HIP: clang-offload-packager // SM20:--image3=kind=elf,sm=20{{.*}} // SM21:--image3=kind=elf,sm=21{{.*}} diff --git a/clang/test/Driver/dep-file-flag-with-multiple-offload-archs.hip b/clang/test/Driver/dep-file-flag-with-multiple-offload-archs.hip index a73587d77d679..557f6925d23f9 100644 --- a/clang/test/Driver/dep-file-flag-with-multiple-offload-archs.hip +++ b/clang/test/Driver/dep-file-flag-with-multiple-offload-archs.hip @@ -3,7 +3,7 @@ // CHECK-NOT: {{.*}}clang{{.*}}"-target-cpu" "gfx1030"{{.*}}"-dependency-file" "tmp.d" // CHECK-NOT: {{.*}}clang{{.*}}"-target-cpu" "gfx1100"{{.*}}"-dependency-file" "tmp.d" // CHECK-NOT: {{.*}}clang{{.*}}"-target-cpu" "gfx1101"{{.*}}"-dependency-file" "tmp.d" -// CHECK: {{.*}}llvm-offload-binary +// CHECK: {{.*}}clang-offload-packager // CHECK: {{.*}}clang{{.*}}"-target-cpu"{{.*}}"-dependency-file" "tmp.d" void main(){}