From ffb3b4548560ed5a8e0eb5b1ed093a11ef2646dc Mon Sep 17 00:00:00 2001 From: Wenju He Date: Thu, 25 Jun 2026 02:37:41 +0200 Subject: [PATCH 1/3] [Clang][SYCL] Fix bundler target triple for SPIR-V in old offload model Upstream f8cb6be61b99 ("clang: Use the effective triple string for offload jobs") added FOUR_IDENT normalization in OffloadBundler::ConstructJob, causing SYCL SPIR-V device triples to be emitted in 4-component form (spir64-unknown-unknown-unknown) instead of the 3-component form (spir64-unknown-unknown) expected by the old offload model bundler. Skip FOUR_IDENT normalization for SYCL+SPIR/SPIRV targets in bundling jobs to preserve the 3-component triple format. Fixes - Driver/clang-offload-bundler-bc-archive-support-linux-old-model.cpp - Driver/sycl-no-rdc-fat-archive-old-model.cpp - Driver/sycl-offload-old-model.cpp - Driver/sycl-oneapi-gpu-intelgpu.cpp Co-Authored-By: Claude Sonnet 4.6 --- clang/lib/Driver/ToolChains/Clang.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index 969b278562b8..b90531d6f127 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -10312,9 +10312,13 @@ void OffloadBundler::ConstructJob(Compilation &C, const JobAction &JA, T.setArchName(ArchName); Triples += T.normalize(); } else { - Triples += llvm::Triple(CurTC->ComputeEffectiveClangTriple( - TCArgs, CurDep->getOffloadingArch())) - .normalize(llvm::Triple::CanonicalForm::FOUR_IDENT); + llvm::Triple EffTriple(CurTC->ComputeEffectiveClangTriple( + TCArgs, CurDep->getOffloadingArch())); + // SYCL old-model bundler uses 3-component triples for SPIR-V targets. + if (CurKind == Action::OFK_SYCL && EffTriple.isSPIROrSPIRV()) + Triples += EffTriple.normalize(); + else + Triples += EffTriple.normalize(llvm::Triple::CanonicalForm::FOUR_IDENT); } if (CurKind != Action::OFK_Host && !CurDep->getOffloadingArch().empty() && !TCArgs.hasArg(options::OPT_fno_bundle_offload_arch)) { From f5bd17ac2954df366fded80b9d073b8c63160640 Mon Sep 17 00:00:00 2001 From: Wenju He Date: Thu, 25 Jun 2026 03:20:43 +0200 Subject: [PATCH 2/3] [Clang][SYCL] Fix bundler target triple for NVPTX in old offload model Extend the FOUR_IDENT normalization skip (added in ffb3b454) to also cover SYCL NVPTX targets. Upstream f8cb6be61b99 caused bundling to emit nvptx64-nvidia-cuda-unknown (4-component) while unbundling still uses nvptx64-nvidia-cuda (3-component), breaking fat object round-trips. Fixes Driver/sycl-oneapi-gpu-nvidia.cpp NVIDIA_FATO/NVIDIA_CONSUME_FAT. Co-Authored-By: Claude Sonnet 4.6 --- clang/lib/Driver/ToolChains/Clang.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index b90531d6f127..07415ed3e328 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -10314,8 +10314,10 @@ void OffloadBundler::ConstructJob(Compilation &C, const JobAction &JA, } else { llvm::Triple EffTriple(CurTC->ComputeEffectiveClangTriple( TCArgs, CurDep->getOffloadingArch())); - // SYCL old-model bundler uses 3-component triples for SPIR-V targets. - if (CurKind == Action::OFK_SYCL && EffTriple.isSPIROrSPIRV()) + // SYCL old-model bundler uses 3-component triples for SPIR-V and NVPTX + // targets to match the triple format used during unbundling. + if (CurKind == Action::OFK_SYCL && + (EffTriple.isSPIROrSPIRV() || EffTriple.isNVPTX())) Triples += EffTriple.normalize(); else Triples += EffTriple.normalize(llvm::Triple::CanonicalForm::FOUR_IDENT); From 7c5906836a02bbc2232c1468f86986eee405b4ed Mon Sep 17 00:00:00 2001 From: Wenju He Date: Thu, 25 Jun 2026 12:31:05 +0200 Subject: [PATCH 3/3] fix sycl-offload-win-old-model.cpp --- clang/test/Driver/sycl-offload-win-old-model.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/clang/test/Driver/sycl-offload-win-old-model.cpp b/clang/test/Driver/sycl-offload-win-old-model.cpp index bf9087125c17..ce1019ee04d3 100644 --- a/clang/test/Driver/sycl-offload-win-old-model.cpp +++ b/clang/test/Driver/sycl-offload-win-old-model.cpp @@ -15,7 +15,7 @@ // RUN: | FileCheck %s -check-prefix=FOFFLOAD_STATIC_LIB // RUN: %clang_cl --target=x86_64-pc-windows-msvc -fsycl --no-offload-new-driver --no-offloadlib %t-orig.obj -### /link %t-orig.lib 2>&1 \ // RUN: | FileCheck %s -check-prefix=FOFFLOAD_STATIC_LIB -// FOFFLOAD_STATIC_LIB: clang-offload-bundler{{(.exe)?}}{{.+}} "-type=o" "-targets=host-x86_64-pc-windows-msvc,sycl-spir64-unknown-unknown" "-input={{.*}}-orig.obj" "-output={{.+}}.{{(o|obj)}}" "-output={{.+}}.{{(o|obj)}}" "-unbundle" +// FOFFLOAD_STATIC_LIB: clang-offload-bundler{{(.exe)?}}{{.+}} "-type=o" "-targets=host-x86_64-pc-windows-msvc{{[^,]*}},sycl-spir64-unknown-unknown" "-input={{.*}}-orig.obj" "-output={{.+}}.{{(o|obj)}}" "-output={{.+}}.{{(o|obj)}}" "-unbundle" // FOFFLOAD_STATIC_LIB: clang-offload-bundler{{(.exe)?}}{{.+}} "-type=aoo" "-targets=sycl-spir64-{{.+}}" "-input={{.*}}-orig.lib" "-output=[[OUTLIB:.+\.txt]]" "-unbundle" // FOFFLOAD_STATIC_LIB: llvm-foreach{{.*}} "--out-ext=txt" "--in-file-list=[[OUTLIB]]" "--in-replace=[[OUTLIB]]" "--out-file-list=[[OUTLIST:.+\.txt]]" "--out-replace=[[OUTLIST]]" "--" {{.*}}spirv-to-ir-wrapper{{.*}} "[[OUTLIB]]" "-o" "[[OUTLIST]]" // FOFFLOAD_STATIC_LIB: llvm-link{{(.exe)?}}{{.*}} "@[[OUTLIST]]" @@ -33,7 +33,7 @@ // RUN: | FileCheck %s -check-prefix=FOFFLOAD_STATIC_LIB2 // RUN: env LIB=%t_dir %clang_cl --target=x86_64-pc-windows-msvc -fsycl --no-offload-new-driver --no-offloadlib %t-orig.obj -### /link %basename_t-orig2.lib 2>&1 \ // RUN: | FileCheck %s -check-prefix=FOFFLOAD_STATIC_LIB2 -// FOFFLOAD_STATIC_LIB2: clang-offload-bundler{{(.exe)?}}{{.+}} "-type=o" "-targets=host-x86_64-pc-windows-msvc,sycl-spir64-unknown-unknown" "-input={{.*}}-orig.obj" "-output={{.+}}.{{(o|obj)}}" "-output={{.+}}.{{(o|obj)}}" "-unbundle" +// FOFFLOAD_STATIC_LIB2: clang-offload-bundler{{(.exe)?}}{{.+}} "-type=o" "-targets=host-x86_64-pc-windows-msvc{{[^,]*}},sycl-spir64-unknown-unknown" "-input={{.*}}-orig.obj" "-output={{.+}}.{{(o|obj)}}" "-output={{.+}}.{{(o|obj)}}" "-unbundle" // FOFFLOAD_STATIC_LIB2: clang-offload-bundler{{(.exe)?}}{{.+}} "-type=aoo" "-targets=sycl-spir64-{{.+}}" "-input={{.*}}-orig2.lib" "-output=[[OUTLIB:.+\.txt]]" "-unbundle" // FOFFLOAD_STATIC_LIB2: llvm-foreach{{.*}} "--out-ext=txt" "--in-file-list=[[OUTLIB]]" "--in-replace=[[OUTLIB]]" "--out-file-list=[[OUTLIST:.+\.txt]]" "--out-replace=[[OUTLIST]]" "--" {{.*}}spirv-to-ir-wrapper{{.*}} "[[OUTLIB]]" "-o" "[[OUTLIST]]" // FOFFLOAD_STATIC_LIB2: llvm-link{{(.exe)?}}{{.*}} "@[[OUTLIST]]" @@ -122,7 +122,7 @@ // RUN: %clang_cl --target=x86_64-pc-windows-msvc -fsycl --no-offload-new-driver -P %s -### 2>&1 | FileCheck -check-prefix=FSYCL_P %s // FSYCL_P: clang{{.*}} "-cc1" "-triple" "spir64-unknown-unknown" {{.*}} "-E" {{.*}} "-o" "[[DEVICEPP:.+\.ii]]" // FSYCL_P: clang{{.*}} "-cc1" "-triple" "x86_64-pc-windows-msvc{{.*}}" {{.*}} "-E" {{.*}} "-o" "[[HOSTPP:.+\.ii]]"{{.*}} -// FSYCL_P: clang-offload-bundler{{.*}} "-type=ii" "-targets=sycl-spir64-unknown-unknown,host-x86_64-pc-windows-msvc" {{.*}} "-input=[[DEVICEPP]]" "-input=[[HOSTPP]]" +// FSYCL_P: clang-offload-bundler{{.*}} "-type=ii" "-targets=sycl-spir64-unknown-unknown,host-x86_64-pc-windows-msvc{{[^"]*}}" {{.*}} "-input=[[DEVICEPP]]" "-input=[[HOSTPP]]" // RUN: touch %t-orig.lib // RUN: %clang_cl --target=x86_64-pc-windows-msvc -fsycl --no-offload-new-driver %t-orig.lib %s -### /link -out:force_out_file 2>&1 \