[clang] [llvm] [SYCL] Add offload wrapping for SYCL kind. (PR #147508)

2025-07-08 Thread Maksim Sabianin via cfe-commits

https://github.com/maksimsab created 
https://github.com/llvm/llvm-project/pull/147508

None

>From 524da07f8449154a40796c5734d674df64e3f9af Mon Sep 17 00:00:00 2001
From: "Sabianin, Maksim" 
Date: Mon, 7 Jul 2025 08:30:12 -0700
Subject: [PATCH] [SYCL] Add offload wrapping for SYCL kind.

---
 clang/test/Driver/linker-wrapper-image.c  |  35 ++
 clang/test/Driver/linker-wrapper.c|   2 +-
 .../tools/clang-linker-wrapper/CMakeLists.txt |   1 +
 .../ClangLinkerWrapper.cpp|  41 +-
 .../llvm/Frontend/SYCL/OffloadWrapper.h   |  44 ++
 llvm/include/llvm/Object/OffloadBinary.h  |   9 +-
 llvm/lib/Frontend/CMakeLists.txt  |   1 +
 llvm/lib/Frontend/SYCL/CMakeLists.txt |  14 +
 llvm/lib/Frontend/SYCL/OffloadWrapper.cpp | 513 ++
 llvm/lib/Object/OffloadBinary.cpp |  11 +
 llvm/unittests/Object/OffloadingTest.cpp  |   9 +
 11 files changed, 675 insertions(+), 5 deletions(-)
 create mode 100644 llvm/include/llvm/Frontend/SYCL/OffloadWrapper.h
 create mode 100644 llvm/lib/Frontend/SYCL/CMakeLists.txt
 create mode 100644 llvm/lib/Frontend/SYCL/OffloadWrapper.cpp

diff --git a/clang/test/Driver/linker-wrapper-image.c 
b/clang/test/Driver/linker-wrapper-image.c
index c0de56d58196a..67bb21bfe49b4 100644
--- a/clang/test/Driver/linker-wrapper-image.c
+++ b/clang/test/Driver/linker-wrapper-image.c
@@ -1,6 +1,7 @@
 // REQUIRES: x86-registered-target
 // REQUIRES: nvptx-registered-target
 // REQUIRES: amdgpu-registered-target
+// REQUIRES: spirv-registered-target
 
 // RUN: %clang -cc1 %s -triple x86_64-unknown-linux-gnu -emit-obj -o %t.elf.o
 
@@ -263,3 +264,37 @@
 //  HIP: while.end:
 // HIP-NEXT:   ret void
 // HIP-NEXT: }
+
+// RUN: clang-offload-packager -o %t.out 
--image=file=%t.elf.o,kind=sycl,triple=spirv64-unknown-unknown,arch=generic
+// RUN: %clang -cc1 %s -triple x86_64-unknown-linux-gnu -emit-obj -o %t.o \
+// RUN:   -fembed-offload-object=%t.out
+// RUN: clang-linker-wrapper --print-wrapped-module --dry-run 
--host-triple=x86_64-unknown-linux-gnu \
+// RUN:   --linker-path=/usr/bin/ld %t.o -o a.out 2>&1 | FileCheck %s 
--check-prefixes=SYCL
+// RUN: clang-linker-wrapper --print-wrapped-module --dry-run 
--host-triple=x86_64-unknown-linux-gnu -r \
+// RUN:   --linker-path=/usr/bin/ld %t.o -o a.out 2>&1 | FileCheck %s 
--check-prefixes=SYCL
+
+//  SYCL: %__sycl.tgt_device_image = type { i16, i8, i8, ptr, ptr, ptr, 
ptr, ptr, ptr, ptr, ptr, ptr }
+// SYCL-NEXT: %__sycl.tgt_bin_desc = type { i16, i16, ptr, ptr, ptr }
+
+//  SYCL: @.sycl_offloading.target.0 = internal unnamed_addr constant [1 x 
i8] zeroinitializer
+// SYCL-NEXT: @.sycl_offloading.opts.compile.0 = internal unnamed_addr 
constant [1 x i8] zeroinitializer
+// SYCL-NEXT: @.sycl_offloading.opts.link.0 = internal unnamed_addr constant 
[1 x i8] zeroinitializer
+// SYCL-NEXT: @.sycl_offloading.0.data = internal unnamed_addr constant [0 x 
i8] zeroinitializer
+// SYCL-NEXT: @.sycl_offloading.0.info = internal local_unnamed_addr constant 
[2 x i64] [i64 ptrtoint (ptr @.sycl_offloading.0.data to i64), i64 0], section 
".tgtimg", align 16
+// SYCL-NEXT: @llvm.used = appending global [1 x ptr] [ptr 
@.sycl_offloading.0.info], section "llvm.metadata"
+// SYCL-NEXT: @.sycl_offloading.device_images = internal unnamed_addr constant 
[1 x %__sycl.tgt_device_image] [%__sycl.tgt_device_image { i16 3, i8 8, i8 0, 
ptr @.sycl_offloading.target.0, ptr @.sycl_offloading.opts.compile.0, ptr 
@.sycl_offloading.opts.link.0, ptr @.sycl_offloading.0.data, ptr 
@.sycl_offloading.0.data, ptr null, ptr null, ptr null, ptr null }]
+// SYCL-NEXT: @.sycl_offloading.descriptor = internal constant 
%__sycl.tgt_bin_desc { i16 1, i16 1, ptr @.sycl_offloading.device_images, ptr 
null, ptr null }
+// SYCL-NEXT: @llvm.global_ctors = appending global [1 x { i32, ptr, ptr }] [{ 
i32, ptr, ptr } { i32 1, ptr @sycl.descriptor_reg, ptr null }]
+// SYCL-NEXT: @llvm.global_dtors = appending global [1 x { i32, ptr, ptr }] [{ 
i32, ptr, ptr } { i32 1, ptr @sycl.descriptor_unreg, ptr null }]
+
+//  SYCL: define internal void @sycl.descriptor_reg() section 
".text.startup" {
+// SYCL-NEXT: entry:
+// SYCL-NEXT:   call void @__sycl_register_lib(ptr 
@.sycl_offloading.descriptor)
+// SYCL-NEXT:   ret void
+// SYCL-NEXT: }
+
+//  SYCL: define internal void @sycl.descriptor_unreg() section 
".text.startup" {
+// SYCL-NEXT: entry:
+// SYCL-NEXT:   call void @__sycl_unregister_lib(ptr 
@.sycl_offloading.descriptor)
+// SYCL-NEXT:   ret void
+// SYCL-NEXT: }
diff --git a/clang/test/Driver/linker-wrapper.c 
b/clang/test/Driver/linker-wrapper.c
index 80b1a5745a123..5ab8a09660e57 100644
--- a/clang/test/Driver/linker-wrapper.c
+++ b/clang/test/Driver/linker-wrapper.c
@@ -54,7 +54,7 @@ __attribute__((visibility("protected"), used)) int x;
 // RUN: clang-offload-packager -o %t.out \
 // RUN:   
--image=file=%t.spirv.bc,kind=sycl,triple=spirv64-unknown-unknown,arch=generic
 // RUN: %clang -cc1 %s

[clang] [llvm] [SYCL] Add offload wrapping for SYCL kind. (PR #147508)

2025-07-10 Thread Maksim Sabianin via cfe-commits

maksimsab wrote:

Hi @jdoerfert @jhuber6 !

We are adding offload wrapping for SYCL in this PR. Do you have any suggestions 
for whom I should request for a code review?

https://github.com/llvm/llvm-project/pull/147508
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] [SYCL] Add offload wrapping for SYCL kind. (PR #147508)

2025-07-14 Thread Maksim Sabianin via cfe-commits


@@ -263,3 +264,37 @@
 //  HIP: while.end:
 // HIP-NEXT:   ret void
 // HIP-NEXT: }
+
+// RUN: clang-offload-packager -o %t.out 
--image=file=%t.elf.o,kind=sycl,triple=spirv64-unknown-unknown,arch=generic
+// RUN: %clang -cc1 %s -triple x86_64-unknown-linux-gnu -emit-obj -o %t.o \
+// RUN:   -fembed-offload-object=%t.out
+// RUN: clang-linker-wrapper --print-wrapped-module --dry-run 
--host-triple=x86_64-unknown-linux-gnu \
+// RUN:   --linker-path=/usr/bin/ld %t.o -o a.out 2>&1 | FileCheck %s 
--check-prefixes=SYCL
+// RUN: clang-linker-wrapper --print-wrapped-module --dry-run 
--host-triple=x86_64-unknown-linux-gnu -r \
+// RUN:   --linker-path=/usr/bin/ld %t.o -o a.out 2>&1 | FileCheck %s 
--check-prefixes=SYCL
+
+//  SYCL: %__sycl.tgt_device_image = type { i16, i8, i8, ptr, ptr, ptr, 
ptr, ptr, ptr, ptr, ptr, ptr }
+// SYCL-NEXT: %__sycl.tgt_bin_desc = type { i16, i16, ptr, ptr, ptr }
+
+//  SYCL: @.sycl_offloading.target.0 = internal unnamed_addr constant [1 x 
i8] zeroinitializer
+// SYCL-NEXT: @.sycl_offloading.opts.compile.0 = internal unnamed_addr 
constant [1 x i8] zeroinitializer
+// SYCL-NEXT: @.sycl_offloading.opts.link.0 = internal unnamed_addr constant 
[1 x i8] zeroinitializer
+// SYCL-NEXT: @.sycl_offloading.0.data = internal unnamed_addr constant [0 x 
i8] zeroinitializer
+// SYCL-NEXT: @.sycl_offloading.0.info = internal local_unnamed_addr constant 
[2 x i64] [i64 ptrtoint (ptr @.sycl_offloading.0.data to i64), i64 0], section 
".tgtimg", align 16
+// SYCL-NEXT: @llvm.used = appending global [1 x ptr] [ptr 
@.sycl_offloading.0.info], section "llvm.metadata"
+// SYCL-NEXT: @.sycl_offloading.device_images = internal unnamed_addr constant 
[1 x %__sycl.tgt_device_image] [%__sycl.tgt_device_image { i16 3, i8 8, i8 0, 
ptr @.sycl_offloading.target.0, ptr @.sycl_offloading.opts.compile.0, ptr 
@.sycl_offloading.opts.link.0, ptr @.sycl_offloading.0.data, ptr 
@.sycl_offloading.0.data, ptr null, ptr null, ptr null, ptr null }]
+// SYCL-NEXT: @.sycl_offloading.descriptor = internal constant 
%__sycl.tgt_bin_desc { i16 1, i16 1, ptr @.sycl_offloading.device_images, ptr 
null, ptr null }

maksimsab wrote:

`RUN` lines are copied from OpenMP and adjusted to SYCL case. Output's checks 
are copied from the `clang-linker-wrapper`'s output.

https://github.com/llvm/llvm-project/pull/147508
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [llvm] [SYCL] Add offload wrapping for SYCL kind. (PR #147508)

2025-07-14 Thread Maksim Sabianin via cfe-commits

maksimsab wrote:

@jhuber6
I had a choice to put it the common `OffloadWrapper.{h,cpp}` area. But SYCL's 
offload wrapping looks very different from others and I decided not to mix them 
together. Hence, I was choosing between 
`llvm/Frontend/Offloading/SYCLOffloadWrapper.h` and 
`llvm/Frontend/SYCL/OffloadWrapper.h`. If putting it together in 
`llvm/Frontend/Offloading/OffloadWrapper.h` looks better to you then I don't 
object to that.

https://github.com/llvm/llvm-project/pull/147508
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits