summaryrefslogtreecommitdiff
path: root/compiler-rt/lib/tsan/rtl/tsan_interface_java.cpp
AgeCommit message (Collapse)Author
2025-07-02Reland [TSan] Clarify and enforce shadow end alignment (#146676)Kunqiu Chen
#144648 was reverted because it failed the new sanitizer test `munmap_clear_shadow.c` in IOS's CI. That issue could be fixed by disabling the test on some platforms, due to the incompatibility of the test on these platforms. In detail, we should disable the test in FreeBSD, Apple, NetBSD, Solaris, and Haiku, where `ReleaseMemoryPagesToOS` executes `madvise(beg, end, MADV_FREE)`, which tags the relevant pages as 'FREE' and does not release them immediately.
2025-07-02Revert "[TSan] Clarify and enforce shadow end alignment" (#146674)Kunqiu Chen
Reverts llvm/llvm-project#144648 due to a test failure of the new added test case `munmap_clear_shadow.c` in IOS .
2025-06-27[TSan] Clarify and enforce shadow end alignment (#144648)Kunqiu Chen
In TSan, every `k` bytes of application memory (where `k = 8`) maps to a single shadow/meta cell. This design leads to two distinct outcomes when calculating the end of a shadow range using `MemToShadow(addr_end)`, depending on the alignment of `addr_end`: - **Exclusive End:** If `addr_end` is aligned (`addr_end % k == 0`), `MemToShadow(addr_end)` points to the first shadow cell *past* the intended range. This address is an exclusive boundary marker, not a cell to be operated on. - **Inclusive End:** If `addr_end` is not aligned (`addr_end % k != 0`), `MemToShadow(addr_end)` points to the last shadow cell that *is* part of the range (i.e., the same cell as `MemToShadow(addr_end - 1)`). Different TSan functions have different expectations for whether the shadow end should be inclusive or exclusive. However, these expectations are not always explicitly enforced, which can lead to subtle bugs or reliance on unstated invariants. The core of this patch is to ensure that functions ONLY requiring an **exclusive shadow end** behave correctly. 1. Enforcing Existing Invariants: For functions like `MetaMap::MoveMemory` and `MapShadow`, the assumption is that the end address is always `k`-aligned. While this holds true in the current codebase (e.g., due to some external implicit conditions), this invariant is not guaranteed by the function's internal context. We add explicit assertions to make this requirement clear and to catch any future changes that might violate this assumption. 2. Fixing Latent Bugs: In other cases, unaligned end addresses are possible, representing a latent bug. This was the case in `UnmapShadow`. The `size` of a memory region being unmapped is not always a multiple of `k`. When this happens, `UnmapShadow` would fail to clear the final (tail) portion of the shadow memory. This patch fixes `UnmapShadow` by rounding up the `size` to the next multiple of `k` before clearing the shadow memory. This is safe because the underlying OS `unmap` operation is page-granular, and the page size is guaranteed to be a multiple of `k`. Notably, this fix makes `UnmapShadow` consistent with its inverse operation, `MemoryRangeImitateWriteOrResetRange`, which already performs a similar size round-up. In summary, this PR: - **Adds assertions** to `MetaMap::MoveMemory` and `MapShadow` to enforce their implicit requirement for k-aligned end addresses. - **Fixes a latent bug** in `UnmapShadow` by rounding up the size to ensure the entire shadow range is cleared. Two new test cases have been added to cover this scenario. - Removes a redundant assertion in `__tsan_java_move`. - Fixes an incorrect shadow end calculation introduced in commit 4052de6. The previous logic, while fixing an overestimation issue, did not properly account for `kShadowCell` alignment and could lead to underestimation.
2021-12-13tsan: new runtime (v3)Dmitry Vyukov
This change switches tsan to the new runtime which features: - 2x smaller shadow memory (2x of app memory) - faster fully vectorized race detection - small fixed-size vector clocks (512b) - fast vectorized vector clock operations - unlimited number of alive threads/goroutimes Depends on D112602. Reviewed By: melver Differential Revision: https://reviews.llvm.org/D112603
2021-12-09Revert "tsan: new runtime (v3)"Jonas Devlieghere
This reverts commit 5a33e412815b8847610425a2a3b86d2c7c313b71 becuase it breaks LLDB. https://green.lab.llvm.org/green/view/LLDB/job/lldb-cmake/39208/
2021-12-09tsan: new runtime (v3)Dmitry Vyukov
This change switches tsan to the new runtime which features: - 2x smaller shadow memory (2x of app memory) - faster fully vectorized race detection - small fixed-size vector clocks (512b) - fast vectorized vector clock operations - unlimited number of alive threads/goroutimes Depends on D112602. Reviewed By: melver Differential Revision: https://reviews.llvm.org/D112603
2021-12-01Revert "tsan: new runtime (v3)"Dmitry Vyukov
This reverts commit 66d4ce7e26a5ab00f7e4946b6e1bac8f805010fa. Chromium tests started failing: https://bugs.chromium.org/p/chromium/issues/detail?id=1275581
2021-11-25tsan: new runtime (v3)Dmitry Vyukov
This change switches tsan to the new runtime which features: - 2x smaller shadow memory (2x of app memory) - faster fully vectorized race detection - small fixed-size vector clocks (512b) - fast vectorized vector clock operations - unlimited number of alive threads/goroutimes Depends on D112602. Reviewed By: melver Differential Revision: https://reviews.llvm.org/D112603
2021-11-23Revert "tsan: new runtime (v3)"Weverything
This reverts commit ebd47b0fb78fa11758da6ffcd3e6b415cbb8fa28. This was causing unexpected behavior in programs.
2021-11-23tsan: new runtime (v3)Dmitry Vyukov
This change switches tsan to the new runtime which features: - 2x smaller shadow memory (2x of app memory) - faster fully vectorized race detection - small fixed-size vector clocks (512b) - fast vectorized vector clock operations - unlimited number of alive threads/goroutimes Differential Revision: https://reviews.llvm.org/D112603
2021-11-22Revert "tsan: new runtime (v3)"Dmitry Vyukov
Summary: This reverts commit 1784fe0532a69ead17793bced060a9bf9d232027. Broke some bots: https://lab.llvm.org/buildbot#builders/57/builds/12365 http://green.lab.llvm.org/green/job/clang-stage1-RA/25658/ Reviewers: vitalybuka, melver Subscribers:
2021-11-22tsan: new runtime (v3)Dmitry Vyukov
This change switches tsan to the new runtime which features: - 2x smaller shadow memory (2x of app memory) - faster fully vectorized race detection - small fixed-size vector clocks (512b) - fast vectorized vector clock operations - unlimited number of alive threads/goroutimes Depends on D112602. Reviewed By: melver Differential Revision: https://reviews.llvm.org/D112603
2021-11-12Revert "tsan: new runtime (v3)"Dmitry Vyukov
Summary: This reverts commit ac95b8d9548cb3c07e60236d3e9e1fd05f79579b. There is a number of bot failures: http://45.33.8.238/mac/38755/step_4.txt https://green.lab.llvm.org/green/view/LLDB/job/lldb-cmake/38135/consoleFull#-148886289949ba4694-19c4-4d7e-bec5-911270d8a58c Reviewers: vitalybuka, melver Subscribers:
2021-11-12tsan: new runtime (v3)Dmitry Vyukov
This change switches tsan to the new runtime which features: - 2x smaller shadow memory (2x of app memory) - faster fully vectorized race detection - small fixed-size vector clocks (512b) - fast vectorized vector clock operations - unlimited number of alive threads/goroutimes Depends on D112602. Reviewed By: melver Differential Revision: https://reviews.llvm.org/D112603
2021-09-22tsan: reset destination range in Java heap moveDmitry Vyukov
Switch Java heap move to the new scheme required for the new tsan runtime. Instead of copying the shadow we reset the destination range. The new v3 trace contains addresses of accesses, so we cannot simply copy the shadow. This can lead to false negatives, but cannot lead to false positives. Depends on D110159. Reviewed By: vitalybuka Differential Revision: https://reviews.llvm.org/D110190
2021-09-21tsan: fix debug format stringsDmitry Vyukov
Some of the DPrintf's currently produce -Wformat warnings if enabled. Fix these format strings. Reviewed By: melver Differential Revision: https://reviews.llvm.org/D110131
2021-08-05tsan: introduce RawShadow typeDmitry Vyukov
Currently we hardcode u64 type for shadow everywhere and do lots of uptr<->u64* casts. It makes it hard to change u64 to another type (e.g. u32) and makes it easy to introduce bugs. Introduce RawShadow type and use it in MemToShadow, ShadowToMem, IsShadowMem and throughout the code base as u64 replacement. This makes it possible to change u64 to something else in future and generally improves static typing. Depends on D107481. Reviewed By: vitalybuka Differential Revision: https://reviews.llvm.org/D107482
2021-08-03tsan: fix a typo in debug outputDmitry Vyukov
Reviewed By: vitalybuka Differential Revision: https://reviews.llvm.org/D107368
2021-07-29tsan: s/CHECK/DCHECK/ in tsan_interface_java.cppDmitry Vyukov
We are very paranoid with CHECKs in all Java entry points. These CHECKs were added along with Java support. At that point it wasn't clear what exactly to expect from JVM part and if JVM part is correct or not. Thus CHECK paranoia. These CHECKs never fired in practice, but we pay runtime cost in every entry point all the time. Replace CHECKs with DCHECKs. Depends on D107069. Reviewed By: melver Differential Revision: https://reviews.llvm.org/D107071
2021-07-29tsan: restore Initialize call in Java entry pointsDmitry Vyukov
We used to call Initialize in every Java point. That was removed in 6563bb53b5 ("tsan: don't use caller/current PC in Java interfaces"). The intention was to add a single Initialize to __tsan_java_init instead. Do that. Reviewed By: melver Differential Revision: https://reviews.llvm.org/D107069
2021-07-29tsan: remove /**/ at the of multi-line macrosDmitry Vyukov
Prefer code readability over writeability. Reviewed By: vitalybuka Differential Revision: https://reviews.llvm.org/D106982
2021-07-28tsan: don't use caller/current PC in Java interfacesDmitry Vyukov
Caller PC is plain harmful as native caller PC has nothing to do with Java code. Current PC is not particularly useful and may be somewhat confusing for Java users as it makes top frame to point to some magical __tsan function. But obtaining and using these PCs adds runtime cost for every java event. Remove these PCs. Rely only on official Java frames. It makes execution faster, code simpler and reports better. Depends on D106956. Reviewed By: vitalybuka Differential Revision: https://reviews.llvm.org/D106957
2021-07-28tsan: print alloc stack for Java objectsDmitry Vyukov
We maintain information about Java allocations, but for some reason never printed it in reports. Print it. Reviewed By: vitalybuka Differential Revision: https://reviews.llvm.org/D106956
2021-07-28tsan: remove unused pc argumentsDmitry Vyukov
Remove pc argument of ThreadIgnoreEnd, ThreadIgnoreSyncEnd and AcquireGlobal functions. It's unused and in some places we don't even have a pc and pass 0 anyway. Don't confuse readers and don't pretend that pc is needed and that passing 0 is somehow deficient. Use simpler convention for ThreadIgnoreBegin and ThreadIgnoreSyncBegin: accept only pc instread of pc+save_stack. 0 pc means "don't save stack". Reviewed By: vitalybuka Differential Revision: https://reviews.llvm.org/D106973
2021-07-23tsan: switch to the new sanitizer_common mutexDmitry Vyukov
Now that sanitizer_common mutex has feature-parity with tsan mutex, switch tsan to the sanitizer_common mutex and remove tsan's custom mutex. Reviewed By: vitalybuka, melver Differential Revision: https://reviews.llvm.org/D106379
2019-09-11Remove NOLINTs from compiler-rtVitaly Buka
llvm-svn: 371687
2019-08-01compiler-rt: Rename .cc file in lib/tsan/rtl to .cppNico Weber
Like r367463, but for tsan/rtl. llvm-svn: 367564