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