@@ -40,6 +40,9 @@ static const __SYCL_CONSTANT__ char __asan_print_shadow_value2[] =
4040static  __SYCL_CONSTANT__ const  char  __generic_to[] =
4141    " [kernel] %p(4) - %p(%d)\n " 
4242
43+ static  __SYCL_CONSTANT__ const  char  __asan_print_shadow_bound[] =
44+     " [kernel] addr: %p, shadow: %p, lower: %p, uppper: %p\n " 
45+ 
4346#define  ASAN_REPORT_NONE  0 
4447#define  ASAN_REPORT_START  1 
4548#define  ASAN_REPORT_FINISH  2 
@@ -67,6 +70,8 @@ struct DebugInfo {
6770
6871void  ReportUnknownDevice (const  DebugInfo *debug);
6972void  PrintShadowMemory (uptr addr, uptr shadow_address, uint32_t  as);
73+ void  SaveReport (ErrorType error_type, MemoryType memory_type, bool  is_recover,
74+                 const  DebugInfo *debug);
7075
7176__SYCL_GLOBAL__ void  *ToGlobal (void  *ptr) {
7277  return  __spirv_GenericCastToPtrExplicit_ToGlobal (ptr, 5 );
@@ -115,11 +120,22 @@ inline uptr MemToShadow_DG2(uptr addr, uint32_t as,
115120          launch_info->GlobalShadowOffset  + (addr >> ASAN_SHADOW_SCALE);
116121    }
117122
123+     if  (shadow_ptr < launch_info->GlobalShadowLowerBound  ||
124+         shadow_ptr > launch_info->GlobalShadowUpperBound ) {
125+       __spirv_ocl_printf (__asan_print_shadow_bound, addr, shadow_ptr,
126+                          launch_info->GlobalShadowLowerBound ,
127+                          launch_info->GlobalShadowUpperBound );
128+       SaveReport (ErrorType::OUT_OF_BOUNDS, MemoryType::GLOBAL, false , debug);
129+       return  0 ;
130+     }
131+ 
118132    ASAN_DEBUG (
119133        const  auto  shadow_offset_end = launch_info->GlobalShadowOffsetEnd ;
120134        if  (shadow_ptr > shadow_offset_end) {
121135          __spirv_ocl_printf (__global_shadow_out_of_bound, addr, shadow_ptr,
122136                             (uptr)launch_info->GlobalShadowOffset );
137+           SaveReport (ErrorType::OUT_OF_SHADOW_BOUNDS, MemoryType::GLOBAL, false ,
138+                      debug);
123139          return  0 ;
124140        });
125141
@@ -141,6 +157,8 @@ inline uptr MemToShadow_DG2(uptr addr, uint32_t as,
141157               if  (shadow_ptr > shadow_offset_end) {
142158                 __spirv_ocl_printf (__local_shadow_out_of_bound, addr,
143159                                    shadow_ptr, wid, (uptr)shadow_offset);
160+                  SaveReport (ErrorType::OUT_OF_SHADOW_BOUNDS, MemoryType::LOCAL,
161+                             false , debug);
144162                 return  0 ;
145163               });
146164    return  shadow_ptr;
@@ -167,8 +185,10 @@ inline uptr MemToShadow_DG2(uptr addr, uint32_t as,
167185    if  (shadow_ptr > shadow_offset_end) {
168186      __spirv_ocl_printf (__private_shadow_out_of_bound, addr, shadow_ptr, sid,
169187                         private_base);
188+       SaveReport (ErrorType::OUT_OF_SHADOW_BOUNDS, MemoryType::PRIVATE, false ,
189+                  debug);
170190      return  0 ;
171-     }; 
191+     }
172192
173193    return  shadow_ptr;
174194  }
@@ -193,11 +213,22 @@ inline uptr MemToShadow_PVC(uptr addr, uint32_t as,
193213                   ((addr & 0x7FFFFFFFFFFF ) >> ASAN_SHADOW_SCALE);
194214    }
195215
216+     if  (shadow_ptr < launch_info->GlobalShadowLowerBound  ||
217+         shadow_ptr > launch_info->GlobalShadowUpperBound ) {
218+       __spirv_ocl_printf (__asan_print_shadow_bound, addr, shadow_ptr,
219+                          launch_info->GlobalShadowLowerBound ,
220+                          launch_info->GlobalShadowUpperBound );
221+       SaveReport (ErrorType::OUT_OF_BOUNDS, MemoryType::GLOBAL, false , debug);
222+       return  0 ;
223+     }
224+ 
196225    ASAN_DEBUG (
197226        const  auto  shadow_offset_end = launch_info->GlobalShadowOffsetEnd ;
198227        if  (shadow_ptr > shadow_offset_end) {
199228          __spirv_ocl_printf (__global_shadow_out_of_bound, addr, shadow_ptr,
200229                             (uptr)launch_info->GlobalShadowOffset );
230+           SaveReport (ErrorType::OUT_OF_SHADOW_BOUNDS, MemoryType::GLOBAL, false ,
231+                      debug);
201232          return  0 ;
202233        });
203234    return  shadow_ptr;
@@ -218,6 +249,8 @@ inline uptr MemToShadow_PVC(uptr addr, uint32_t as,
218249               if  (shadow_ptr > shadow_offset_end) {
219250                 __spirv_ocl_printf (__local_shadow_out_of_bound, addr,
220251                                    shadow_ptr, wid, (uptr)shadow_offset);
252+                  SaveReport (ErrorType::OUT_OF_SHADOW_BOUNDS, MemoryType::LOCAL,
253+                             false , debug);
221254                 return  0 ;
222255               });
223256    return  shadow_ptr;
@@ -244,6 +277,8 @@ inline uptr MemToShadow_PVC(uptr addr, uint32_t as,
244277    if  (shadow_ptr > shadow_offset_end) {
245278      __spirv_ocl_printf (__private_shadow_out_of_bound, addr, shadow_ptr, sid,
246279                         private_base);
280+       SaveReport (ErrorType::OUT_OF_SHADOW_BOUNDS, MemoryType::PRIVATE, false ,
281+                  debug);
247282      return  0 ;
248283    };
249284
0 commit comments