@@ -1400,9 +1400,6 @@ DECLARE_REAL(hsa_status_t, hsa_amd_ipc_memory_detach, void *mapped_ptr)
14001400DECLARE_REAL(hsa_status_t , hsa_amd_vmem_address_reserve_align, void ** ptr,
14011401 size_t size, uint64_t address, uint64_t alignment, uint64_t flags)
14021402DECLARE_REAL(hsa_status_t , hsa_amd_vmem_address_free, void * ptr, size_t size)
1403- DECLARE_REAL(hsa_status_t , hsa_amd_pointer_info, const void * ptr,
1404- hsa_amd_pointer_info_t * info, void * (*alloc)(size_t ),
1405- uint32_t* num_agents_accessible, hsa_agent_t** accessible)
14061403
14071404namespace __asan {
14081405
@@ -1457,16 +1454,23 @@ static struct AP32<LocalAddressSpaceView> AP_;
14571454
14581455hsa_status_t asan_hsa_amd_ipc_memory_create (void * ptr, size_t len,
14591456 hsa_amd_ipc_memory_t * handle) {
1460- void *ptr_;
1457+ static_assert (AP_.kMetadataSize == 0 , " Expression below requires this" );
1458+ void * ptr_ = get_allocator ().GetBlockBegin (ptr);
14611459 size_t len_ = get_allocator ().GetActuallyAllocatedSize (ptr);
1462- if (len_ && len_ != len) {
1463- static_assert (AP_.kMetadataSize == 0 , " Expression below requires this" );
1464- ptr_ = reinterpret_cast <void *>(reinterpret_cast <uptr>(ptr) - kPageSize_ );
1465- } else {
1466- ptr_ = ptr;
1467- len_ = len;
1460+
1461+ uptr p = reinterpret_cast <uptr>(ptr);
1462+ uptr p_ = reinterpret_cast <uptr>(ptr_);
1463+
1464+ if (p == p_)
1465+ return REAL (hsa_amd_ipc_memory_create)(ptr_, len_, handle);
1466+
1467+ if (p == p_ + kPageSize_ ) {
1468+ AsanChunk* m = instance.GetAsanChunkByAddr (p_);
1469+ if (m && len == m->UsedSize ())
1470+ return REAL (hsa_amd_ipc_memory_create)(ptr_, len_, handle);
1471+ return REAL (hsa_amd_ipc_memory_create)(ptr_, len, handle);
14681472 }
1469- return REAL (hsa_amd_ipc_memory_create)(ptr_, len_ , handle);
1473+ return REAL (hsa_amd_ipc_memory_create)(ptr, len , handle);
14701474}
14711475
14721476hsa_status_t asan_hsa_amd_ipc_memory_attach (const hsa_amd_ipc_memory_t *handle,
@@ -1543,15 +1547,5 @@ hsa_status_t asan_hsa_amd_vmem_address_free(void* ptr, size_t size,
15431547 }
15441548 return REAL (hsa_amd_vmem_address_free)(ptr, size);
15451549}
1546-
1547- hsa_status_t asan_hsa_amd_pointer_info (const void * ptr,
1548- hsa_amd_pointer_info_t * info,
1549- void * (*alloc)(size_t ),
1550- uint32_t * num_agents_accessible,
1551- hsa_agent_t ** accessible) {
1552- void * p = get_allocator ().GetBlockBegin (ptr);
1553- return REAL (hsa_amd_pointer_info)(p ? p : ptr, info, alloc,
1554- num_agents_accessible, accessible);
1555- }
15561550} // namespace __asan
15571551#endif
0 commit comments