@@ -83,6 +83,10 @@ static __SYCL_CONSTANT__ const char __generic_to[] =
83
83
static __SYCL_CONSTANT__ const char __generic_to_fail[] =
84
84
" [kernel] %p(4) - unknown address space\n " ;
85
85
86
+ static __SYCL_CONSTANT__ const char __mem_launch_info[] =
87
+ " [kernel] launch_info: %p (local_shadow=%p~%p, numLocalArgs=%d, "
88
+ " localArgs=%p)\n " ;
89
+
86
90
#define ASAN_REPORT_NONE 0
87
91
#define ASAN_REPORT_START 1
88
92
#define ASAN_REPORT_FINISH 2
@@ -111,56 +115,120 @@ __SYCL_PRIVATE__ void *ToPrivate(void *ptr) {
111
115
return __spirv_GenericCastToPtrExplicit_ToPrivate (ptr, 7 );
112
116
}
113
117
118
+ inline bool ConvertGenericPointer (uptr &addr, uint32_t &as) {
119
+ auto old = addr;
120
+ if ((addr = (uptr)ToPrivate ((void *)old))) {
121
+ as = ADDRESS_SPACE_PRIVATE;
122
+ } else if ((addr = (uptr)ToLocal ((void *)old))) {
123
+ as = ADDRESS_SPACE_LOCAL;
124
+ } else if ((addr = (uptr)ToGlobal ((void *)old))) {
125
+ as = ADDRESS_SPACE_GLOBAL;
126
+ } else {
127
+ if (__AsanDebug)
128
+ __spirv_ocl_printf (__generic_to_fail, old);
129
+ return false ;
130
+ }
131
+ if (__AsanDebug)
132
+ __spirv_ocl_printf (__generic_to, old, addr, as);
133
+ return true ;
134
+ }
135
+
114
136
inline uptr MemToShadow_CPU (uptr addr) {
115
137
return __AsanShadowMemoryGlobalStart + (addr >> ASAN_SHADOW_SCALE);
116
138
}
117
139
118
140
inline uptr MemToShadow_DG2 (uptr addr, uint32_t as) {
119
- uptr shadow_ptr = 0 ;
120
- if (addr & (~0xffffffffffff )) {
121
- shadow_ptr = (((addr & 0xffffffffffff ) >> ASAN_SHADOW_SCALE) +
122
- __AsanShadowMemoryGlobalStart) |
123
- (~0xffffffffffff );
124
- } else {
125
- shadow_ptr = (addr >> ASAN_SHADOW_SCALE) + __AsanShadowMemoryGlobalStart;
141
+ if (as == ADDRESS_SPACE_GENERIC) {
142
+ if (!ConvertGenericPointer (addr, as)) {
143
+ return 0 ;
144
+ }
126
145
}
127
146
128
- if (shadow_ptr > __AsanShadowMemoryGlobalEnd) {
129
- if (__asan_report_out_of_shadow_bounds ()) {
130
- __spirv_ocl_printf (__global_shadow_out_of_bound, addr, shadow_ptr);
147
+ if (as == ADDRESS_SPACE_GLOBAL) { // global
148
+ if (addr & 0xFFFF000000000000ULL ) { // Device USM
149
+ return __AsanShadowMemoryGlobalStart + 0x80000000000ULL +
150
+ ((addr & 0x7FFFFFFFFFFFULL ) >> ASAN_SHADOW_SCALE);
151
+ } else { // Host/Shared USM
152
+ return __AsanShadowMemoryGlobalStart + (addr >> ASAN_SHADOW_SCALE);
131
153
}
132
- }
154
+ } else if (as == ADDRESS_SPACE_LOCAL) { // local
155
+ // The size of SLM is 64KB on DG2
156
+ constexpr unsigned slm_size = 64 * 1024 ;
157
+ const auto wg_lid =
158
+ __spirv_BuiltInWorkgroupId.x * __spirv_BuiltInNumWorkgroups.y *
159
+ __spirv_BuiltInNumWorkgroups.z +
160
+ __spirv_BuiltInWorkgroupId.y * __spirv_BuiltInNumWorkgroups.z +
161
+ __spirv_BuiltInWorkgroupId.z ;
133
162
134
- return shadow_ptr;
135
- }
163
+ auto launch_info = (__SYCL_GLOBAL__ const LaunchInfo *)__AsanLaunchInfo;
164
+ const auto shadow_offset = launch_info->LocalShadowOffset ;
165
+ const auto shadow_offset_end = launch_info->LocalShadowOffsetEnd ;
136
166
137
- static __SYCL_CONSTANT__ const char __mem_launch_info[] =
138
- " [kernel] launch_info: %p (local_shadow=%p~%p, numLocalArgs=%d, "
139
- " localArgs=%p) \n " ;
167
+ if (shadow_offset == 0 ) {
168
+ return 0 ;
169
+ }
140
170
141
- static __SYCL_CONSTANT__ const char __generic_to[] =
142
- " [kernel] %p(4) - %p(%d)\n " ;
171
+ if (__AsanDebug)
172
+ __spirv_ocl_printf (__mem_launch_info, launch_info,
173
+ launch_info->LocalShadowOffset ,
174
+ launch_info->LocalShadowOffsetEnd ,
175
+ launch_info->NumLocalArgs , launch_info->LocalArgs );
143
176
144
- static __SYCL_CONSTANT__ const char __generic_to_fail[] =
145
- " [kernel] %p(4) - unknown address space\n " ;
177
+ auto shadow_ptr = shadow_offset +
178
+ ((wg_lid * slm_size) >> ASAN_SHADOW_SCALE) +
179
+ ((addr & (slm_size - 1 )) >> ASAN_SHADOW_SCALE);
146
180
147
- inline uptr MemToShadow_PVC (uptr addr, uint32_t as) {
181
+ if (shadow_ptr > shadow_offset_end) {
182
+ if (__asan_report_out_of_shadow_bounds ()) {
183
+ __spirv_ocl_printf (__local_shadow_out_of_bound, addr, shadow_ptr,
184
+ wg_lid, (uptr)shadow_offset);
185
+ }
186
+ return 0 ;
187
+ }
188
+ return shadow_ptr;
189
+ } else if (as == ADDRESS_SPACE_PRIVATE) { // private
190
+ // work-group linear id
191
+ const auto WG_LID =
192
+ __spirv_BuiltInWorkgroupId.x * __spirv_BuiltInNumWorkgroups.y *
193
+ __spirv_BuiltInNumWorkgroups.z +
194
+ __spirv_BuiltInWorkgroupId.y * __spirv_BuiltInNumWorkgroups.z +
195
+ __spirv_BuiltInWorkgroupId.z ;
148
196
149
- if (as == ADDRESS_SPACE_GENERIC) {
150
- auto old = addr;
151
- if ((addr = (uptr)ToPrivate ((void *)old))) {
152
- as = ADDRESS_SPACE_PRIVATE;
153
- } else if ((addr = (uptr)ToLocal ((void *)old))) {
154
- as = ADDRESS_SPACE_LOCAL;
155
- } else if ((addr = (uptr)ToGlobal ((void *)old))) {
156
- as = ADDRESS_SPACE_GLOBAL;
157
- } else {
158
- if (__AsanDebug)
159
- __spirv_ocl_printf (__generic_to_fail, old);
197
+ auto launch_info = (__SYCL_GLOBAL__ const LaunchInfo *)__AsanLaunchInfo;
198
+ const auto shadow_offset = launch_info->PrivateShadowOffset ;
199
+ const auto shadow_offset_end = launch_info->LocalShadowOffsetEnd ;
200
+
201
+ if (shadow_offset == 0 ) {
160
202
return 0 ;
161
203
}
204
+
162
205
if (__AsanDebug)
163
- __spirv_ocl_printf (__generic_to, old, addr, as);
206
+ __spirv_ocl_printf (__mem_launch_info, launch_info,
207
+ launch_info->PrivateShadowOffset , 0 ,
208
+ launch_info->NumLocalArgs , launch_info->LocalArgs );
209
+
210
+ uptr shadow_ptr = shadow_offset +
211
+ ((WG_LID * ASAN_PRIVATE_SIZE) >> ASAN_SHADOW_SCALE) +
212
+ ((addr & (ASAN_PRIVATE_SIZE - 1 )) >> ASAN_SHADOW_SCALE);
213
+
214
+ if (shadow_ptr > shadow_offset_end) {
215
+ if (__asan_report_out_of_shadow_bounds ()) {
216
+ __spirv_ocl_printf (__private_shadow_out_of_bound, addr, shadow_ptr,
217
+ WG_LID, (uptr)shadow_offset);
218
+ }
219
+ return 0 ;
220
+ }
221
+ return shadow_ptr;
222
+ }
223
+
224
+ return 0 ;
225
+ }
226
+
227
+ inline uptr MemToShadow_PVC (uptr addr, uint32_t as) {
228
+ if (as == ADDRESS_SPACE_GENERIC) {
229
+ if (!ConvertGenericPointer (addr, as)) {
230
+ return 0 ;
231
+ }
164
232
}
165
233
166
234
if (as == ADDRESS_SPACE_GLOBAL) { // global
@@ -262,6 +330,8 @@ inline uptr MemToShadow(uptr addr, uint32_t as) {
262
330
shadow_ptr = MemToShadow_CPU (addr);
263
331
} else if (__DeviceType == DeviceType::GPU_PVC) {
264
332
shadow_ptr = MemToShadow_PVC (addr, as);
333
+ } else if (__DeviceType == DeviceType::GPU_DG2) {
334
+ shadow_ptr = MemToShadow_DG2 (addr, as);
265
335
} else {
266
336
if (__asan_report_unknown_device () && __AsanDebug) {
267
337
__spirv_ocl_printf (__asan_print_unsupport_device_type, (int )__DeviceType);
0 commit comments