Skip to content

Commit 76051cc

Browse files
authored
[SYCL] Enable memcpy in libdevice (#3879)
Signed-off-by: gejin <[email protected]> Currently, memcpy is supported in SYCL device code if "-fno-builtin" is not added. Compiler will convert it to "llvm.memcpy..." intrinsic and llvm-spirv will convert it to OpCopyMemorySized for jit. However, if "-fno-builtin" is added, compiler will call libc function "memcpy" directly and it requires libdevice support. This PR support memcpy in libdevice, so developers can use it in SYCL device code no matter whether "-fno-builtin" is added or not.
1 parent 000cc82 commit 76051cc

File tree

15 files changed

+72
-10
lines changed

15 files changed

+72
-10
lines changed

clang/lib/Driver/Driver.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4251,6 +4251,7 @@ class OffloadingActionBuilder final {
42514251
// default too.
42524252
SmallVector<DeviceLibOptInfo, 5> sycl_device_fallback_libs = {
42534253
{"libsycl-fallback-cassert", "libc"},
4254+
{"libsycl-fallback-cstring", "libc"},
42544255
{"libsycl-fallback-complex", "libm-fp32"},
42554256
{"libsycl-fallback-complex-fp64", "libm-fp64"},
42564257
{"libsycl-fallback-cmath", "libm-fp32"},

clang/lib/Driver/ToolChains/SYCL.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,7 @@ static llvm::SmallVector<StringRef, 10> SYCLDeviceLibList{
153153
"complex",
154154
"complex-fp64",
155155
"fallback-cassert",
156+
"fallback-cstring",
156157
"fallback-cmath",
157158
"fallback-cmath-fp64",
158159
"fallback-complex",

clang/test/Driver/Inputs/SYCL-windows/lib/libsycl-fallback-cstring.obj

Whitespace-only changes.

clang/test/Driver/Inputs/SYCL/lib/libsycl-fallback-cstring.o

Whitespace-only changes.

clang/test/Driver/sycl-device-lib-win.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
// SYCL_DEVICE_LIB_UNBUNDLE_DEFAULT-NEXT: clang-offload-bundler{{.*}} "-type=o" "-targets=sycl-spir64-unknown-unknown-sycldevice" "-inputs={{.*}}libsycl-cmath.obj" "-outputs={{.*}}libsycl-cmath-{{.*}}.o" "-unbundle"
2222
// SYCL_DEVICE_LIB_UNBUNDLE_DEFAULT-NEXT: clang-offload-bundler{{.*}} "-type=o" "-targets=sycl-spir64-unknown-unknown-sycldevice" "-inputs={{.*}}libsycl-cmath-fp64.obj" "-outputs={{.*}}libsycl-cmath-fp64-{{.*}}.o" "-unbundle"
2323
// SYCL_DEVICE_LIB_UNBUNDLE_DEFAULT-NEXT: clang-offload-bundler{{.*}} "-type=o" "-targets=sycl-spir64-unknown-unknown-sycldevice" "-inputs={{.*}}libsycl-fallback-cassert.obj" "-outputs={{.*}}libsycl-fallback-cassert-{{.*}}.o" "-unbundle"
24+
// SYCL_DEVICE_LIB_UNBUNDLE_DEFAULT-NEXT: clang-offload-bundler{{.*}} "-type=o" "-targets=sycl-spir64-unknown-unknown-sycldevice" "-inputs={{.*}}libsycl-fallback-cstring.obj" "-outputs={{.*}}libsycl-fallback-cstring-{{.*}}.o" "-unbundle"
2425
// SYCL_DEVICE_LIB_UNBUNDLE_DEFAULT-NEXT: clang-offload-bundler{{.*}} "-type=o" "-targets=sycl-spir64-unknown-unknown-sycldevice" "-inputs={{.*}}libsycl-fallback-complex.obj" "-outputs={{.*}}libsycl-fallback-complex-{{.*}}.o" "-unbundle"
2526
// SYCL_DEVICE_LIB_UNBUNDLE_DEFAULT-NEXT: clang-offload-bundler{{.*}} "-type=o" "-targets=sycl-spir64-unknown-unknown-sycldevice" "-inputs={{.*}}libsycl-fallback-complex-fp64.obj" "-outputs={{.*}}libsycl-fallback-complex-fp64-{{.*}}.o" "-unbundle"
2627
// SYCL_DEVICE_LIB_UNBUNDLE_DEFAULT-NEXT: clang-offload-bundler{{.*}} "-type=o" "-targets=sycl-spir64-unknown-unknown-sycldevice" "-inputs={{.*}}libsycl-fallback-cmath.obj" "-outputs={{.*}}libsycl-fallback-cmath-{{.*}}.o" "-unbundle"
@@ -44,6 +45,7 @@
4445
// SYCL_DEVICE_LIB_UNBUNDLE_WITH_FP64-NEXT: clang-offload-bundler{{.*}} "-type=o" "-targets=sycl-spir64-unknown-unknown-sycldevice" "-inputs={{.*}}libsycl-cmath.obj" "-outputs={{.*}}libsycl-cmath-{{.*}}.o" "-unbundle"
4546
// SYCL_DEVICE_LIB_UNBUNDLE_WITH_FP64-NEXT: clang-offload-bundler{{.*}} "-type=o" "-targets=sycl-spir64-unknown-unknown-sycldevice" "-inputs={{.*}}libsycl-cmath-fp64.obj" "-outputs={{.*}}libsycl-cmath-fp64-{{.*}}.o" "-unbundle"
4647
// SYCL_DEVICE_LIB_UNBUNDLE_WITH_FP64-NEXT: clang-offload-bundler{{.*}} "-type=o" "-targets=sycl-spir64-unknown-unknown-sycldevice" "-inputs={{.*}}libsycl-fallback-cassert.obj" "-outputs={{.*}}libsycl-fallback-cassert-{{.*}}.o" "-unbundle"
48+
// SYCL_DEVICE_LIB_UNBUNDLE_WITH_FP64-NEXT: clang-offload-bundler{{.*}} "-type=o" "-targets=sycl-spir64-unknown-unknown-sycldevice" "-inputs={{.*}}libsycl-fallback-cstring.obj" "-outputs={{.*}}libsycl-fallback-cstring-{{.*}}.o" "-unbundle"
4749
// SYCL_DEVICE_LIB_UNBUNDLE_WITH_FP64-NEXT: clang-offload-bundler{{.*}} "-type=o" "-targets=sycl-spir64-unknown-unknown-sycldevice" "-inputs={{.*}}libsycl-fallback-complex.obj" "-outputs={{.*}}libsycl-fallback-complex-{{.*}}.o" "-unbundle"
4850
// SYCL_DEVICE_LIB_UNBUNDLE_WITH_FP64-NEXT: clang-offload-bundler{{.*}} "-type=o" "-targets=sycl-spir64-unknown-unknown-sycldevice" "-inputs={{.*}}libsycl-fallback-complex-fp64.obj" "-outputs={{.*}}libsycl-fallback-complex-fp64-{{.*}}.o" "-unbundle"
4951
// SYCL_DEVICE_LIB_UNBUNDLE_WITH_FP64-NEXT: clang-offload-bundler{{.*}} "-type=o" "-targets=sycl-spir64-unknown-unknown-sycldevice" "-inputs={{.*}}libsycl-fallback-cmath.obj" "-outputs={{.*}}libsycl-fallback-cmath-{{.*}}.o" "-unbundle"
@@ -69,7 +71,7 @@
6971
// RUN: | FileCheck %s -check-prefix=SYCL_DEVICE_LIB_UNBUNDLE_NO_LIBM
7072
// SYCL_DEVICE_LIB_UNBUNDLE_NO_LIBM: clang-offload-bundler{{.*}} "-type=o" "-targets=sycl-spir64-unknown-unknown-sycldevice" "-inputs={{.*}}libsycl-crt.obj" "-outputs={{.*}}libsycl-crt-{{.*}}.o" "-unbundle"
7173
// SYCL_DEVICE_LIB_UNBUNDLE_NO_LIBM-NEXT: clang-offload-bundler{{.*}} "-type=o" "-targets=sycl-spir64-unknown-unknown-sycldevice" "-inputs={{.*}}libsycl-fallback-cassert.obj" "-outputs={{.*}}libsycl-fallback-cassert-{{.*}}.o" "-unbundle"
72-
74+
// SYCL_DEVICE_LIB_UNBUNDLE_NO_LIBM-NEXT: clang-offload-bundler{{.*}} "-type=o" "-targets=sycl-spir64-unknown-unknown-sycldevice" "-inputs={{.*}}libsycl-fallback-cstring.obj" "-outputs={{.*}}libsycl-fallback-cstring-{{.*}}.o" "-unbundle"
7375
/// ###########################################################################
7476

7577
/// test behavior of disabling all device libraries
@@ -109,6 +111,7 @@
109111
// SYCL_LLVM_LINK_DEVICE_LIB-NEXT: clang-offload-bundler{{.*}} "-type=o" "-targets=sycl-spir64-unknown-unknown-sycldevice" "-inputs={{.*}}libsycl-cmath.obj" "-outputs={{.*}}libsycl-cmath-{{.*}}.o" "-unbundle"
110112
// SYCL_LLVM_LINK_DEVICE_LIB-NEXT: clang-offload-bundler{{.*}} "-type=o" "-targets=sycl-spir64-unknown-unknown-sycldevice" "-inputs={{.*}}libsycl-cmath-fp64.obj" "-outputs={{.*}}libsycl-cmath-fp64-{{.*}}.o" "-unbundle"
111113
// SYCL_LLVM_LINK_DEVICE_LIB-NEXT: clang-offload-bundler{{.*}} "-type=o" "-targets=sycl-spir64-unknown-unknown-sycldevice" "-inputs={{.*}}libsycl-fallback-cassert.obj" "-outputs={{.*}}libsycl-fallback-cassert-{{.*}}.o" "-unbundle"
114+
// SYCL_LLVM_LINK_DEVICE_LIB-NEXT: clang-offload-bundler{{.*}} "-type=o" "-targets=sycl-spir64-unknown-unknown-sycldevice" "-inputs={{.*}}libsycl-fallback-cstring.obj" "-outputs={{.*}}libsycl-fallback-cstring-{{.*}}.o" "-unbundle"
112115
// SYCL_LLVM_LINK_DEVICE_LIB-NEXT: clang-offload-bundler{{.*}} "-type=o" "-targets=sycl-spir64-unknown-unknown-sycldevice" "-inputs={{.*}}libsycl-fallback-complex.obj" "-outputs={{.*}}libsycl-fallback-complex-{{.*}}.o" "-unbundle"
113116
// SYCL_LLVM_LINK_DEVICE_LIB-NEXT: clang-offload-bundler{{.*}} "-type=o" "-targets=sycl-spir64-unknown-unknown-sycldevice" "-inputs={{.*}}libsycl-fallback-complex-fp64.obj" "-outputs={{.*}}libsycl-fallback-complex-fp64-{{.*}}.o" "-unbundle"
114117
// SYCL_LLVM_LINK_DEVICE_LIB-NEXT: clang-offload-bundler{{.*}} "-type=o" "-targets=sycl-spir64-unknown-unknown-sycldevice" "-inputs={{.*}}libsycl-fallback-cmath.obj" "-outputs={{.*}}libsycl-fallback-cmath-{{.*}}.o" "-unbundle"

clang/test/Driver/sycl-device-lib.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
// SYCL_DEVICE_LIB_UNBUNDLE_DEFAULT-NEXT: clang-offload-bundler{{.*}} "-type=o" "-targets=sycl-spir64-unknown-unknown-sycldevice" "-inputs={{.*}}libsycl-cmath.o" "-outputs={{.*}}libsycl-cmath-{{.*}}.o" "-unbundle"
2222
// SYCL_DEVICE_LIB_UNBUNDLE_DEFAULT-NEXT: clang-offload-bundler{{.*}} "-type=o" "-targets=sycl-spir64-unknown-unknown-sycldevice" "-inputs={{.*}}libsycl-cmath-fp64.o" "-outputs={{.*}}libsycl-cmath-fp64-{{.*}}.o" "-unbundle"
2323
// SYCL_DEVICE_LIB_UNBUNDLE_DEFAULT-NEXT: clang-offload-bundler{{.*}} "-type=o" "-targets=sycl-spir64-unknown-unknown-sycldevice" "-inputs={{.*}}libsycl-fallback-cassert.o" "-outputs={{.*}}libsycl-fallback-cassert-{{.*}}.o" "-unbundle"
24+
// SYCL_DEVICE_LIB_UNBUNDLE_DEFAULT-NEXT: clang-offload-bundler{{.*}} "-type=o" "-targets=sycl-spir64-unknown-unknown-sycldevice" "-inputs={{.*}}libsycl-fallback-cstring.o" "-outputs={{.*}}libsycl-fallback-cstring-{{.*}}.o" "-unbundle"
2425
// SYCL_DEVICE_LIB_UNBUNDLE_DEFAULT-NEXT: clang-offload-bundler{{.*}} "-type=o" "-targets=sycl-spir64-unknown-unknown-sycldevice" "-inputs={{.*}}libsycl-fallback-complex.o" "-outputs={{.*}}libsycl-fallback-complex-{{.*}}.o" "-unbundle"
2526
// SYCL_DEVICE_LIB_UNBUNDLE_DEFAULT-NEXT: clang-offload-bundler{{.*}} "-type=o" "-targets=sycl-spir64-unknown-unknown-sycldevice" "-inputs={{.*}}libsycl-fallback-complex-fp64.o" "-outputs={{.*}}libsycl-fallback-complex-fp64-{{.*}}.o" "-unbundle"
2627
// SYCL_DEVICE_LIB_UNBUNDLE_DEFAULT-NEXT: clang-offload-bundler{{.*}} "-type=o" "-targets=sycl-spir64-unknown-unknown-sycldevice" "-inputs={{.*}}libsycl-fallback-cmath.o" "-outputs={{.*}}libsycl-fallback-cmath-{{.*}}.o" "-unbundle"
@@ -44,6 +45,7 @@
4445
// SYCL_DEVICE_LIB_UNBUNDLE_WITH_FP64-NEXT: clang-offload-bundler{{.*}} "-type=o" "-targets=sycl-spir64-unknown-unknown-sycldevice" "-inputs={{.*}}libsycl-cmath.o" "-outputs={{.*}}libsycl-cmath-{{.*}}.o" "-unbundle"
4546
// SYCL_DEVICE_LIB_UNBUNDLE_WITH_FP64-NEXT: clang-offload-bundler{{.*}} "-type=o" "-targets=sycl-spir64-unknown-unknown-sycldevice" "-inputs={{.*}}libsycl-cmath-fp64.o" "-outputs={{.*}}libsycl-cmath-fp64-{{.*}}.o" "-unbundle"
4647
// SYCL_DEVICE_LIB_UNBUNDLE_WITH_FP64-NEXT: clang-offload-bundler{{.*}} "-type=o" "-targets=sycl-spir64-unknown-unknown-sycldevice" "-inputs={{.*}}libsycl-fallback-cassert.o" "-outputs={{.*}}libsycl-fallback-cassert-{{.*}}.o" "-unbundle"
48+
// SYCL_DEVICE_LIB_UNBUNDLE_WITH_FP64-NEXT: clang-offload-bundler{{.*}} "-type=o" "-targets=sycl-spir64-unknown-unknown-sycldevice" "-inputs={{.*}}libsycl-fallback-cstring.o" "-outputs={{.*}}libsycl-fallback-cstring-{{.*}}.o" "-unbundle"
4749
// SYCL_DEVICE_LIB_UNBUNDLE_WITH_FP64-NEXT: clang-offload-bundler{{.*}} "-type=o" "-targets=sycl-spir64-unknown-unknown-sycldevice" "-inputs={{.*}}libsycl-fallback-complex.o" "-outputs={{.*}}libsycl-fallback-complex-{{.*}}.o" "-unbundle"
4850
// SYCL_DEVICE_LIB_UNBUNDLE_WITH_FP64-NEXT: clang-offload-bundler{{.*}} "-type=o" "-targets=sycl-spir64-unknown-unknown-sycldevice" "-inputs={{.*}}libsycl-fallback-complex-fp64.o" "-outputs={{.*}}libsycl-fallback-complex-fp64-{{.*}}.o" "-unbundle"
4951
// SYCL_DEVICE_LIB_UNBUNDLE_WITH_FP64-NEXT: clang-offload-bundler{{.*}} "-type=o" "-targets=sycl-spir64-unknown-unknown-sycldevice" "-inputs={{.*}}libsycl-fallback-cmath.o" "-outputs={{.*}}libsycl-fallback-cmath-{{.*}}.o" "-unbundle"
@@ -69,6 +71,7 @@
6971
// RUN: | FileCheck %s -check-prefix=SYCL_DEVICE_LIB_UNBUNDLE_NO_LIBM
7072
// SYCL_DEVICE_LIB_UNBUNDLE_NO_LIBM: clang-offload-bundler{{.*}} "-type=o" "-targets=sycl-spir64-unknown-unknown-sycldevice" "-inputs={{.*}}libsycl-crt.o" "-outputs={{.*}}libsycl-crt-{{.*}}.o" "-unbundle"
7173
// SYCL_DEVICE_LIB_UNBUNDLE_NO_LIBM-NEXT: clang-offload-bundler{{.*}} "-type=o" "-targets=sycl-spir64-unknown-unknown-sycldevice" "-inputs={{.*}}libsycl-fallback-cassert.o" "-outputs={{.*}}libsycl-fallback-cassert-{{.*}}.o" "-unbundle"
74+
// SYCL_DEVICE_LIB_UNBUNDLE_NO_LIBM-NEXT: clang-offload-bundler{{.*}} "-type=o" "-targets=sycl-spir64-unknown-unknown-sycldevice" "-inputs={{.*}}libsycl-fallback-cstring.o" "-outputs={{.*}}libsycl-fallback-cstring-{{.*}}.o" "-unbundle"
7275

7376
/// ###########################################################################
7477

@@ -109,6 +112,7 @@
109112
// SYCL_LLVM_LINK_DEVICE_LIB-NEXT: clang-offload-bundler{{.*}} "-type=o" "-targets=sycl-spir64-unknown-unknown-sycldevice" "-inputs={{.*}}libsycl-cmath.o" "-outputs={{.*}}libsycl-cmath-{{.*}}.o" "-unbundle"
110113
// SYCL_LLVM_LINK_DEVICE_LIB-NEXT: clang-offload-bundler{{.*}} "-type=o" "-targets=sycl-spir64-unknown-unknown-sycldevice" "-inputs={{.*}}libsycl-cmath-fp64.o" "-outputs={{.*}}libsycl-cmath-fp64-{{.*}}.o" "-unbundle"
111114
// SYCL_LLVM_LINK_DEVICE_LIB-NEXT: clang-offload-bundler{{.*}} "-type=o" "-targets=sycl-spir64-unknown-unknown-sycldevice" "-inputs={{.*}}libsycl-fallback-cassert.o" "-outputs={{.*}}libsycl-fallback-cassert-{{.*}}.o" "-unbundle"
115+
// SYCL_LLVM_LINK_DEVICE_LIB-NEXT: clang-offload-bundler{{.*}} "-type=o" "-targets=sycl-spir64-unknown-unknown-sycldevice" "-inputs={{.*}}libsycl-fallback-cstring.o" "-outputs={{.*}}libsycl-fallback-cstring-{{.*}}.o" "-unbundle"
112116
// SYCL_LLVM_LINK_DEVICE_LIB-NEXT: clang-offload-bundler{{.*}} "-type=o" "-targets=sycl-spir64-unknown-unknown-sycldevice" "-inputs={{.*}}libsycl-fallback-complex.o" "-outputs={{.*}}libsycl-fallback-complex-{{.*}}.o" "-unbundle"
113117
// SYCL_LLVM_LINK_DEVICE_LIB-NEXT: clang-offload-bundler{{.*}} "-type=o" "-targets=sycl-spir64-unknown-unknown-sycldevice" "-inputs={{.*}}libsycl-fallback-complex-fp64.o" "-outputs={{.*}}libsycl-fallback-complex-fp64-{{.*}}.o" "-unbundle"
114118
// SYCL_LLVM_LINK_DEVICE_LIB-NEXT: clang-offload-bundler{{.*}} "-type=o" "-targets=sycl-spir64-unknown-unknown-sycldevice" "-inputs={{.*}}libsycl-fallback-cmath.o" "-outputs={{.*}}libsycl-fallback-cmath-{{.*}}.o" "-unbundle"

libdevice/cmake/modules/SYCLLibdevice.cmake

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -78,14 +78,23 @@ add_custom_command(OUTPUT ${devicelib-obj-cmath-fp64}
7878
VERBATIM)
7979

8080
add_custom_command(OUTPUT ${spv_binary_dir}/libsycl-fallback-cassert.spv
81-
COMMAND ${clang} -S -fsycl-device-only -fno-sycl-use-bitcode
81+
COMMAND ${clang} -fsycl-device-only -fno-sycl-use-bitcode
8282
${compile_opts}
8383
${CMAKE_CURRENT_SOURCE_DIR}/fallback-cassert.cpp
8484
-o ${spv_binary_dir}/libsycl-fallback-cassert.spv
8585
MAIN_DEPENDENCY fallback-cassert.cpp
8686
DEPENDS wrapper.h device.h clang spirv_vars.h llvm-spirv
8787
VERBATIM)
8888

89+
add_custom_command(OUTPUT ${spv_binary_dir}/libsycl-fallback-cstring.spv
90+
COMMAND ${clang} -fsycl-device-only -fno-sycl-use-bitcode
91+
${compile_opts}
92+
${CMAKE_CURRENT_SOURCE_DIR}/fallback-cstring.cpp
93+
-o ${spv_binary_dir}/libsycl-fallback-cstring.spv
94+
MAIN_DEPENDENCY fallback-cstring.cpp
95+
DEPENDS wrapper.h device.h clang spirv_vars.h llvm-spirv
96+
VERBATIM)
97+
8998
add_custom_command(OUTPUT ${obj_binary_dir}/libsycl-fallback-cassert.${lib-suffix}
9099
COMMAND ${clang} -fsycl -c
91100
${compile_opts} ${sycl_targets_opt}
@@ -95,8 +104,17 @@ add_custom_command(OUTPUT ${obj_binary_dir}/libsycl-fallback-cassert.${lib-suffi
95104
DEPENDS wrapper.h device.h clang spirv_vars.h clang-offload-bundler
96105
VERBATIM)
97106

107+
add_custom_command(OUTPUT ${obj_binary_dir}/libsycl-fallback-cstring.${lib-suffix}
108+
COMMAND ${clang} -fsycl -c
109+
${compile_opts} ${sycl_targets_opt}
110+
${CMAKE_CURRENT_SOURCE_DIR}/fallback-cstring.cpp
111+
-o ${obj_binary_dir}/libsycl-fallback-cstring.${lib-suffix}
112+
MAIN_DEPENDENCY fallback-cstring.cpp
113+
DEPENDS wrapper.h device.h clang spirv_vars.h clang-offload-bundler
114+
VERBATIM)
115+
98116
add_custom_command(OUTPUT ${spv_binary_dir}/libsycl-fallback-complex.spv
99-
COMMAND ${clang} -S -fsycl-device-only -fno-sycl-use-bitcode
117+
COMMAND ${clang} -fsycl-device-only -fno-sycl-use-bitcode
100118
${compile_opts}
101119
${CMAKE_CURRENT_SOURCE_DIR}/fallback-complex.cpp
102120
-o ${spv_binary_dir}/libsycl-fallback-complex.spv
@@ -114,7 +132,7 @@ add_custom_command(OUTPUT ${obj_binary_dir}/libsycl-fallback-complex.${lib-suffi
114132
VERBATIM)
115133

116134
add_custom_command(OUTPUT ${spv_binary_dir}/libsycl-fallback-complex-fp64.spv
117-
COMMAND ${clang} -S -fsycl-device-only -fno-sycl-use-bitcode
135+
COMMAND ${clang} -fsycl-device-only -fno-sycl-use-bitcode
118136
${compile_opts}
119137
${CMAKE_CURRENT_SOURCE_DIR}/fallback-complex-fp64.cpp
120138
-o ${spv_binary_dir}/libsycl-fallback-complex-fp64.spv
@@ -132,7 +150,7 @@ add_custom_command(OUTPUT ${obj_binary_dir}/libsycl-fallback-complex-fp64.${lib-
132150
VERBATIM)
133151

134152
add_custom_command(OUTPUT ${spv_binary_dir}/libsycl-fallback-cmath.spv
135-
COMMAND ${clang} -S -fsycl-device-only -fno-sycl-use-bitcode
153+
COMMAND ${clang} -fsycl-device-only -fno-sycl-use-bitcode
136154
${compile_opts}
137155
${CMAKE_CURRENT_SOURCE_DIR}/fallback-cmath.cpp
138156
-o ${spv_binary_dir}/libsycl-fallback-cmath.spv
@@ -150,7 +168,7 @@ add_custom_command(OUTPUT ${obj_binary_dir}/libsycl-fallback-cmath.${lib-suffix}
150168
VERBATIM)
151169

152170
add_custom_command(OUTPUT ${spv_binary_dir}/libsycl-fallback-cmath-fp64.spv
153-
COMMAND ${clang} -S -fsycl-device-only -fno-sycl-use-bitcode
171+
COMMAND ${clang} -fsycl-device-only -fno-sycl-use-bitcode
154172
${compile_opts}
155173
${CMAKE_CURRENT_SOURCE_DIR}/fallback-cmath-fp64.cpp
156174
-o ${spv_binary_dir}/libsycl-fallback-cmath-fp64.spv
@@ -210,13 +228,15 @@ add_custom_target(libsycldevice-obj DEPENDS
210228
)
211229
add_custom_target(libsycldevice-spv DEPENDS
212230
${spv_binary_dir}/libsycl-fallback-cassert.spv
231+
${spv_binary_dir}/libsycl-fallback-cstring.spv
213232
${spv_binary_dir}/libsycl-fallback-complex.spv
214233
${spv_binary_dir}/libsycl-fallback-complex-fp64.spv
215234
${spv_binary_dir}/libsycl-fallback-cmath.spv
216235
${spv_binary_dir}/libsycl-fallback-cmath-fp64.spv
217236
)
218237
add_custom_target(libsycldevice-fallback-obj DEPENDS
219238
${obj_binary_dir}/libsycl-fallback-cassert.${lib-suffix}
239+
${obj_binary_dir}/libsycl-fallback-cstring.${lib-suffix}
220240
${obj_binary_dir}/libsycl-fallback-complex.${lib-suffix}
221241
${obj_binary_dir}/libsycl-fallback-complex-fp64.${lib-suffix}
222242
${obj_binary_dir}/libsycl-fallback-cmath.${lib-suffix}
@@ -239,6 +259,7 @@ set(install_dest_lib lib${LLVM_LIBDIR_SUFFIX})
239259

240260
install(FILES ${devicelib-obj-file}
241261
${obj_binary_dir}/libsycl-fallback-cassert.${lib-suffix}
262+
${obj_binary_dir}/libsycl-fallback-cstring.${lib-suffix}
242263
${devicelib-obj-complex}
243264
${obj_binary_dir}/libsycl-fallback-complex.${lib-suffix}
244265
${devicelib-obj-complex-fp64}
@@ -252,6 +273,7 @@ install(FILES ${devicelib-obj-file}
252273
COMPONENT libsycldevice)
253274

254275
install(FILES ${spv_binary_dir}/libsycl-fallback-cassert.spv
276+
${spv_binary_dir}/libsycl-fallback-cstring.spv
255277
${spv_binary_dir}/libsycl-fallback-complex.spv
256278
${spv_binary_dir}/libsycl-fallback-complex-fp64.spv
257279
${spv_binary_dir}/libsycl-fallback-cmath.spv

libdevice/crt_wrapper.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,10 @@
99
#include "wrapper.h"
1010

1111
#ifdef __SPIR__
12+
DEVICE_EXTERN_C
13+
void *memcpy(void *dest, const void *src, size_t n) {
14+
return __devicelib_memcpy(dest, src, n);
15+
}
1216
#if defined(_WIN32)
1317
// Truncates a wide (16 or 32 bit) string (wstr) into an ASCII string (str).
1418
// Any non-ASCII characters are replaced by question mark '?'.

libdevice/fallback-cstring.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
//==-- fallback-cstring.cpp - fallback implementation of C string functions--=//
2+
//
3+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4+
// See https://llvm.org/LICENSE.txt for license information.
5+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6+
//
7+
//===----------------------------------------------------------------------===//
8+
9+
#include "wrapper.h"
10+
11+
#ifdef __SPIR__
12+
void *__devicelib_memcpy(void *dest, const void *src, size_t n) {
13+
return __builtin_memcpy(dest, src, n);
14+
}
15+
#endif // __SPIR__

libdevice/wrapper.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@
1818
// We need the following header to ensure the definition of all spirv variables
1919
// required by the wrapper libraries.
2020
#include "spirv_vars.h"
21-
21+
DEVICE_EXTERN_C
22+
void *__devicelib_memcpy(void *dest, const void *src, size_t n);
2223
DEVICE_EXTERN_C
2324
void __devicelib_assert_fail(const char *expr, const char *file, int32_t line,
2425
const char *func, uint64_t gid0, uint64_t gid1,

llvm/tools/sycl-post-link/SYCLDeviceLibReqMask.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,7 @@ SYCLDeviceLibFuncMap SDLMap = {
158158
{"__devicelib_csqrt", DeviceLibExt::cl_intel_devicelib_complex_fp64},
159159
{"__devicelib_ctan", DeviceLibExt::cl_intel_devicelib_complex_fp64},
160160
{"__devicelib_ctanh", DeviceLibExt::cl_intel_devicelib_complex_fp64},
161+
{"__devicelib_memcpy", DeviceLibExt::cl_intel_devicelib_cstring},
161162
};
162163

163164
// Each fallback device library corresponds to one bit in "require mask" which
@@ -169,6 +170,7 @@ SYCLDeviceLibFuncMap SDLMap = {
169170
// fallback-cmath-fp64: 0x4
170171
// fallback-complex: 0x8
171172
// fallback-complex-fp64: 0x10
173+
// fallback-cstring: 0x20
172174
uint32_t getDeviceLibBits(const std::string &FuncName) {
173175
auto DeviceLibFuncIter = SDLMap.find(FuncName);
174176
return ((DeviceLibFuncIter == SDLMap.end())

0 commit comments

Comments
 (0)