"...Transforms/git@repo.hca.bsc.es:rferrer/llvm-epi-0.8.git" did not exist on "e68958fcdfb02296df153598c1610cefd915d51e"
[sanitizer][asan][win] Only unmap unneeded shadow memory on x86_64
D21942 / 1128db8f added support for committing shadow memory on demand on Win 64-bit. The reason it is not enabled on 32-bit wasn't clear but the page table overhead on Windows 7 may be a contributing factor. In `AsanMapUnmapCallback::OnUnmap`, `FlushUnneededASanShadowMemory` is called to release shadow memory. It calls `ReleaseMemoryPagesToOS`, which had been a no-op on Windows, until D95892 / 81b1d3da in which it was changed to unmap full pages that the memory region covers. This was done on both 32-bit and 64-bit. AddressSanitizerInterface.GetHeapSizeTest appears to fail on i686 targets as a side effect of this. This test allocates and frees a huge chunk of memory which causes shadow memory to be unmapped immediately. When the test allocates the chunk of memory a second time, asan tries to reuse the same shadow memory region, but because the shadow memory has now been unmapped, it causes an access violation and crashes the test. x86_64 is not affected, because the code that handles commiting shadow memory on demand also handles this situation, allowing the test to work without crashing. Therefore, this patch changes `FlushUnneededASanShadowMemory` on Windows to only release/unmap the shadow memory on x86_64 to stop this from happening on i686. Differential Revision: https://reviews.llvm.org/D149025
Loading
Please register or sign in to comment