blob: fada4a303042d79c9a65d99b0b0c65a83e0bb894 [file] [edit]
// REQUIRES: x86-registered-target
// Verify that -foffload-include-binary embeds the finalized SYCL device
// binary into the host module and emits the constructor that registers it with
// the SYCL runtime. Unregistration is done from 'atexit', so no global
// destructor is emitted for it.
// The binary is already finalized, so it must not land in ".llvm.offloading".
// RUN: echo -n 'FAKE_SYCL_DEVICE_IMAGE' > %t.bin
// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fsycl-is-host \
// RUN: -foffload-include-binary %t.bin -emit-llvm %s -o - \
// RUN: | FileCheck %s --implicit-check-not='.llvm.offloading' \
// RUN: --implicit-check-not='llvm.global_ctors.' \
// RUN: --implicit-check-not='llvm.global_dtors'
// The registration function has to merge into the constructor list the rest of
// the translation unit contributes to, so object emission must succeed for a
// translation unit that has its own static initializers.
// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fsycl-is-host \
// RUN: -foffload-include-binary %t.bin -emit-obj %s -o %t.o
// Without the flag no SYCL registration IR should be emitted.
// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fsycl-is-host \
// RUN: -emit-llvm %s -o - | FileCheck %s --check-prefix=NONE \
// RUN: --implicit-check-not='.sycl_offloading.binary' \
// RUN: --implicit-check-not='__sycl_register_lib' \
// RUN: --implicit-check-not='llvm.global_dtors'
// A missing binary file must be diagnosed.
// RUN: not %clang_cc1 -triple x86_64-unknown-linux-gnu -fsycl-is-host \
// RUN: -foffload-include-binary %t.does-not-exist -emit-llvm %s -o - 2>&1 \
// RUN: | FileCheck %s --check-prefix=ERROR
struct S {
S();
~S();
};
S s;
void f() {}
// CHECK: @.sycl_offloading.binary = internal unnamed_addr constant [22 x i8] c"FAKE_SYCL_DEVICE_IMAGE", section ".sycl_fatbin"
// CHECK: @llvm.global_ctors = appending global [2 x { i32, ptr, ptr }]
// CHECK-SAME: i32 65535, ptr @_GLOBAL__sub_I_
// CHECK-SAME: i32 101, ptr @sycl.descriptor_reg
// CHECK: define internal void @sycl.descriptor_reg()
// CHECK-NEXT: entry:
// CHECK-NEXT: call void @__sycl_register_lib(ptr @.sycl_offloading.binary, i64 22)
// CHECK-NEXT: call i32 @atexit(ptr @sycl.descriptor_unreg)
// CHECK-NEXT: ret void
// CHECK: define internal void @sycl.descriptor_unreg()
// CHECK-NEXT: entry:
// CHECK-NEXT: call void @__sycl_unregister_lib(ptr @.sycl_offloading.binary, i64 22)
// CHECK-NEXT: ret void
// NONE: @llvm.global_ctors = appending global [1 x { i32, ptr, ptr }]
// NONE-SAME: i32 65535, ptr @_GLOBAL__sub_I_
// NONE: define dso_local void @_Z1fv()
// ERROR: cannot open file '{{.*}}.does-not-exist'