Author: Kunqiu Chen Date: 2025-07-02T20:08:01+08:00 New Revision: b720ebf8c4dc2e089df2c15a616e9771ed03a4c3
URL: https://github.com/llvm/llvm-project/commit/b720ebf8c4dc2e089df2c15a616e9771ed03a4c3 DIFF: https://github.com/llvm/llvm-project/commit/b720ebf8c4dc2e089df2c15a616e9771ed03a4c3.diff LOG: Revert "[TSan] Clarify and enforce shadow end alignment (#144648)" This reverts commit bc90166a50c4197b7666889c128e70c8f8fad2f3. Added: Modified: compiler-rt/lib/tsan/rtl/tsan_interface_java.cpp compiler-rt/lib/tsan/rtl/tsan_rtl.cpp compiler-rt/lib/tsan/rtl/tsan_rtl_access.cpp compiler-rt/lib/tsan/rtl/tsan_sync.cpp compiler-rt/test/tsan/java_heap_init2.cpp compiler-rt/test/tsan/munmap_clear_shadow.c Removed: ################################################################################ diff --git a/compiler-rt/lib/tsan/rtl/tsan_interface_java.cpp b/compiler-rt/lib/tsan/rtl/tsan_interface_java.cpp index cb4d767d903d3..7c15a16388268 100644 --- a/compiler-rt/lib/tsan/rtl/tsan_interface_java.cpp +++ b/compiler-rt/lib/tsan/rtl/tsan_interface_java.cpp @@ -122,6 +122,7 @@ void __tsan_java_move(jptr src, jptr dst, jptr size) { DCHECK_GE(dst, jctx->heap_begin); DCHECK_LE(dst + size, jctx->heap_begin + jctx->heap_size); DCHECK_NE(dst, src); + DCHECK_NE(size, 0); // Assuming it's not running concurrently with threads that do // memory accesses and mutex operations (stop-the-world phase). diff --git a/compiler-rt/lib/tsan/rtl/tsan_rtl.cpp b/compiler-rt/lib/tsan/rtl/tsan_rtl.cpp index 0d7247a56a4c2..981f37b89e784 100644 --- a/compiler-rt/lib/tsan/rtl/tsan_rtl.cpp +++ b/compiler-rt/lib/tsan/rtl/tsan_rtl.cpp @@ -566,32 +566,17 @@ static bool IsValidMmapRange(uptr addr, uptr size) { return false; } -void UnmapShadow(ThreadState* thr, uptr addr, uptr size) { +void UnmapShadow(ThreadState *thr, uptr addr, uptr size) { if (size == 0 || !IsValidMmapRange(addr, size)) return; - // unmap shadow is related to semantic of mmap/munmap, so we - // should clear the whole shadow range, including the tail shadow - // while addr + size % kShadowCell != 0. - uptr rounded_size_shadow = RoundUp(addr + size, kShadowCell) - addr; - DontNeedShadowFor(addr, rounded_size_shadow); + DontNeedShadowFor(addr, size); ScopedGlobalProcessor sgp; SlotLocker locker(thr, true); - uptr rounded_size_meta = RoundUp(addr + size, kMetaShadowCell) - addr; - ctx->metamap.ResetRange(thr->proc(), addr, rounded_size_meta, true); + ctx->metamap.ResetRange(thr->proc(), addr, size, true); } #endif void MapShadow(uptr addr, uptr size) { - // Although named MapShadow, this function's semantic is unrelated to - // UnmapShadow. This function currently only used for Go's lazy allocation - // of shadow, whose targets are program section (e.g., bss, data, etc.). - // Therefore, we can guarantee that the addr and size align to kShadowCell - // and kMetaShadowCell by the following assertions. - DCHECK_EQ(addr % kShadowCell, 0); - DCHECK_EQ(size % kShadowCell, 0); - DCHECK_EQ(addr % kMetaShadowCell, 0); - DCHECK_EQ(size % kMetaShadowCell, 0); - // Ensure thead registry lock held, so as to synchronize // with DoReset, which also access the mapped_shadow_* ctxt fields. ThreadRegistryLock lock0(&ctx->thread_registry); diff --git a/compiler-rt/lib/tsan/rtl/tsan_rtl_access.cpp b/compiler-rt/lib/tsan/rtl/tsan_rtl_access.cpp index 487fa490636eb..bd8deefefa1bc 100644 --- a/compiler-rt/lib/tsan/rtl/tsan_rtl_access.cpp +++ b/compiler-rt/lib/tsan/rtl/tsan_rtl_access.cpp @@ -688,18 +688,16 @@ void MemoryAccessRangeT(ThreadState* thr, uptr pc, uptr addr, uptr size) { DCHECK(IsShadowMem(shadow_mem)); } - uptr rounded_size = - (RoundUpTo(addr + size, kShadowCell) - RoundDownTo(addr, kShadowCell)); - RawShadow* shadow_mem_end = - shadow_mem + rounded_size / kShadowCell * kShadowCnt; - if (!IsShadowMem(shadow_mem_end - 1)) { - Printf("Bad shadow end addr: %p (%p)\n", shadow_mem_end - 1, + RawShadow* shadow_mem_end = reinterpret_cast<RawShadow*>( + reinterpret_cast<uptr>(shadow_mem) + size * kShadowMultiplier - 1); + if (!IsShadowMem(shadow_mem_end)) { + Printf("Bad shadow end addr: %p (%p)\n", shadow_mem_end, (void*)(addr + size - 1)); Printf( - "Shadow start addr (ok): %p (%p); size: 0x%zx; rounded_size: 0x%zx; " - "kShadowMultiplier: %zx\n", - shadow_mem, (void*)addr, size, rounded_size, kShadowMultiplier); - DCHECK(IsShadowMem(shadow_mem_end - 1)); + "Shadow start addr (ok): %p (%p); size: 0x%zx; kShadowMultiplier: " + "%zx\n", + shadow_mem, (void*)addr, size, kShadowMultiplier); + DCHECK(IsShadowMem(shadow_mem_end)); } #endif diff --git a/compiler-rt/lib/tsan/rtl/tsan_sync.cpp b/compiler-rt/lib/tsan/rtl/tsan_sync.cpp index be5829bc823dc..97335bc8ecf71 100644 --- a/compiler-rt/lib/tsan/rtl/tsan_sync.cpp +++ b/compiler-rt/lib/tsan/rtl/tsan_sync.cpp @@ -246,20 +246,6 @@ void MetaMap::MoveMemory(uptr src, uptr dst, uptr sz) { // there are no concurrent accesses to the regions (e.g. stop-the-world). CHECK_NE(src, dst); CHECK_NE(sz, 0); - - // The current MoveMemory implementation behaves incorrectly when src, dst, - // and sz are not aligned to kMetaShadowCell. - // For example, with kMetaShadowCell == 8: - // - src = 4: unexpectedly clears the metadata for the range [0, 4). - // - src = 16, dst = 4, size = 8: A sync variable for addr = 20, which should - // be moved to the metadata for address 8, is incorrectly moved to the - // metadata for address 0 instead. - // - src = 0, sz = 4: fails to move the tail metadata. - // Therefore, the following assertions is needed. - DCHECK_EQ(src % kMetaShadowCell, 0); - DCHECK_EQ(dst % kMetaShadowCell, 0); - DCHECK_EQ(sz % kMetaShadowCell, 0); - uptr diff = dst - src; u32 *src_meta, *dst_meta, *src_meta_end; uptr inc; diff --git a/compiler-rt/test/tsan/java_heap_init2.cpp b/compiler-rt/test/tsan/java_heap_init2.cpp index 3317a5b3c2f43..2e5724d930e8f 100644 --- a/compiler-rt/test/tsan/java_heap_init2.cpp +++ b/compiler-rt/test/tsan/java_heap_init2.cpp @@ -1,4 +1,5 @@ // RUN: %clangxx_tsan -O1 %s -o %t && %run %t 2>&1 | FileCheck %s +// XFAIL: * #include "java.h" #include <errno.h> diff --git a/compiler-rt/test/tsan/munmap_clear_shadow.c b/compiler-rt/test/tsan/munmap_clear_shadow.c index f48a12a4cc0cb..8a435a84258f5 100644 --- a/compiler-rt/test/tsan/munmap_clear_shadow.c +++ b/compiler-rt/test/tsan/munmap_clear_shadow.c @@ -1,4 +1,5 @@ // RUN: %clang_tsan %s -o %t && %run %t | FileCheck %s +// XFAIL: * #include "test.h" #include <assert.h> _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits