|
3 | 3 | //
|
4 | 4 | // Generate .o file as linker wrapper input.
|
5 | 5 | //
|
6 |
| -// RUN: %clang -cc1 -fsycl-is-device -disable-llvm-passes -triple=spir64-unknown-unknown %s -emit-llvm-bc -o %t.device.bc |
| 6 | +// touch %t.device.bc |
7 | 7 | // RUN: clang-offload-packager -o %t.fat --image=file=%t.device.bc,kind=sycl,triple=spir64-unknown-unknown
|
8 | 8 | // RUN: %clang -cc1 %s -triple=x86_64-unknown-linux-gnu -emit-obj -o %t.o -fembed-offload-object=%t.fat
|
9 | 9 | //
|
|
12 | 12 | // RUN: touch %t.devicelib.cpp
|
13 | 13 | // RUN: %clang %t.devicelib.cpp -fsycl -fsycl-targets=spir64-unknown-unknown -c --offload-new-driver -o %t.devicelib.o
|
14 | 14 | //
|
15 |
| -// Run clang-linker-wrapper test |
| 15 | +// Run clang-linker-wrapper test and check the output of SYCL Offload Wrapping. |
16 | 16 | //
|
17 |
| -//// RUN: clang-linker-wrapper --print-wrapped-module --host-triple=x86_64-unknown-linux-gnu \ |
| 17 | +// RUN: clang-linker-wrapper --print-wrapped-module --dry-run --host-triple=x86_64-unknown-linux-gnu \ |
18 | 18 | // RUN: -sycl-device-libraries=%t.devicelib.o \
|
19 |
| -// RUN: -sycl-post-link-options="-split=auto -symbols -properties" %t.o -o %t.out 2>&1 --linker-path="/usr/bin/ld" | FileCheck %s |
20 |
| - |
21 |
| -template <typename t, typename Func> |
22 |
| -__attribute__((sycl_kernel)) void kernel(const Func &func) { |
23 |
| - func(); |
24 |
| -} |
25 |
| - |
26 |
| -extern "C" { |
27 |
| -// symbols so that linker find them and doesn't fail. |
28 |
| -void __sycl_register_lib(void *) {} |
29 |
| -void __sycl_unregister_lib(void *) {} |
30 |
| -} |
31 |
| - |
32 |
| -int main() { |
33 |
| - kernel<class fake_kernel>([](){}); |
34 |
| -} |
35 |
| - |
36 |
| -//#endif |
37 |
| - |
38 |
| -// CHECK-DAG: %_pi_device_binary_property_struct = type { ptr, ptr, i32, i64 } |
39 |
| -// CHECK-DAG: %_pi_device_binary_property_set_struct = type { ptr, ptr, ptr } |
40 |
| -// CHECK-DAG: %struct.__tgt_offload_entry = type { i64, i16, i16, i32, ptr, ptr, i64, i64, ptr } |
41 |
| -// CHECK-DAG: %__sycl.tgt_device_image = type { i16, i8, i8, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr } |
42 |
| -// CHECK-DAG: %__sycl.tgt_bin_desc = type { i16, i16, ptr, ptr, ptr } |
43 |
| - |
44 |
| -// CHECK-DAG: @.sycl_offloading.target.0 = internal unnamed_addr constant [7 x i8] c"spir64\00" |
45 |
| -// CHECK-DAG: @.sycl_offloading.opts.compile.0 = internal unnamed_addr constant [1 x i8] zeroinitializer |
46 |
| -// CHECK-DAG: @.sycl_offloading.opts.link.0 = internal unnamed_addr constant [1 x i8] zeroinitializer |
47 |
| -// CHECK-DAG: @prop = internal unnamed_addr constant [17 x i8] c"DeviceLibReqMask\00" |
48 |
| -// CHECK-DAG: @__sycl_offload_prop_sets_arr = internal constant [1 x %_pi_device_binary_property_struct] [%_pi_device_binary_property_struct { ptr @prop, ptr null, i32 1, i64 0 }] |
49 |
| -// CHECK-DAG: @SYCL_PropSetName = internal unnamed_addr constant [24 x i8] c"SYCL/devicelib req mask\00" |
50 |
| -// CHECK-DAG: @prop.1 = internal unnamed_addr constant [8 x i8] c"aspects\00" |
51 |
| -// CHECK-DAG: @prop_val = internal unnamed_addr constant [8 x i8] zeroinitializer |
52 |
| -// CHECK-DAG: @__sycl_offload_prop_sets_arr.2 = internal constant [1 x %_pi_device_binary_property_struct] [%_pi_device_binary_property_struct { ptr @prop.1, ptr @prop_val, i32 2, i64 8 }] |
53 |
| -// CHECK-DAG: @SYCL_PropSetName.3 = internal unnamed_addr constant [25 x i8] c"SYCL/device requirements\00" |
54 |
| -// CHECK-DAG: @SYCL_PropSetName.4 = internal unnamed_addr constant [22 x i8] c"SYCL/kernel param opt\00" |
55 |
| -// CHECK-DAG: @__sycl_offload_prop_sets_arr.5 = internal constant [3 x %_pi_device_binary_property_set_struct] [%_pi_device_binary_property_set_struct { ptr @SYCL_PropSetName, ptr @__sycl_offload_prop_sets_arr, ptr getelementptr ([1 x %_pi_device_binary_property_struct], ptr @__sycl_offload_prop_sets_arr, i64 0, i64 1) }, %_pi_device_binary_property_set_struct { ptr @SYCL_PropSetName.3, ptr @__sycl_offload_prop_sets_arr.2, ptr getelementptr ([1 x %_pi_device_binary_property_struct], ptr @__sycl_offload_prop_sets_arr.2, i64 0, i64 1) }, %_pi_device_binary_property_set_struct { ptr @SYCL_PropSetName.4, ptr null, ptr null }] |
56 |
| -// CHECK-DAG: @.sycl_offloading.0.data = internal unnamed_addr constant [912 x i8] |
57 |
| -// CHECK-DAG: @__sycl_offload_entry_name = internal unnamed_addr constant [25 x i8] c"_ZTSZ4mainE11fake_kernel\00" |
58 |
| -// CHECK-DAG: @__sycl_offload_entries_arr = internal constant [1 x %struct.__tgt_offload_entry] [%struct.__tgt_offload_entry { i64 0, i16 1, i16 4, i32 0, ptr null, ptr @__sycl_offload_entry_name, i64 0, i64 0, ptr null }] |
59 |
| -// CHECK-DAG: @.sycl_offloading.0.info = internal local_unnamed_addr constant [2 x i64] [i64 ptrtoint (ptr @.sycl_offloading.0.data to i64), i64 912], section ".tgtimg", align 16 |
60 |
| -// CHECK-DAG: @llvm.used = appending global [1 x ptr] [ptr @.sycl_offloading.0.info], section "llvm.metadata" |
61 |
| -// CHECK-DAG: @.sycl_offloading.device_images = internal unnamed_addr constant [1 x %__sycl.tgt_device_image] [%__sycl.tgt_device_image { i16 2, i8 4, i8 0, ptr @.sycl_offloading.target.0, ptr @.sycl_offloading.opts.compile.0, ptr @.sycl_offloading.opts.link.0, ptr null, ptr null, ptr @.sycl_offloading.0.data, ptr getelementptr ([912 x i8], ptr @.sycl_offloading.0.data, i64 0, i64 912), ptr @__sycl_offload_entries_arr, ptr getelementptr ([1 x %struct.__tgt_offload_entry], ptr @__sycl_offload_entries_arr, i64 0, i64 1), ptr @__sycl_offload_prop_sets_arr.5, ptr getelementptr ([3 x %_pi_device_binary_property_set_struct], ptr @__sycl_offload_prop_sets_arr.5, i64 0, i64 3) }] |
62 |
| -// CHECK-DAG: @.sycl_offloading.descriptor = internal constant %__sycl.tgt_bin_desc { i16 1, i16 1, ptr @.sycl_offloading.device_images, ptr null, ptr null } |
63 |
| -// CHECK-DAG: @llvm.global_ctors = {{.*}} { i32 1, ptr @sycl.descriptor_reg, ptr null }] |
64 |
| -// CHECK-DAG: @llvm.global_dtors = {{.*}} { i32 1, ptr @sycl.descriptor_unreg, ptr null }] |
65 |
| - |
66 |
| -// CHECK: define internal void @sycl.descriptor_reg() section ".text.startup" { |
| 19 | +// RUN: %t.o -o %t.out 2>&1 --linker-path="/usr/bin/ld" | FileCheck %s |
| 20 | + |
| 21 | +// CHECK: %_pi_device_binary_property_struct = type { ptr, ptr, i32, i64 } |
| 22 | +// CHECK-NEXT: %_pi_device_binary_property_set_struct = type { ptr, ptr, ptr } |
| 23 | +// CHECK-NEXT: %struct.__tgt_offload_entry = type { i64, i16, i16, i32, ptr, ptr, i64, i64, ptr } |
| 24 | +// CHECK-NEXT: %__sycl.tgt_device_image = type { i16, i8, i8, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr } |
| 25 | +// CHECK-NEXT: %__sycl.tgt_bin_desc = type { i16, i16, ptr, ptr, ptr } |
| 26 | + |
| 27 | +// CHECK: @.sycl_offloading.target.0 = internal unnamed_addr constant [7 x i8] c"spir64\00" |
| 28 | +// CHECK-NEXT: @.sycl_offloading.opts.compile.0 = internal unnamed_addr constant [1 x i8] zeroinitializer |
| 29 | +// CHECK-NEXT: @.sycl_offloading.opts.link.0 = internal unnamed_addr constant [1 x i8] zeroinitializer |
| 30 | +// CHECK-NEXT: @prop = internal unnamed_addr constant [4 x i8] c"key\00" |
| 31 | +// CHECK-NEXT: @__sycl_offload_prop_sets_arr = internal constant [1 x %_pi_device_binary_property_struct] [%_pi_device_binary_property_struct { ptr @prop, ptr null, i32 1, i64 0 }] |
| 32 | +// CHECK-NEXT: @SYCL_PropSetName = internal unnamed_addr constant [25 x i8] c"SYCL/device requirements\00" |
| 33 | +// CHECK-NEXT: @__sycl_offload_prop_sets_arr.1 = internal constant [1 x %_pi_device_binary_property_set_struct] [%_pi_device_binary_property_set_struct { ptr @SYCL_PropSetName, ptr @__sycl_offload_prop_sets_arr, ptr getelementptr ([1 x %_pi_device_binary_property_struct], ptr @__sycl_offload_prop_sets_arr, i64 0, i64 1) }] |
| 34 | +// CHECK-NEXT: @.sycl_offloading.0.data = internal unnamed_addr constant [0 x i8] zeroinitializer, section "spir64" |
| 35 | +// CHECK-NEXT: @__sycl_offload_entry_name = internal unnamed_addr constant [7 x i8] c"entry1\00" |
| 36 | +// CHECK-NEXT: @__sycl_offload_entry_name.2 = internal unnamed_addr constant [7 x i8] c"entry2\00" |
| 37 | +// CHECK-NEXT: @__sycl_offload_entries_arr = internal constant [2 x %struct.__tgt_offload_entry] [%struct.__tgt_offload_entry { i64 0, i16 1, i16 4, i32 0, ptr null, ptr @__sycl_offload_entry_name, i64 0, i64 0, ptr null }, %struct.__tgt_offload_entry { i64 0, i16 1, i16 4, i32 0, ptr null, ptr @__sycl_offload_entry_name.2, i64 0, i64 0, ptr null }] |
| 38 | +// CHECK-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 |
| 39 | +// CHECK-NEXT: @llvm.used = appending global [1 x ptr] [ptr @.sycl_offloading.0.info], section "llvm.metadata" |
| 40 | +// CHECK-NEXT: @.sycl_offloading.device_images = internal unnamed_addr constant [1 x %__sycl.tgt_device_image] [%__sycl.tgt_device_image { i16 2, i8 4, i8 0, ptr @.sycl_offloading.target.0, ptr @.sycl_offloading.opts.compile.0, ptr @.sycl_offloading.opts.link.0, ptr null, ptr null, ptr @.sycl_offloading.0.data, ptr @.sycl_offloading.0.data, ptr @__sycl_offload_entries_arr, ptr getelementptr ([2 x %struct.__tgt_offload_entry], ptr @__sycl_offload_entries_arr, i64 0, i64 2), ptr @__sycl_offload_prop_sets_arr.1, ptr getelementptr ([1 x %_pi_device_binary_property_set_struct], ptr @__sycl_offload_prop_sets_arr.1, i64 0, i64 1) }] |
| 41 | +// CHECK-NEXT: @.sycl_offloading.descriptor = internal constant %__sycl.tgt_bin_desc { i16 1, i16 1, ptr @.sycl_offloading.device_images, ptr null, ptr null } |
| 42 | +// CHECK-NEXT: @llvm.global_ctors = appending global [1 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 1, ptr @sycl.descriptor_reg, ptr null }] |
| 43 | +// CHECK-NEXT: @llvm.global_dtors = appending global [1 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 1, ptr @sycl.descriptor_unreg, ptr null }] |
| 44 | + |
| 45 | +// CHECK: define internal void @sycl.descriptor_reg() section ".text.startup" { |
67 | 46 | // CHECK-NEXT: entry:
|
68 | 47 | // CHECK-NEXT: call void @__sycl_register_lib(ptr @.sycl_offloading.descriptor)
|
69 | 48 | // CHECK-NEXT: ret void
|
70 | 49 | // CHECK-NEXT: }
|
71 | 50 |
|
72 |
| -// CHECK: define internal void @sycl.descriptor_unreg() section ".text.startup" { |
| 51 | +// CHECK: define internal void @sycl.descriptor_unreg() section ".text.startup" { |
73 | 52 | // CHECK-NEXT: entry:
|
74 | 53 | // CHECK-NEXT: call void @__sycl_unregister_lib(ptr @.sycl_offloading.descriptor)
|
75 | 54 | // CHECK-NEXT: ret void
|
|
0 commit comments