Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 42 additions & 0 deletions clang/test/Driver/clang-linker-wrapper-sycl-link.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
// Test that clang-linker-wrapper correctly invokes clang-sycl-linker when --use-clang-sycl-linker is enabled
Copy link
Copy Markdown
Contributor

@YuriPlyakhin YuriPlyakhin May 13, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this test looks similiar to the one I see in community: https://github.com/llvm/llvm-project/blob/main/clang/test/Driver/linker-wrapper.c

Other similar tests that are programming-model or target specific:

https://github.com/llvm/llvm-project/blob/main/clang/test/Driver/linker-wrapper-hip-amdgcnspirv.c

https://github.com/llvm/llvm-project/blob/e721580311e3988e767ec3aaa06bce025f72ff7e/clang/test/Driver/hipspv-toolchain.hip#L55

Do you think it would be possible to add test like you wrote here to community first aligned with naming and style? (like linker-wrapper-sycl.cpp), and then add modifications in downstream on top of what is in upstream?

I want to minimize our back-and-forth between downstream and community and submit to community first if that makes sense.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do you think it would be possible to add test like you wrote here to community first aligned with naming and style? (like linker-wrapper-sycl.cpp), and then add modifications in downstream on top of what is in upstream?

--use-clang-sycl-linker is a temporary downstream-only transition flag and won't be upstreamed.
The test is specifically for --use-clang-sycl-linker's behavior (dispatching to clang -fsycl --sycl-link), so there's no meaningful upstream test to write at this point.
Once we complete the migration and remove --use-clang-sycl-linker, I can submit an upstream SYCL test for (CLW invoking clang + fsycl + --sycl-link) that aligns with community naming standards.

//
// REQUIRES: spirv-registered-target
//
// Create SYCL offload object file
// RUN: %clangxx -fsycl --offload-new-driver -fsycl-targets=spir64-unknown-unknown -c %s -o %t.o
//
// Test that clang-sycl-linker is invoked with basic options
// RUN: clang-linker-wrapper --dry-run --use-clang-sycl-linker \
// RUN: --linker-path=/usr/bin/ld --host-triple=x86_64-unknown-linux-gnu \
// RUN: %t.o -o %t.out 2>&1 \
// RUN: | FileCheck %s --check-prefix=CHECK-BASIC
// CHECK-BASIC: clang{{.*}}-fsycl --sycl-link
// CHECK-BASIC-SAME: -Xlinker --triple=spir64-unknown-unknown
//
// Test that --save-temps is forwarded
// RUN: clang-linker-wrapper --dry-run --use-clang-sycl-linker --save-temps \
// RUN: --linker-path=/usr/bin/ld --host-triple=x86_64-unknown-linux-gnu \
// RUN: %t.o -o %t.out 2>&1 \
// RUN: | FileCheck %s --check-prefix=CHECK-SAVE-TEMPS
// CHECK-SAVE-TEMPS: clang{{.*}}-fsycl --sycl-link
// CHECK-SAVE-TEMPS-SAME: -Xlinker --save-temps
//
// Test that device compiler options are forwarded
// RUN: clang-linker-wrapper --dry-run --use-clang-sycl-linker \
// RUN: --linker-path=/usr/bin/ld --host-triple=x86_64-unknown-linux-gnu \
// RUN: --device-compiler=sycl:spir64-unknown-unknown=-my-backend-opt \
// RUN: %t.o -o %t.out 2>&1 \
// RUN: | FileCheck %s --check-prefix=CHECK-DEVICE-COMPILER
// CHECK-DEVICE-COMPILER: clang{{.*}}-fsycl --sycl-link
// CHECK-DEVICE-COMPILER-SAME: -Xlinker --device-compiler=sycl:spir64-unknown-unknown=-my-backend-opt
//
// Test that device linker options are forwarded
// RUN: clang-linker-wrapper --dry-run --use-clang-sycl-linker \
// RUN: --linker-path=/usr/bin/ld --host-triple=x86_64-unknown-linux-gnu \
// RUN: --device-linker=sycl:spir64-unknown-unknown=-my-linker-opt \
// RUN: %t.o -o %t.out 2>&1 \
// RUN: | FileCheck %s --check-prefix=CHECK-DEVICE-LINKER
// CHECK-DEVICE-LINKER: clang{{.*}}-fsycl --sycl-link
// CHECK-DEVICE-LINKER-SAME: -Xlinker --device-linker=sycl:spir64-unknown-unknown=-my-linker-opt

int foo() { return 42; }
125 changes: 125 additions & 0 deletions clang/test/Driver/sycl-linker-wrapper-options.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
// Tests that clang driver correctly forwards options to clang-linker-wrapper
// for SYCL offload compilation.
//
// REQUIRES: spirv-registered-target
//
// RUN: %clangxx -fsycl --offload-new-driver -fsycl-targets=spir64-unknown-unknown -c %s -o %t_1.o
// RUN: %clangxx -fsycl --offload-new-driver -fsycl-targets=spir64-unknown-unknown -c %s -o %t_2.o
//
// Test that --use-clang-sycl-linker is not passed by default.
// RUN: %clangxx -### -fsycl --offload-new-driver -fsycl-targets=spir64-unknown-unknown \
// RUN: %t_1.o 2>&1 | FileCheck %s --check-prefix=CHECK-DEFAULT
// CHECK-DEFAULT: clang-linker-wrapper
// CHECK-DEFAULT-NOT: "--use-clang-sycl-linker"
//
// Test that driver options are correctly passed through clang-linker-wrapper.
// RUN: %clangxx -### -fsycl --offload-new-driver -fsycl-targets=spir64-unknown-unknown \
// RUN: -Xsycl-target-backend=spir64-unknown-unknown "-backend-opt" \
// RUN: %t_1.o %t_2.o 2>&1 | FileCheck %s --check-prefix=CHECK-BACKEND-OPT
// CHECK-BACKEND-OPT: clang-linker-wrapper{{.*}} "--device-compiler=sycl:spir64-unknown-unknown=-backend-opt"
//
// Test multiple backend options.
// RUN: %clangxx -### -fsycl --offload-new-driver -fsycl-targets=spir64-unknown-unknown \
// RUN: -Xsycl-target-backend=spir64-unknown-unknown "-opt1 -opt2" \
// RUN: %t_1.o %t_2.o 2>&1 | FileCheck %s --check-prefix=CHECK-MULTI-OPTS
// CHECK-MULTI-OPTS: clang-linker-wrapper{{.*}} "--device-compiler=sycl:spir64-unknown-unknown=-opt1 -opt2"
//
// Test linker options are forwarded.
// RUN: %clangxx -### -fsycl --offload-new-driver -fsycl-targets=spir64-unknown-unknown \
// RUN: -Xsycl-target-linker=spir64-unknown-unknown "-linker-opt" \
// RUN: %t_1.o %t_2.o 2>&1 | FileCheck %s --check-prefix=CHECK-LINKER-OPT
// CHECK-LINKER-OPT: clang-linker-wrapper{{.*}} "--device-linker=sycl:spir64-unknown-unknown=-linker-opt"
//
// Test both backend and linker options together.
// RUN: %clangxx -### -fsycl --offload-new-driver -fsycl-targets=spir64-unknown-unknown \
// RUN: -Xsycl-target-backend=spir64-unknown-unknown "-backend-opt" \
// RUN: -Xsycl-target-linker=spir64-unknown-unknown "-linker-opt" \
// RUN: %t_1.o %t_2.o 2>&1 | FileCheck %s --check-prefix=CHECK-BOTH-OPTS
// CHECK-BOTH-OPTS: clang-linker-wrapper{{.*}} "--device-compiler=sycl:spir64-unknown-unknown=-backend-opt"
// CHECK-BOTH-OPTS-SAME: "--device-linker=sycl:spir64-unknown-unknown=-linker-opt"
//
// Test AOT GPU with backend options.
// RUN: %clangxx -### -fsycl --offload-new-driver -fsycl-targets=spir64_gen-unknown-unknown \
// RUN: -Xsycl-target-backend=spir64_gen "-device pvc" \
// RUN: %t_1.o %t_2.o 2>&1 | FileCheck %s --check-prefix=CHECK-AOT-GPU
// CHECK-AOT-GPU: clang-linker-wrapper{{.*}} "--device-compiler=sycl:spir64_gen-unknown-unknown=-device pvc"
//
// Test AOT CPU with backend options.
// RUN: %clangxx -### -fsycl --offload-new-driver -fsycl-targets=spir64_x86_64-unknown-unknown \
// RUN: -Xsycl-target-backend=spir64_x86_64 "-march=skylake" \
// RUN: %t_1.o %t_2.o 2>&1 | FileCheck %s --check-prefix=CHECK-AOT-CPU
// CHECK-AOT-CPU: clang-linker-wrapper{{.*}} "--device-compiler=sycl:spir64_x86_64-unknown-unknown=-march=skylake"
//
// Test multi-target with target-specific options (both in same invocation).
// RUN: %clangxx -### -fsycl --offload-new-driver \
// RUN: -fsycl-targets=spir64_gen-unknown-unknown,spir64_x86_64-unknown-unknown \
// RUN: -Xsycl-target-backend=spir64_gen "-device pvc" \
// RUN: -Xsycl-target-backend=spir64_x86_64 "-march=skylake" \
// RUN: %t_1.o %t_2.o 2>&1 | FileCheck %s --check-prefix=CHECK-MULTI-TARGET
// CHECK-MULTI-TARGET: clang-linker-wrapper{{.*}} "--device-compiler=sycl:spir64_gen-unknown-unknown=-device pvc"
// CHECK-MULTI-TARGET-SAME: "--device-compiler=sycl:spir64_x86_64-unknown-unknown=-march=skylake"
//
// Test that --use-clang-sycl-linker flag is properly forwarded.
// RUN: %clangxx -### -fsycl --offload-new-driver -fsycl-targets=spir64-unknown-unknown \
// RUN: -Xlinker --use-clang-sycl-linker \
// RUN: %t_1.o %t_2.o 2>&1 | FileCheck %s --check-prefix=CHECK-USE-CSL
// CHECK-USE-CSL: clang-linker-wrapper{{.*}} "--use-clang-sycl-linker"
//
// Test that backend options are forwarded when using clang-sycl-linker.
// RUN: %clangxx -### -fsycl --offload-new-driver -fsycl-targets=spir64-unknown-unknown \
// RUN: -Xlinker --use-clang-sycl-linker \
// RUN: -Xsycl-target-backend=spir64-unknown-unknown "-backend-opt" \
// RUN: %t_1.o %t_2.o 2>&1 | FileCheck %s --check-prefix=CHECK-CSL-BACKEND
// CHECK-CSL-BACKEND: clang-linker-wrapper{{.*}} "--device-compiler=sycl:spir64-unknown-unknown=-backend-opt"{{.*}} "--use-clang-sycl-linker"
//
// Test that linker options are forwarded when using clang-sycl-linker.
// RUN: %clangxx -### -fsycl --offload-new-driver -fsycl-targets=spir64-unknown-unknown \
// RUN: -Xlinker --use-clang-sycl-linker \
// RUN: -Xsycl-target-linker=spir64-unknown-unknown "-linker-opt" \
// RUN: %t_1.o %t_2.o 2>&1 | FileCheck %s --check-prefix=CHECK-CSL-LINKER
// CHECK-CSL-LINKER: clang-linker-wrapper{{.*}} "--device-linker=sycl:spir64-unknown-unknown=-linker-opt"{{.*}} "--use-clang-sycl-linker"
//
// Test that both backend and linker options work together with clang-sycl-linker.
// RUN: %clangxx -### -fsycl --offload-new-driver -fsycl-targets=spir64-unknown-unknown \
// RUN: -Xlinker --use-clang-sycl-linker \
// RUN: -Xsycl-target-backend=spir64-unknown-unknown "-backend-opt" \
// RUN: -Xsycl-target-linker=spir64-unknown-unknown "-linker-opt" \
// RUN: %t_1.o %t_2.o 2>&1 | FileCheck %s --check-prefix=CHECK-CSL-BOTH
// CHECK-CSL-BOTH: clang-linker-wrapper{{.*}} "--device-compiler=sycl:spir64-unknown-unknown=-backend-opt"{{.*}} "--device-linker=sycl:spir64-unknown-unknown=-linker-opt"{{.*}} "--use-clang-sycl-linker"
//
// Test AOT GPU with clang-sycl-linker.
// RUN: %clangxx -### -fsycl --offload-new-driver -fsycl-targets=spir64_gen-unknown-unknown \
// RUN: -Xlinker --use-clang-sycl-linker \
// RUN: -Xsycl-target-backend=spir64_gen "-device pvc" \
// RUN: %t_1.o %t_2.o 2>&1 | FileCheck %s --check-prefix=CHECK-CSL-AOT-GPU
// CHECK-CSL-AOT-GPU: clang-linker-wrapper{{.*}} "--device-compiler=sycl:spir64_gen-unknown-unknown=-device pvc"{{.*}} "--use-clang-sycl-linker"
//
// Test AOT CPU with clang-sycl-linker.
// RUN: %clangxx -### -fsycl --offload-new-driver -fsycl-targets=spir64_x86_64-unknown-unknown \
// RUN: -Xlinker --use-clang-sycl-linker \
// RUN: -Xsycl-target-backend=spir64_x86_64 "-march=skylake" \
// RUN: %t_1.o %t_2.o 2>&1 | FileCheck %s --check-prefix=CHECK-CSL-AOT-CPU
// CHECK-CSL-AOT-CPU: clang-linker-wrapper{{.*}} "--device-compiler=sycl:spir64_x86_64-unknown-unknown=-march=skylake"{{.*}} "--use-clang-sycl-linker"
//
// Test multi-target with clang-sycl-linker.
// RUN: %clangxx -### -fsycl --offload-new-driver \
// RUN: -fsycl-targets=spir64_gen-unknown-unknown,spir64_x86_64-unknown-unknown \
// RUN: -Xlinker --use-clang-sycl-linker \
// RUN: -Xsycl-target-backend=spir64_gen "-device pvc" \
// RUN: -Xsycl-target-backend=spir64_x86_64 "-march=skylake" \
// RUN: %t_1.o %t_2.o 2>&1 | FileCheck %s --check-prefix=CHECK-CSL-MULTI
// CHECK-CSL-MULTI: clang-linker-wrapper{{.*}} "--device-compiler=sycl:spir64_gen-unknown-unknown=-device pvc"{{.*}} "--device-compiler=sycl:spir64_x86_64-unknown-unknown=-march=skylake"{{.*}} "--use-clang-sycl-linker"
//
// Test that --save-temps is forwarded when using clang-sycl-linker.
// RUN: %clangxx -### -fsycl --offload-new-driver -fsycl-targets=spir64-unknown-unknown \
// RUN: -Xlinker --use-clang-sycl-linker -Xlinker --save-temps \
// RUN: %t_1.o %t_2.o 2>&1 | FileCheck %s --check-prefix=CHECK-CSL-SAVE-TEMPS
// CHECK-CSL-SAVE-TEMPS: clang-linker-wrapper{{.*}} "--use-clang-sycl-linker"{{.*}} "--save-temps"
//
// Test that --dry-run is forwarded when using clang-sycl-linker.
// RUN: %clangxx -### -fsycl --offload-new-driver -fsycl-targets=spir64-unknown-unknown \
// RUN: -Xlinker --use-clang-sycl-linker -Xlinker --dry-run \
// RUN: %t_1.o %t_2.o 2>&1 | FileCheck %s --check-prefix=CHECK-CSL-DRY
// CHECK-CSL-DRY: clang-linker-wrapper{{.*}} "--use-clang-sycl-linker"{{.*}} "--dry-run"

int foo() { return 42; }
Loading
Loading