@@ -55,6 +55,8 @@ __spirv_GenericCastToPtrExplicit_ToPrivate(void *, int);
5555
5656extern SYCL_EXTERNAL __attribute__ ((convergent)) void
5757__spirv_ControlBarrier(uint32_t Execution, uint32_t Memory, uint32_t Semantics);
58+
59+ extern " C" SYCL_EXTERNAL void __devicelib_exit ();
5860#endif // __USE_SPIR_BUILTIN__
5961
6062static const __SYCL_CONSTANT__ char __asan_shadow_value_start[] =
@@ -104,8 +106,8 @@ enum ADDRESS_SPACE : uint32_t {
104106
105107namespace {
106108
107- bool __asan_report_unknown_device ();
108- bool __asan_report_out_of_shadow_bounds ();
109+ void __asan_report_unknown_device ();
110+ void __asan_report_out_of_shadow_bounds ();
109111void __asan_print_shadow_memory (uptr addr, uptr shadow_address, uint32_t as);
110112
111113__SYCL_GLOBAL__ void *ToGlobal (void *ptr) {
@@ -182,10 +184,11 @@ inline uptr MemToShadow_DG2(uptr addr, uint32_t as) {
182184 ((addr & (slm_size - 1 )) >> ASAN_SHADOW_SCALE);
183185
184186 if (shadow_ptr > shadow_offset_end) {
185- if (__asan_report_out_of_shadow_bounds () ) {
187+ if (__AsanDebug ) {
186188 __spirv_ocl_printf (__local_shadow_out_of_bound, addr, shadow_ptr,
187189 wg_lid, (uptr)shadow_offset);
188190 }
191+ __asan_report_out_of_shadow_bounds ();
189192 return 0 ;
190193 }
191194 return shadow_ptr;
@@ -215,10 +218,11 @@ inline uptr MemToShadow_DG2(uptr addr, uint32_t as) {
215218 ((addr & (ASAN_PRIVATE_SIZE - 1 )) >> ASAN_SHADOW_SCALE);
216219
217220 if (shadow_ptr > shadow_offset_end) {
218- if (__asan_report_out_of_shadow_bounds () ) {
221+ if (__AsanDebug ) {
219222 __spirv_ocl_printf (__private_shadow_out_of_bound, addr, shadow_ptr,
220223 WG_LID, (uptr)shadow_offset);
221224 }
225+ __asan_report_out_of_shadow_bounds ();
222226 return 0 ;
223227 }
224228 return shadow_ptr;
@@ -245,10 +249,11 @@ inline uptr MemToShadow_PVC(uptr addr, uint32_t as) {
245249 }
246250
247251 if (shadow_ptr > __AsanShadowMemoryGlobalEnd) {
248- if (__asan_report_out_of_shadow_bounds () ) {
252+ if (__AsanDebug ) {
249253 __spirv_ocl_printf (__global_shadow_out_of_bound, addr, shadow_ptr,
250254 (uptr)__AsanShadowMemoryGlobalStart);
251255 }
256+ __asan_report_out_of_shadow_bounds ();
252257 return 0 ;
253258 }
254259 return shadow_ptr;
@@ -281,10 +286,11 @@ inline uptr MemToShadow_PVC(uptr addr, uint32_t as) {
281286 ((addr & (SLM_SIZE - 1 )) >> ASAN_SHADOW_SCALE);
282287
283288 if (shadow_ptr > shadow_offset_end) {
284- if (__asan_report_out_of_shadow_bounds () ) {
289+ if (__AsanDebug ) {
285290 __spirv_ocl_printf (__local_shadow_out_of_bound, addr, shadow_ptr,
286291 wg_lid, (uptr)shadow_offset);
287292 }
293+ __asan_report_out_of_shadow_bounds ();
288294 return 0 ;
289295 }
290296 return shadow_ptr;
@@ -314,10 +320,11 @@ inline uptr MemToShadow_PVC(uptr addr, uint32_t as) {
314320 ((addr & (ASAN_PRIVATE_SIZE - 1 )) >> ASAN_SHADOW_SCALE);
315321
316322 if (shadow_ptr > shadow_offset_end) {
317- if (__asan_report_out_of_shadow_bounds () ) {
323+ if (__AsanDebug ) {
318324 __spirv_ocl_printf (__private_shadow_out_of_bound, addr, shadow_ptr,
319325 WG_LID, (uptr)shadow_offset);
320326 }
327+ __asan_report_out_of_shadow_bounds ();
321328 return 0 ;
322329 }
323330 return shadow_ptr;
@@ -336,14 +343,13 @@ inline uptr MemToShadow(uptr addr, uint32_t as) {
336343 } else if (__DeviceType == DeviceType::GPU_DG2) {
337344 shadow_ptr = MemToShadow_DG2 (addr, as);
338345 } else {
339- if (__asan_report_unknown_device () && __AsanDebug) {
346+ if (__AsanDebug) {
340347 __spirv_ocl_printf (__asan_print_unsupport_device_type, (int )__DeviceType);
341348 }
342- return shadow_ptr;
349+ __asan_report_unknown_device ();
350+ return 0 ;
343351 }
344352
345- // FIXME: OCL "O2" optimizer doesn't work well with following code
346- #if 0
347353 if (__AsanDebug) {
348354 if (shadow_ptr) {
349355 if (as == ADDRESS_SPACE_PRIVATE)
@@ -355,7 +361,6 @@ inline uptr MemToShadow(uptr addr, uint32_t as) {
355361 __spirv_ocl_printf (__asan_print_shadow_value2, addr, as, shadow_ptr);
356362 }
357363 }
358- #endif
359364
360365 return shadow_ptr;
361366}
@@ -398,7 +403,7 @@ bool MemIsZero(__SYCL_GLOBAL__ const char *beg, uptr size) {
398403static __SYCL_CONSTANT__ const char __mem_sanitizer_report[] =
399404 " [kernel] SanitizerReport (ErrorType=%d, IsRecover=%d)\n " ;
400405
401- bool __asan_internal_report_save (DeviceSanitizerErrorType error_type) {
406+ void __asan_internal_report_save (DeviceSanitizerErrorType error_type) {
402407 const int Expected = ASAN_REPORT_NONE;
403408 int Desired = ASAN_REPORT_START;
404409
@@ -423,12 +428,11 @@ bool __asan_internal_report_save(DeviceSanitizerErrorType error_type) {
423428 if (__AsanDebug)
424429 __spirv_ocl_printf (__mem_sanitizer_report, SanitizerReport.ErrorType ,
425430 SanitizerReport.IsRecover );
426- return true ;
427431 }
428- return false ;
432+ __devicelib_exit () ;
429433}
430434
431- bool __asan_internal_report_save (
435+ void __asan_internal_report_save (
432436 uptr ptr, uint32_t as, const char __SYCL_CONSTANT__ *file, uint32_t line,
433437 const char __SYCL_CONSTANT__ *func, bool is_write, uint32_t access_size,
434438 DeviceSanitizerMemoryType memory_type, DeviceSanitizerErrorType error_type,
@@ -505,9 +509,8 @@ bool __asan_internal_report_save(
505509 if (__AsanDebug)
506510 __spirv_ocl_printf (__mem_sanitizer_report, SanitizerReport.ErrorType ,
507511 SanitizerReport.IsRecover );
508- return true ;
509512 }
510- return false ;
513+ __devicelib_exit () ;
511514}
512515
513516// /
@@ -575,6 +578,9 @@ void __asan_report_access_error(uptr addr, uint32_t as, size_t size,
575578 case kUsmSharedDeallocatedMagic :
576579 error_type = DeviceSanitizerErrorType::USE_AFTER_FREE;
577580 break ;
581+ case kNullPointerRedzoneMagic :
582+ error_type = DeviceSanitizerErrorType::NULL_POINTER;
583+ break ;
578584 default :
579585 error_type = DeviceSanitizerErrorType::UNKNOWN;
580586 }
@@ -604,13 +610,12 @@ void __asan_report_misalign_error(uptr addr, uint32_t as, size_t size,
604610 memory_type, error_type, is_recover);
605611}
606612
607- bool __asan_report_unknown_device () {
608- return __asan_internal_report_save (DeviceSanitizerErrorType::UNKNOWN_DEVICE);
613+ void __asan_report_unknown_device () {
614+ __asan_internal_report_save (DeviceSanitizerErrorType::UNKNOWN_DEVICE);
609615}
610616
611- bool __asan_report_out_of_shadow_bounds () {
612- return __asan_internal_report_save (
613- DeviceSanitizerErrorType::OUT_OF_SHADOW_BOUNDS);
617+ void __asan_report_out_of_shadow_bounds () {
618+ __asan_internal_report_save (DeviceSanitizerErrorType::OUT_OF_SHADOW_BOUNDS);
614619}
615620
616621// /
0 commit comments