Skip to content

Commit 464d3a5

Browse files
author
Andrew Savonichev
committed
Include __devicelib_assert.h in SYCL driver
Signed-off-by: Andrew Savonichev <[email protected]>
1 parent ff9a212 commit 464d3a5

File tree

14 files changed

+218
-256
lines changed

14 files changed

+218
-256
lines changed

clang/lib/Driver/ToolChains/Clang.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1218,9 +1218,14 @@ void Clang::AddPreprocessingOptions(Compilation &C, const JobAction &JA,
12181218
getToolChain().AddCudaIncludeArgs(Args, CmdArgs);
12191219

12201220
if (JA.isOffloading(Action::OFK_SYCL) ||
1221-
Args.hasArg(options::OPT_fsycl_device_only))
1221+
Args.hasArg(options::OPT_fsycl_device_only)) {
12221222
toolchains::SYCLToolChain::AddSYCLIncludeArgs(D, Args, CmdArgs);
12231223

1224+
if (getToolChain().getTriple().isSPIR()) {
1225+
toolchains::SYCLToolChain::AddDevicelibIncludeArgs(CmdArgs);
1226+
}
1227+
}
1228+
12241229
// If we are offloading to a target via OpenMP we need to include the
12251230
// openmp_wrappers folder which contains alternative system headers.
12261231
if (JA.isDeviceOffloading(Action::OFK_OpenMP) &&

clang/lib/Driver/ToolChains/SYCL.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -543,6 +543,12 @@ void SYCLToolChain::AddSYCLIncludeArgs(const clang::driver::Driver &Driver,
543543
CC1Args.push_back(DriverArgs.MakeArgString(P));
544544
}
545545

546+
void SYCLToolChain::AddDevicelibIncludeArgs(ArgStringList &CC1Args) {
547+
// Assume that clang system include path is added elsewhere
548+
CC1Args.push_back("-include");
549+
CC1Args.push_back("devicelib/__devicelib_assert.h");
550+
}
551+
546552
void SYCLToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
547553
ArgStringList &CC1Args) const {
548554
HostTC.AddClangSystemIncludeArgs(DriverArgs, CC1Args);

clang/lib/Driver/ToolChains/SYCL.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,7 @@ class LLVM_LIBRARY_VISIBILITY SYCLToolChain : public ToolChain {
145145
static void AddSYCLIncludeArgs(const clang::driver::Driver &Driver,
146146
const llvm::opt::ArgList &DriverArgs,
147147
llvm::opt::ArgStringList &CC1Args);
148+
static void AddDevicelibIncludeArgs(llvm::opt::ArgStringList &CC1Args);
148149
void AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs,
149150
llvm::opt::ArgStringList &CC1Args) const override;
150151
void AddClangCXXStdlibIncludeArgs(

clang/lib/Headers/CMakeLists.txt

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,12 @@ set(openmp_wrapper_files
147147
openmp_wrappers/new
148148
)
149149

150+
set(devicelib_wrapper_files
151+
devicelib/__devicelib_assert.h
152+
devicelib/__devicelib.h
153+
devicelib/spirv_vars.h
154+
)
155+
150156
set(output_dir ${LLVM_LIBRARY_OUTPUT_INTDIR}/clang/${CLANG_VERSION}/include)
151157
set(out_files)
152158
set(generated_files)
@@ -175,7 +181,7 @@ endfunction(clang_generate_header)
175181

176182

177183
# Copy header files from the source directory to the build directory
178-
foreach( f ${files} ${cuda_wrapper_files} ${ppc_wrapper_files} ${openmp_wrapper_files})
184+
foreach( f ${files} ${cuda_wrapper_files} ${ppc_wrapper_files} ${openmp_wrapper_files} ${devicelib_wrapper_files})
179185
copy_header_to_output_dir(${CMAKE_CURRENT_SOURCE_DIR} ${f})
180186
endforeach( f )
181187

@@ -218,6 +224,11 @@ install(
218224
DESTINATION ${header_install_dir}/openmp_wrappers
219225
COMPONENT clang-resource-headers)
220226

227+
install(
228+
FILES ${devicelib_wrapper_files}
229+
DESTINATION ${header_install_dir}/devicelib
230+
COMPONENT clang-resource-headers)
231+
221232
if (NOT LLVM_ENABLE_IDE)
222233
add_llvm_install_targets(install-clang-resource-headers
223234
DEPENDS clang-resource-headers

libdevice/include/assert.h renamed to clang/lib/Headers/devicelib/__devicelib_assert.h

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,21 +9,14 @@
99
#ifndef __DEVICELIB_ASSERT_H__
1010
#define __DEVICELIB_ASSERT_H__
1111

12-
#include_next "assert.h"
13-
#include "devicelib.h"
12+
#include "__devicelib.h"
1413

1514
#ifdef __DEVICELIB_DEVICE_ONLY__
1615

1716
#include <stddef.h>
1817
#include <stdint.h>
1918

20-
DEVICE_EXTERNAL size_t __spirv_GlobalInvocationId_x();
21-
DEVICE_EXTERNAL size_t __spirv_GlobalInvocationId_y();
22-
DEVICE_EXTERNAL size_t __spirv_GlobalInvocationId_z();
23-
24-
DEVICE_EXTERNAL size_t __spirv_LocalInvocationId_x();
25-
DEVICE_EXTERNAL size_t __spirv_LocalInvocationId_y();
26-
DEVICE_EXTERNAL size_t __spirv_LocalInvocationId_z();
19+
#include "spirv_vars.h"
2720

2821
DEVICE_EXTERN_C
2922
void __devicelib_assert_fail(const char *expr, const char *file, int32_t line,
@@ -32,8 +25,9 @@ void __devicelib_assert_fail(const char *expr, const char *file, int32_t line,
3225
uint64_t lid2);
3326

3427
#ifdef __DEVICELIB_GLIBC__
35-
EXTERN_C inline void __assert_fail(const char *expr, const char *file,
36-
unsigned int line, const char *func) {
28+
EXTERN_C inline void
29+
__assert_fail(const char *expr, const char *file,
30+
unsigned int line, const char *func) __THROW __attribute__ ((__noreturn__)) {
3731
__devicelib_assert_fail(
3832
expr, file, line, func, __spirv_GlobalInvocationId_x(),
3933
__spirv_GlobalInvocationId_y(), __spirv_GlobalInvocationId_z(),
Lines changed: 147 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,147 @@
1+
//==---------- spirv_vars.hpp --- SPIRV variables -------------------------==//
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+
#ifndef __SPIRV_VARS_H__
10+
#define __SPIRV_VARS_H__
11+
12+
#include <stddef.h>
13+
#include <stdint.h>
14+
15+
#ifdef __cplusplus
16+
#define __EXTERN_C extern "C"
17+
#else
18+
#define __EXTERN_C
19+
#endif
20+
21+
#ifdef __SYCL_DEVICE_ONLY__
22+
23+
#ifdef __SYCL_NVPTX__
24+
25+
SYCL_EXTERNAL size_t __spirv_GlobalInvocationId_x();
26+
SYCL_EXTERNAL size_t __spirv_GlobalInvocationId_y();
27+
SYCL_EXTERNAL size_t __spirv_GlobalInvocationId_z();
28+
29+
SYCL_EXTERNAL size_t __spirv_GlobalSize_x();
30+
SYCL_EXTERNAL size_t __spirv_GlobalSize_y();
31+
SYCL_EXTERNAL size_t __spirv_GlobalSize_z();
32+
33+
SYCL_EXTERNAL size_t __spirv_GlobalOffset_x();
34+
SYCL_EXTERNAL size_t __spirv_GlobalOffset_y();
35+
SYCL_EXTERNAL size_t __spirv_GlobalOffset_z();
36+
37+
SYCL_EXTERNAL size_t __spirv_NumWorkgroups_x();
38+
SYCL_EXTERNAL size_t __spirv_NumWorkgroups_y();
39+
SYCL_EXTERNAL size_t __spirv_NumWorkgroups_z();
40+
41+
SYCL_EXTERNAL size_t __spirv_WorkgroupSize_x();
42+
SYCL_EXTERNAL size_t __spirv_WorkgroupSize_y();
43+
SYCL_EXTERNAL size_t __spirv_WorkgroupSize_z();
44+
45+
SYCL_EXTERNAL size_t __spirv_WorkgroupId_x();
46+
SYCL_EXTERNAL size_t __spirv_WorkgroupId_y();
47+
SYCL_EXTERNAL size_t __spirv_WorkgroupId_z();
48+
49+
SYCL_EXTERNAL size_t __spirv_LocalInvocationId_x();
50+
SYCL_EXTERNAL size_t __spirv_LocalInvocationId_y();
51+
SYCL_EXTERNAL size_t __spirv_LocalInvocationId_z();
52+
53+
#else // __SYCL_NVPTX__
54+
55+
typedef size_t size_t_vec __attribute__((ext_vector_type(3)));
56+
__EXTERN_C const __attribute__((opencl_constant))
57+
size_t_vec __spirv_BuiltInGlobalInvocationId;
58+
__EXTERN_C const __attribute__((opencl_constant))
59+
size_t_vec __spirv_BuiltInGlobalSize;
60+
__EXTERN_C const __attribute__((opencl_constant))
61+
size_t_vec __spirv_BuiltInGlobalOffset;
62+
__EXTERN_C const __attribute__((opencl_constant))
63+
size_t_vec __spirv_BuiltInNumWorkgroups;
64+
__EXTERN_C const __attribute__((opencl_constant))
65+
size_t_vec __spirv_BuiltInWorkgroupSize;
66+
__EXTERN_C const __attribute__((opencl_constant))
67+
size_t_vec __spirv_BuiltInWorkgroupId;
68+
__EXTERN_C const __attribute__((opencl_constant))
69+
size_t_vec __spirv_BuiltInLocalInvocationId;
70+
71+
SYCL_EXTERNAL inline size_t __spirv_GlobalInvocationId_x() {
72+
return __spirv_BuiltInGlobalInvocationId.x;
73+
}
74+
SYCL_EXTERNAL inline size_t __spirv_GlobalInvocationId_y() {
75+
return __spirv_BuiltInGlobalInvocationId.y;
76+
}
77+
SYCL_EXTERNAL inline size_t __spirv_GlobalInvocationId_z() {
78+
return __spirv_BuiltInGlobalInvocationId.z;
79+
}
80+
81+
SYCL_EXTERNAL inline size_t __spirv_GlobalSize_x() {
82+
return __spirv_BuiltInGlobalSize.x;
83+
}
84+
SYCL_EXTERNAL inline size_t __spirv_GlobalSize_y() {
85+
return __spirv_BuiltInGlobalSize.y;
86+
}
87+
SYCL_EXTERNAL inline size_t __spirv_GlobalSize_z() {
88+
return __spirv_BuiltInGlobalSize.z;
89+
}
90+
91+
SYCL_EXTERNAL inline size_t __spirv_GlobalOffset_x() {
92+
return __spirv_BuiltInGlobalOffset.x;
93+
}
94+
SYCL_EXTERNAL inline size_t __spirv_GlobalOffset_y() {
95+
return __spirv_BuiltInGlobalOffset.y;
96+
}
97+
SYCL_EXTERNAL inline size_t __spirv_GlobalOffset_z() {
98+
return __spirv_BuiltInGlobalOffset.z;
99+
}
100+
101+
SYCL_EXTERNAL inline size_t __spirv_NumWorkgroups_x() {
102+
return __spirv_BuiltInNumWorkgroups.x;
103+
}
104+
SYCL_EXTERNAL inline size_t __spirv_NumWorkgroups_y() {
105+
return __spirv_BuiltInNumWorkgroups.y;
106+
}
107+
SYCL_EXTERNAL inline size_t __spirv_NumWorkgroups_z() {
108+
return __spirv_BuiltInNumWorkgroups.z;
109+
}
110+
111+
SYCL_EXTERNAL inline size_t __spirv_WorkgroupSize_x() {
112+
return __spirv_BuiltInWorkgroupSize.x;
113+
}
114+
SYCL_EXTERNAL inline size_t __spirv_WorkgroupSize_y() {
115+
return __spirv_BuiltInWorkgroupSize.y;
116+
}
117+
SYCL_EXTERNAL inline size_t __spirv_WorkgroupSize_z() {
118+
return __spirv_BuiltInWorkgroupSize.z;
119+
}
120+
121+
SYCL_EXTERNAL inline size_t __spirv_WorkgroupId_x() {
122+
return __spirv_BuiltInWorkgroupId.x;
123+
}
124+
SYCL_EXTERNAL inline size_t __spirv_WorkgroupId_y() {
125+
return __spirv_BuiltInWorkgroupId.y;
126+
}
127+
SYCL_EXTERNAL inline size_t __spirv_WorkgroupId_z() {
128+
return __spirv_BuiltInWorkgroupId.z;
129+
}
130+
131+
SYCL_EXTERNAL inline size_t __spirv_LocalInvocationId_x() {
132+
return __spirv_BuiltInLocalInvocationId.x;
133+
}
134+
SYCL_EXTERNAL inline size_t __spirv_LocalInvocationId_y() {
135+
return __spirv_BuiltInLocalInvocationId.y;
136+
}
137+
SYCL_EXTERNAL inline size_t __spirv_LocalInvocationId_z() {
138+
return __spirv_BuiltInLocalInvocationId.z;
139+
}
140+
141+
#endif // __SYCL_NVPTX__
142+
143+
#endif // __SYCL_DEVICE_ONLY__
144+
145+
#undef __EXTERN_C
146+
147+
#endif // __SPIRV_VARS_H__

clang/test/Driver/sycl-device.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@
88
// RUN: | FileCheck -check-prefix=CHECK-SYCL-DEV %s
99
// CHECK-SYCL-DEV: "-fsycl-is-device"{{.*}} "-internal-isystem" "{{.*}}bin{{[/\\]+}}..{{[/\\]+}}include{{[/\\]+}}sycl"
1010

11+
/// Check that devicelib include path is added
12+
// CHECK-SYCL-DEV: "-include" "devicelib{{[/\\]}}__devicelib_assert.h"
13+
1114
/// Check that "-Wno-sycl-strict" is set on compiler invocation with "-fsycl"
1215
/// or "-fsycl-device-only" or both:
1316
// RUN: %clang -### -fsycl %s 2>&1 \

libdevice/cmake/modules/SYCLLibdevice.cmake

Lines changed: 1 addition & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ if (WIN32)
33
else()
44
set(binary_dir "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}")
55
endif()
6-
set(include_dir "${LLVM_BINARY_DIR}/include/sycl")
76

87
set(clang $<TARGET_FILE:clang>)
98

@@ -104,19 +103,6 @@ add_custom_command(OUTPUT ${binary_dir}/libsycl-fallback-cmath-fp64.spv
104103
DEPENDS device_math.h device.h clang llvm-spirv
105104
VERBATIM)
106105

107-
add_custom_target(libsycldevice-inc)
108-
add_custom_command(
109-
TARGET libsycldevice-inc POST_BUILD
110-
COMMAND ${CMAKE_COMMAND} -E make_directory ${include_dir}/CL/sycl/devicelib
111-
COMMAND ${CMAKE_COMMAND} -E copy
112-
${CMAKE_CURRENT_SOURCE_DIR}/include/devicelib.h
113-
${include_dir}/CL/sycl/devicelib
114-
COMMAND ${CMAKE_COMMAND} -E copy
115-
${CMAKE_CURRENT_SOURCE_DIR}/include/assert.h
116-
${include_dir}/CL/sycl/devicelib
117-
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/include/devicelib.h
118-
${CMAKE_CURRENT_SOURCE_DIR}/include/assert.h)
119-
120106
add_custom_target(libsycldevice-obj DEPENDS
121107
${devicelib-obj-complex}
122108
${devicelib-obj-complex-fp64}
@@ -130,7 +116,7 @@ add_custom_target(libsycldevice-spv DEPENDS
130116
${binary_dir}/libsycl-fallback-cmath.spv
131117
${binary_dir}/libsycl-fallback-cmath-fp64.spv
132118
)
133-
add_custom_target(libsycldevice DEPENDS libsycldevice-inc libsycldevice-obj libsycldevice-spv)
119+
add_custom_target(libsycldevice DEPENDS libsycldevice-obj libsycldevice-spv)
134120

135121
# Place device libraries near the libsycl.so library in an install
136122
# directory as well
@@ -140,11 +126,6 @@ else()
140126
set(install_dest lib${LLVM_LIBDIR_SUFFIX})
141127
endif()
142128

143-
install(FILES ${include_dir}/CL/sycl/devicelib/devicelib.h
144-
${include_dir}/CL/sycl/devicelib/assert.h
145-
DESTINATION include/sycl/CL/sycl/devicelib
146-
COMPONENT libsycldevice)
147-
148129
install(FILES ${binary_dir}/libsycl-fallback-cassert.spv
149130
${devicelib-obj-complex}
150131
${binary_dir}/libsycl-fallback-complex.spv

libdevice/device.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@
1111

1212
// We need the following header to ensure the definition of all spirv variables
1313
// required by the wrapper libraries.
14-
#include "spirv_vars.hpp"
14+
//
15+
// Include from clang internal headers
16+
#include "devicelib/spirv_vars.h"
1517

1618
#ifdef __cplusplus
1719
#define EXTERN_C extern "C"

0 commit comments

Comments
 (0)