head 1.4; access; symbols netbsd-11-0-RC5:1.3 netbsd-11-0-RC4:1.3 netbsd-11-0-RC3:1.3 netbsd-11-0-RC2:1.3 netbsd-11-0-RC1:1.3 gcc-14-3-0:1.1.1.3 perseant-exfatfs-base-20250801:1.3 netbsd-11:1.3.0.4 netbsd-11-base:1.3 gcc-12-5-0:1.1.1.2 perseant-exfatfs-base-20240630:1.3 gcc-12-4-0:1.1.1.2 perseant-exfatfs:1.3.0.2 perseant-exfatfs-base:1.3 gcc-12-3-0:1.1.1.2 gcc-10-5-0:1.1.1.1 gcc-10-4-0:1.1.1.1 cjep_sun2x:1.2.0.4 cjep_sun2x-base:1.2 cjep_staticlib_x-base1:1.2 cjep_staticlib_x:1.2.0.2 cjep_staticlib_x-base:1.2 gcc-10-3-0:1.1.1.1 FSF:1.1.1; locks; strict; comment @// @; 1.4 date 2025.09.14.00.08.58; author mrg; state Exp; branches; next 1.3; commitid x9D5QEnvbeMI4CaG; 1.3 date 2023.07.31.01.44.57; author mrg; state Exp; branches; next 1.2; commitid q79F5Opf0FLsyTyE; 1.2 date 2021.04.11.23.54.28; author mrg; state dead; branches; next 1.1; commitid wJn7ggfUTEMOWVOC; 1.1 date 2021.04.10.22.09.22; author mrg; state Exp; branches 1.1.1.1; next ; commitid eC4g0MRpqTvEkNOC; 1.1.1.1 date 2021.04.10.22.09.22; author mrg; state Exp; branches; next 1.1.1.2; commitid eC4g0MRpqTvEkNOC; 1.1.1.2 date 2023.07.30.05.20.41; author mrg; state Exp; branches; next 1.1.1.3; commitid tk6nV4mbc9nVEMyE; 1.1.1.3 date 2025.09.13.23.45.04; author mrg; state Exp; branches; next ; commitid KwhwN4krNWa6XBaG; desc @@ 1.4 log @merge GCC 14.3.0. @ text @//===-- tsan_interface_java.cpp -------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // This file is a part of ThreadSanitizer (TSan), a race detector. // //===----------------------------------------------------------------------===// #include "tsan_interface_java.h" #include "tsan_rtl.h" #include "sanitizer_common/sanitizer_internal_defs.h" #include "sanitizer_common/sanitizer_common.h" #include "sanitizer_common/sanitizer_placement_new.h" #include "sanitizer_common/sanitizer_stacktrace.h" #include "sanitizer_common/sanitizer_procmaps.h" using namespace __tsan; const jptr kHeapAlignment = 8; namespace __tsan { struct JavaContext { const uptr heap_begin; const uptr heap_size; JavaContext(jptr heap_begin, jptr heap_size) : heap_begin(heap_begin) , heap_size(heap_size) { } }; static u64 jctx_buf[sizeof(JavaContext) / sizeof(u64) + 1]; static JavaContext *jctx; MBlock *JavaHeapBlock(uptr addr, uptr *start) { if (!jctx || addr < jctx->heap_begin || addr >= jctx->heap_begin + jctx->heap_size) return nullptr; for (uptr p = RoundDown(addr, kMetaShadowCell); p >= jctx->heap_begin; p -= kMetaShadowCell) { MBlock *b = ctx->metamap.GetBlock(p); if (!b) continue; if (p + b->siz <= addr) return nullptr; *start = p; return b; } return nullptr; } } // namespace __tsan #define JAVA_FUNC_ENTER(func) \ ThreadState *thr = cur_thread(); \ (void)thr; void __tsan_java_init(jptr heap_begin, jptr heap_size) { JAVA_FUNC_ENTER(__tsan_java_init); Initialize(thr); DPrintf("#%d: java_init(0x%zx, 0x%zx)\n", thr->tid, heap_begin, heap_size); DCHECK_EQ(jctx, 0); DCHECK_GT(heap_begin, 0); DCHECK_GT(heap_size, 0); DCHECK_EQ(heap_begin % kHeapAlignment, 0); DCHECK_EQ(heap_size % kHeapAlignment, 0); DCHECK_LT(heap_begin, heap_begin + heap_size); jctx = new(jctx_buf) JavaContext(heap_begin, heap_size); } int __tsan_java_fini() { JAVA_FUNC_ENTER(__tsan_java_fini); DPrintf("#%d: java_fini()\n", thr->tid); DCHECK_NE(jctx, 0); // FIXME(dvyukov): this does not call atexit() callbacks. int status = Finalize(thr); DPrintf("#%d: java_fini() = %d\n", thr->tid, status); return status; } void __tsan_java_alloc(jptr ptr, jptr size) { JAVA_FUNC_ENTER(__tsan_java_alloc); DPrintf("#%d: java_alloc(0x%zx, 0x%zx)\n", thr->tid, ptr, size); DCHECK_NE(jctx, 0); DCHECK_NE(size, 0); DCHECK_EQ(ptr % kHeapAlignment, 0); DCHECK_EQ(size % kHeapAlignment, 0); DCHECK_GE(ptr, jctx->heap_begin); DCHECK_LE(ptr + size, jctx->heap_begin + jctx->heap_size); OnUserAlloc(thr, 0, ptr, size, false); } void __tsan_java_free(jptr ptr, jptr size) { JAVA_FUNC_ENTER(__tsan_java_free); DPrintf("#%d: java_free(0x%zx, 0x%zx)\n", thr->tid, ptr, size); DCHECK_NE(jctx, 0); DCHECK_NE(size, 0); DCHECK_EQ(ptr % kHeapAlignment, 0); DCHECK_EQ(size % kHeapAlignment, 0); DCHECK_GE(ptr, jctx->heap_begin); DCHECK_LE(ptr + size, jctx->heap_begin + jctx->heap_size); ctx->metamap.FreeRange(thr->proc(), ptr, size, false); } void __tsan_java_move(jptr src, jptr dst, jptr size) { JAVA_FUNC_ENTER(__tsan_java_move); DPrintf("#%d: java_move(0x%zx, 0x%zx, 0x%zx)\n", thr->tid, src, dst, size); DCHECK_NE(jctx, 0); DCHECK_NE(size, 0); DCHECK_EQ(src % kHeapAlignment, 0); DCHECK_EQ(dst % kHeapAlignment, 0); DCHECK_EQ(size % kHeapAlignment, 0); DCHECK_GE(src, jctx->heap_begin); DCHECK_LE(src + size, jctx->heap_begin + jctx->heap_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). ctx->metamap.MoveMemory(src, dst, size); // Clear the destination shadow range. // We used to move shadow from src to dst, but the trace format does not // support that anymore as it contains addresses of accesses. RawShadow *d = MemToShadow(dst); RawShadow *dend = MemToShadow(dst + size); ShadowSet(d, dend, Shadow::kEmpty); } jptr __tsan_java_find(jptr *from_ptr, jptr to) { JAVA_FUNC_ENTER(__tsan_java_find); DPrintf("#%d: java_find(&0x%zx, 0x%zx)\n", thr->tid, *from_ptr, to); DCHECK_EQ((*from_ptr) % kHeapAlignment, 0); DCHECK_EQ(to % kHeapAlignment, 0); DCHECK_GE(*from_ptr, jctx->heap_begin); DCHECK_LE(to, jctx->heap_begin + jctx->heap_size); for (uptr from = *from_ptr; from < to; from += kHeapAlignment) { MBlock *b = ctx->metamap.GetBlock(from); if (b) { *from_ptr = from; return b->siz; } } return 0; } void __tsan_java_finalize() { JAVA_FUNC_ENTER(__tsan_java_finalize); DPrintf("#%d: java_finalize()\n", thr->tid); AcquireGlobal(thr); } void __tsan_java_mutex_lock(jptr addr) { JAVA_FUNC_ENTER(__tsan_java_mutex_lock); DPrintf("#%d: java_mutex_lock(0x%zx)\n", thr->tid, addr); DCHECK_NE(jctx, 0); DCHECK_GE(addr, jctx->heap_begin); DCHECK_LT(addr, jctx->heap_begin + jctx->heap_size); MutexPostLock(thr, 0, addr, MutexFlagLinkerInit | MutexFlagWriteReentrant | MutexFlagDoPreLockOnPostLock); } void __tsan_java_mutex_unlock(jptr addr) { JAVA_FUNC_ENTER(__tsan_java_mutex_unlock); DPrintf("#%d: java_mutex_unlock(0x%zx)\n", thr->tid, addr); DCHECK_NE(jctx, 0); DCHECK_GE(addr, jctx->heap_begin); DCHECK_LT(addr, jctx->heap_begin + jctx->heap_size); MutexUnlock(thr, 0, addr); } void __tsan_java_mutex_read_lock(jptr addr) { JAVA_FUNC_ENTER(__tsan_java_mutex_read_lock); DPrintf("#%d: java_mutex_read_lock(0x%zx)\n", thr->tid, addr); DCHECK_NE(jctx, 0); DCHECK_GE(addr, jctx->heap_begin); DCHECK_LT(addr, jctx->heap_begin + jctx->heap_size); MutexPostReadLock(thr, 0, addr, MutexFlagLinkerInit | MutexFlagWriteReentrant | MutexFlagDoPreLockOnPostLock); } void __tsan_java_mutex_read_unlock(jptr addr) { JAVA_FUNC_ENTER(__tsan_java_mutex_read_unlock); DPrintf("#%d: java_mutex_read_unlock(0x%zx)\n", thr->tid, addr); DCHECK_NE(jctx, 0); DCHECK_GE(addr, jctx->heap_begin); DCHECK_LT(addr, jctx->heap_begin + jctx->heap_size); MutexReadUnlock(thr, 0, addr); } void __tsan_java_mutex_lock_rec(jptr addr, int rec) { JAVA_FUNC_ENTER(__tsan_java_mutex_lock_rec); DPrintf("#%d: java_mutex_lock_rec(0x%zx, %d)\n", thr->tid, addr, rec); DCHECK_NE(jctx, 0); DCHECK_GE(addr, jctx->heap_begin); DCHECK_LT(addr, jctx->heap_begin + jctx->heap_size); DCHECK_GT(rec, 0); MutexPostLock(thr, 0, addr, MutexFlagLinkerInit | MutexFlagWriteReentrant | MutexFlagDoPreLockOnPostLock | MutexFlagRecursiveLock, rec); } int __tsan_java_mutex_unlock_rec(jptr addr) { JAVA_FUNC_ENTER(__tsan_java_mutex_unlock_rec); DPrintf("#%d: java_mutex_unlock_rec(0x%zx)\n", thr->tid, addr); DCHECK_NE(jctx, 0); DCHECK_GE(addr, jctx->heap_begin); DCHECK_LT(addr, jctx->heap_begin + jctx->heap_size); return MutexUnlock(thr, 0, addr, MutexFlagRecursiveUnlock); } void __tsan_java_acquire(jptr addr) { JAVA_FUNC_ENTER(__tsan_java_acquire); DPrintf("#%d: java_acquire(0x%zx)\n", thr->tid, addr); DCHECK_NE(jctx, 0); DCHECK_GE(addr, jctx->heap_begin); DCHECK_LT(addr, jctx->heap_begin + jctx->heap_size); Acquire(thr, 0, addr); } void __tsan_java_release(jptr addr) { JAVA_FUNC_ENTER(__tsan_java_release); DPrintf("#%d: java_release(0x%zx)\n", thr->tid, addr); DCHECK_NE(jctx, 0); DCHECK_GE(addr, jctx->heap_begin); DCHECK_LT(addr, jctx->heap_begin + jctx->heap_size); Release(thr, 0, addr); } void __tsan_java_release_store(jptr addr) { JAVA_FUNC_ENTER(__tsan_java_release); DPrintf("#%d: java_release_store(0x%zx)\n", thr->tid, addr); DCHECK_NE(jctx, 0); DCHECK_GE(addr, jctx->heap_begin); DCHECK_LT(addr, jctx->heap_begin + jctx->heap_size); ReleaseStore(thr, 0, addr); } @ 1.3 log @make this actually be GCC 12.3.0's libsanitizer. the libsanitizer we used with GCC 9 and GCC 10 was significantly ahead of the GCC 9 and GCC 10 provided versions. @ text @d109 1 a109 1 ctx->metamap.FreeRange(thr->proc(), ptr, size); d136 1 a136 1 internal_memset(d, 0, (dend - d) * sizeof(*d)); @ 1.2 log @revert sanitizer back to the version we were using with GCC 9, since that one was already newer than the GCC 10 version. @ text @a14 1 #include "tsan_mutex.h" d37 2 a38 7 class ScopedJavaFunc { public: ScopedJavaFunc(ThreadState *thr, uptr pc) : thr_(thr) { Initialize(thr_); FuncEntry(thr, pc); } d40 13 a52 3 ~ScopedJavaFunc() { FuncExit(thr_); // FIXME(dvyukov): process pending signals. d54 2 a55 7 private: ThreadState *thr_; }; static u64 jctx_buf[sizeof(JavaContext) / sizeof(u64) + 1]; static JavaContext *jctx; d59 1 a59 1 #define SCOPED_JAVA_FUNC(func) \ d61 1 a61 5 const uptr caller_pc = GET_CALLER_PC(); \ const uptr pc = StackTrace::GetCurrentPc(); \ (void)pc; \ ScopedJavaFunc scoped(thr, caller_pc); \ /**/ d64 9 a72 8 SCOPED_JAVA_FUNC(__tsan_java_init); DPrintf("#%d: java_init(%p, %p)\n", thr->tid, heap_begin, heap_size); CHECK_EQ(jctx, 0); CHECK_GT(heap_begin, 0); CHECK_GT(heap_size, 0); CHECK_EQ(heap_begin % kHeapAlignment, 0); CHECK_EQ(heap_size % kHeapAlignment, 0); CHECK_LT(heap_begin, heap_begin + heap_size); d77 1 a77 1 SCOPED_JAVA_FUNC(__tsan_java_fini); d79 1 a79 1 CHECK_NE(jctx, 0); d87 8 a94 8 SCOPED_JAVA_FUNC(__tsan_java_alloc); DPrintf("#%d: java_alloc(%p, %p)\n", thr->tid, ptr, size); CHECK_NE(jctx, 0); CHECK_NE(size, 0); CHECK_EQ(ptr % kHeapAlignment, 0); CHECK_EQ(size % kHeapAlignment, 0); CHECK_GE(ptr, jctx->heap_begin); CHECK_LE(ptr + size, jctx->heap_begin + jctx->heap_size); d96 1 a96 1 OnUserAlloc(thr, pc, ptr, size, false); d100 8 a107 8 SCOPED_JAVA_FUNC(__tsan_java_free); DPrintf("#%d: java_free(%p, %p)\n", thr->tid, ptr, size); CHECK_NE(jctx, 0); CHECK_NE(size, 0); CHECK_EQ(ptr % kHeapAlignment, 0); CHECK_EQ(size % kHeapAlignment, 0); CHECK_GE(ptr, jctx->heap_begin); CHECK_LE(ptr + size, jctx->heap_begin + jctx->heap_size); d113 13 a125 13 SCOPED_JAVA_FUNC(__tsan_java_move); DPrintf("#%d: java_move(%p, %p, %p)\n", thr->tid, src, dst, size); CHECK_NE(jctx, 0); CHECK_NE(size, 0); CHECK_EQ(src % kHeapAlignment, 0); CHECK_EQ(dst % kHeapAlignment, 0); CHECK_EQ(size % kHeapAlignment, 0); CHECK_GE(src, jctx->heap_begin); CHECK_LE(src + size, jctx->heap_begin + jctx->heap_size); CHECK_GE(dst, jctx->heap_begin); CHECK_LE(dst + size, jctx->heap_begin + jctx->heap_size); CHECK_NE(dst, src); CHECK_NE(size, 0); d131 6 a136 15 // Move shadow. u64 *s = (u64*)MemToShadow(src); u64 *d = (u64*)MemToShadow(dst); u64 *send = (u64*)MemToShadow(src + size); uptr inc = 1; if (dst > src) { s = (u64*)MemToShadow(src + size) - 1; d = (u64*)MemToShadow(dst + size) - 1; send = (u64*)MemToShadow(src) - 1; inc = -1; } for (; s != send; s += inc, d += inc) { *d = *s; *s = 0; } d140 6 a145 6 SCOPED_JAVA_FUNC(__tsan_java_find); DPrintf("#%d: java_find(&%p, %p)\n", *from_ptr, to); CHECK_EQ((*from_ptr) % kHeapAlignment, 0); CHECK_EQ(to % kHeapAlignment, 0); CHECK_GE(*from_ptr, jctx->heap_begin); CHECK_LE(to, jctx->heap_begin + jctx->heap_size); d157 3 a159 3 SCOPED_JAVA_FUNC(__tsan_java_finalize); DPrintf("#%d: java_mutex_finalize()\n", thr->tid); AcquireGlobal(thr, 0); d163 9 a171 8 SCOPED_JAVA_FUNC(__tsan_java_mutex_lock); DPrintf("#%d: java_mutex_lock(%p)\n", thr->tid, addr); CHECK_NE(jctx, 0); CHECK_GE(addr, jctx->heap_begin); CHECK_LT(addr, jctx->heap_begin + jctx->heap_size); MutexPostLock(thr, pc, addr, MutexFlagLinkerInit | MutexFlagWriteReentrant | MutexFlagDoPreLockOnPostLock); d175 5 a179 5 SCOPED_JAVA_FUNC(__tsan_java_mutex_unlock); DPrintf("#%d: java_mutex_unlock(%p)\n", thr->tid, addr); CHECK_NE(jctx, 0); CHECK_GE(addr, jctx->heap_begin); CHECK_LT(addr, jctx->heap_begin + jctx->heap_size); d181 1 a181 1 MutexUnlock(thr, pc, addr); d185 9 a193 8 SCOPED_JAVA_FUNC(__tsan_java_mutex_read_lock); DPrintf("#%d: java_mutex_read_lock(%p)\n", thr->tid, addr); CHECK_NE(jctx, 0); CHECK_GE(addr, jctx->heap_begin); CHECK_LT(addr, jctx->heap_begin + jctx->heap_size); MutexPostReadLock(thr, pc, addr, MutexFlagLinkerInit | MutexFlagWriteReentrant | MutexFlagDoPreLockOnPostLock); d197 5 a201 5 SCOPED_JAVA_FUNC(__tsan_java_mutex_read_unlock); DPrintf("#%d: java_mutex_read_unlock(%p)\n", thr->tid, addr); CHECK_NE(jctx, 0); CHECK_GE(addr, jctx->heap_begin); CHECK_LT(addr, jctx->heap_begin + jctx->heap_size); d203 1 a203 1 MutexReadUnlock(thr, pc, addr); d207 11 a217 9 SCOPED_JAVA_FUNC(__tsan_java_mutex_lock_rec); DPrintf("#%d: java_mutex_lock_rec(%p, %d)\n", thr->tid, addr, rec); CHECK_NE(jctx, 0); CHECK_GE(addr, jctx->heap_begin); CHECK_LT(addr, jctx->heap_begin + jctx->heap_size); CHECK_GT(rec, 0); MutexPostLock(thr, pc, addr, MutexFlagLinkerInit | MutexFlagWriteReentrant | MutexFlagDoPreLockOnPostLock | MutexFlagRecursiveLock, rec); d221 5 a225 5 SCOPED_JAVA_FUNC(__tsan_java_mutex_unlock_rec); DPrintf("#%d: java_mutex_unlock_rec(%p)\n", thr->tid, addr); CHECK_NE(jctx, 0); CHECK_GE(addr, jctx->heap_begin); CHECK_LT(addr, jctx->heap_begin + jctx->heap_size); d227 1 a227 1 return MutexUnlock(thr, pc, addr, MutexFlagRecursiveUnlock); d231 5 a235 5 SCOPED_JAVA_FUNC(__tsan_java_acquire); DPrintf("#%d: java_acquire(%p)\n", thr->tid, addr); CHECK_NE(jctx, 0); CHECK_GE(addr, jctx->heap_begin); CHECK_LT(addr, jctx->heap_begin + jctx->heap_size); d237 1 a237 1 Acquire(thr, caller_pc, addr); d241 5 a245 5 SCOPED_JAVA_FUNC(__tsan_java_release); DPrintf("#%d: java_release(%p)\n", thr->tid, addr); CHECK_NE(jctx, 0); CHECK_GE(addr, jctx->heap_begin); CHECK_LT(addr, jctx->heap_begin + jctx->heap_size); d247 1 a247 1 Release(thr, caller_pc, addr); d251 5 a255 5 SCOPED_JAVA_FUNC(__tsan_java_release); DPrintf("#%d: java_release_store(%p)\n", thr->tid, addr); CHECK_NE(jctx, 0); CHECK_GE(addr, jctx->heap_begin); CHECK_LT(addr, jctx->heap_begin + jctx->heap_size); d257 1 a257 1 ReleaseStore(thr, caller_pc, addr); @ 1.1 log @Initial revision @ text @@ 1.1.1.1 log @initial import of GCC 10.3.0. main changes include: caveats: - ABI issue between c++14 and c++17 fixed - profile mode is removed from libstdc++ - -fno-common is now the default new features: - new flags -fallocation-dce, -fprofile-partial-training, -fprofile-reproducible, -fprofile-prefix-path, and -fanalyzer - many new compile and link time optimisations - enhanced drive optimisations - openacc 2.6 support - openmp 5.0 features - new warnings: -Wstring-compare and -Wzero-length-bounds - extended warnings: -Warray-bounds, -Wformat-overflow, -Wrestrict, -Wreturn-local-addr, -Wstringop-overflow, -Warith-conversion, -Wmismatched-tags, and -Wredundant-tags - some likely C2X features implemented - more C++20 implemented - many new arm & intel CPUs known hundreds of reported bugs are fixed. full list of changes can be found at: https://gcc.gnu.org/gcc-10/changes.html @ text @@ 1.1.1.2 log @initial import of GCC 12.3.0. major changes in GCC 11 included: - The default mode for C++ is now -std=gnu++17 instead of -std=gnu++14. - When building GCC itself, the host compiler must now support C++11, rather than C++98. - Some short options of the gcov tool have been renamed: -i to -j and -j to -H. - ThreadSanitizer improvements. - Introduce Hardware-assisted AddressSanitizer support. - For targets that produce DWARF debugging information GCC now defaults to DWARF version 5. This can produce up to 25% more compact debug information compared to earlier versions. - Many optimisations. - The existing malloc attribute has been extended so that it can be used to identify allocator/deallocator API pairs. A pair of new -Wmismatched-dealloc and -Wmismatched-new-delete warnings are added. - Other new warnings: -Wsizeof-array-div, enabled by -Wall, warns about divisions of two sizeof operators when the first one is applied to an array and the divisor does not equal the size of the array element. -Wstringop-overread, enabled by default, warns about calls to string functions reading past the end of the arrays passed to them as arguments. -Wtsan, enabled by default, warns about unsupported features in ThreadSanitizer (currently std::atomic_thread_fence). - Enchanced warnings: -Wfree-nonheap-object detects many more instances of calls to deallocation functions with pointers not returned from a dynamic memory allocation function. -Wmaybe-uninitialized diagnoses passing pointers or references to uninitialized memory to functions taking const-qualified arguments. -Wuninitialized detects reads from uninitialized dynamically allocated memory. -Warray-parameter warns about functions with inconsistent array forms. -Wvla-parameter warns about functions with inconsistent VLA forms. - Several new features from the upcoming C2X revision of the ISO C standard are supported with -std=c2x and -std=gnu2x. - Several C++20 features have been implemented. - The C++ front end has experimental support for some of the upcoming C++23 draft. - Several new C++ warnings. - Enhanced Arm, AArch64, x86, and RISC-V CPU support. - The implementation of how program state is tracked within -fanalyzer has been completely rewritten with many enhancements. see https://gcc.gnu.org/gcc-11/changes.html for a full list. major changes in GCC 12 include: - An ABI incompatibility between C and C++ when passing or returning by value certain aggregates containing zero width bit-fields has been discovered on various targets. x86-64, ARM and AArch64 will always ignore them (so there is a C ABI incompatibility between GCC 11 and earlier with GCC 12 or later), PowerPC64 ELFv2 always take them into account (so there is a C++ ABI incompatibility, GCC 4.4 and earlier compatible with GCC 12 or later, incompatible with GCC 4.5 through GCC 11). RISC-V has changed the handling of these already starting with GCC 10. As the ABI requires, MIPS takes them into account handling function return values so there is a C++ ABI incompatibility with GCC 4.5 through 11. - STABS: Support for emitting the STABS debugging format is deprecated and will be removed in the next release. All ports now default to emit DWARF (version 2 or later) debugging info or are obsoleted. - Vectorization is enabled at -O2 which is now equivalent to the original -O2 -ftree-vectorize -fvect-cost-model=very-cheap. - GCC now supports the ShadowCallStack sanitizer. - Support for __builtin_shufflevector compatible with the clang language extension was added. - Support for attribute unavailable was added. - Support for __builtin_dynamic_object_size compatible with the clang language extension was added. - New warnings: -Wbidi-chars warns about potentially misleading UTF-8 bidirectional control characters. -Warray-compare warns about comparisons between two operands of array type. - Some new features from the upcoming C2X revision of the ISO C standard are supported with -std=c2x and -std=gnu2x. - Several C++23 features have been implemented. - Many C++ enhancements across warnings and -f options. see https://gcc.gnu.org/gcc-12/changes.html for a full list. @ text @d15 1 d38 17 a57 17 MBlock *JavaHeapBlock(uptr addr, uptr *start) { if (!jctx || addr < jctx->heap_begin || addr >= jctx->heap_begin + jctx->heap_size) return nullptr; for (uptr p = RoundDown(addr, kMetaShadowCell); p >= jctx->heap_begin; p -= kMetaShadowCell) { MBlock *b = ctx->metamap.GetBlock(p); if (!b) continue; if (p + b->siz <= addr) return nullptr; *start = p; return b; } return nullptr; } d60 1 a60 1 #define JAVA_FUNC_ENTER(func) \ d62 5 a66 1 (void)thr; d69 8 a76 9 JAVA_FUNC_ENTER(__tsan_java_init); Initialize(thr); DPrintf("#%d: java_init(0x%zx, 0x%zx)\n", thr->tid, heap_begin, heap_size); DCHECK_EQ(jctx, 0); DCHECK_GT(heap_begin, 0); DCHECK_GT(heap_size, 0); DCHECK_EQ(heap_begin % kHeapAlignment, 0); DCHECK_EQ(heap_size % kHeapAlignment, 0); DCHECK_LT(heap_begin, heap_begin + heap_size); d81 1 a81 1 JAVA_FUNC_ENTER(__tsan_java_fini); d83 1 a83 1 DCHECK_NE(jctx, 0); d91 8 a98 8 JAVA_FUNC_ENTER(__tsan_java_alloc); DPrintf("#%d: java_alloc(0x%zx, 0x%zx)\n", thr->tid, ptr, size); DCHECK_NE(jctx, 0); DCHECK_NE(size, 0); DCHECK_EQ(ptr % kHeapAlignment, 0); DCHECK_EQ(size % kHeapAlignment, 0); DCHECK_GE(ptr, jctx->heap_begin); DCHECK_LE(ptr + size, jctx->heap_begin + jctx->heap_size); d100 1 a100 1 OnUserAlloc(thr, 0, ptr, size, false); d104 8 a111 8 JAVA_FUNC_ENTER(__tsan_java_free); DPrintf("#%d: java_free(0x%zx, 0x%zx)\n", thr->tid, ptr, size); DCHECK_NE(jctx, 0); DCHECK_NE(size, 0); DCHECK_EQ(ptr % kHeapAlignment, 0); DCHECK_EQ(size % kHeapAlignment, 0); DCHECK_GE(ptr, jctx->heap_begin); DCHECK_LE(ptr + size, jctx->heap_begin + jctx->heap_size); d117 13 a129 13 JAVA_FUNC_ENTER(__tsan_java_move); DPrintf("#%d: java_move(0x%zx, 0x%zx, 0x%zx)\n", thr->tid, src, dst, size); DCHECK_NE(jctx, 0); DCHECK_NE(size, 0); DCHECK_EQ(src % kHeapAlignment, 0); DCHECK_EQ(dst % kHeapAlignment, 0); DCHECK_EQ(size % kHeapAlignment, 0); DCHECK_GE(src, jctx->heap_begin); DCHECK_LE(src + size, jctx->heap_begin + jctx->heap_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); d135 15 a149 6 // Clear the destination shadow range. // We used to move shadow from src to dst, but the trace format does not // support that anymore as it contains addresses of accesses. RawShadow *d = MemToShadow(dst); RawShadow *dend = MemToShadow(dst + size); internal_memset(d, 0, (dend - d) * sizeof(*d)); d153 6 a158 6 JAVA_FUNC_ENTER(__tsan_java_find); DPrintf("#%d: java_find(&0x%zx, 0x%zx)\n", thr->tid, *from_ptr, to); DCHECK_EQ((*from_ptr) % kHeapAlignment, 0); DCHECK_EQ(to % kHeapAlignment, 0); DCHECK_GE(*from_ptr, jctx->heap_begin); DCHECK_LE(to, jctx->heap_begin + jctx->heap_size); d170 3 a172 3 JAVA_FUNC_ENTER(__tsan_java_finalize); DPrintf("#%d: java_finalize()\n", thr->tid); AcquireGlobal(thr); d176 8 a183 9 JAVA_FUNC_ENTER(__tsan_java_mutex_lock); DPrintf("#%d: java_mutex_lock(0x%zx)\n", thr->tid, addr); DCHECK_NE(jctx, 0); DCHECK_GE(addr, jctx->heap_begin); DCHECK_LT(addr, jctx->heap_begin + jctx->heap_size); MutexPostLock(thr, 0, addr, MutexFlagLinkerInit | MutexFlagWriteReentrant | MutexFlagDoPreLockOnPostLock); d187 5 a191 5 JAVA_FUNC_ENTER(__tsan_java_mutex_unlock); DPrintf("#%d: java_mutex_unlock(0x%zx)\n", thr->tid, addr); DCHECK_NE(jctx, 0); DCHECK_GE(addr, jctx->heap_begin); DCHECK_LT(addr, jctx->heap_begin + jctx->heap_size); d193 1 a193 1 MutexUnlock(thr, 0, addr); d197 8 a204 9 JAVA_FUNC_ENTER(__tsan_java_mutex_read_lock); DPrintf("#%d: java_mutex_read_lock(0x%zx)\n", thr->tid, addr); DCHECK_NE(jctx, 0); DCHECK_GE(addr, jctx->heap_begin); DCHECK_LT(addr, jctx->heap_begin + jctx->heap_size); MutexPostReadLock(thr, 0, addr, MutexFlagLinkerInit | MutexFlagWriteReentrant | MutexFlagDoPreLockOnPostLock); d208 5 a212 5 JAVA_FUNC_ENTER(__tsan_java_mutex_read_unlock); DPrintf("#%d: java_mutex_read_unlock(0x%zx)\n", thr->tid, addr); DCHECK_NE(jctx, 0); DCHECK_GE(addr, jctx->heap_begin); DCHECK_LT(addr, jctx->heap_begin + jctx->heap_size); d214 1 a214 1 MutexReadUnlock(thr, 0, addr); d218 9 a226 11 JAVA_FUNC_ENTER(__tsan_java_mutex_lock_rec); DPrintf("#%d: java_mutex_lock_rec(0x%zx, %d)\n", thr->tid, addr, rec); DCHECK_NE(jctx, 0); DCHECK_GE(addr, jctx->heap_begin); DCHECK_LT(addr, jctx->heap_begin + jctx->heap_size); DCHECK_GT(rec, 0); MutexPostLock(thr, 0, addr, MutexFlagLinkerInit | MutexFlagWriteReentrant | MutexFlagDoPreLockOnPostLock | MutexFlagRecursiveLock, rec); d230 5 a234 5 JAVA_FUNC_ENTER(__tsan_java_mutex_unlock_rec); DPrintf("#%d: java_mutex_unlock_rec(0x%zx)\n", thr->tid, addr); DCHECK_NE(jctx, 0); DCHECK_GE(addr, jctx->heap_begin); DCHECK_LT(addr, jctx->heap_begin + jctx->heap_size); d236 1 a236 1 return MutexUnlock(thr, 0, addr, MutexFlagRecursiveUnlock); d240 5 a244 5 JAVA_FUNC_ENTER(__tsan_java_acquire); DPrintf("#%d: java_acquire(0x%zx)\n", thr->tid, addr); DCHECK_NE(jctx, 0); DCHECK_GE(addr, jctx->heap_begin); DCHECK_LT(addr, jctx->heap_begin + jctx->heap_size); d246 1 a246 1 Acquire(thr, 0, addr); d250 5 a254 5 JAVA_FUNC_ENTER(__tsan_java_release); DPrintf("#%d: java_release(0x%zx)\n", thr->tid, addr); DCHECK_NE(jctx, 0); DCHECK_GE(addr, jctx->heap_begin); DCHECK_LT(addr, jctx->heap_begin + jctx->heap_size); d256 1 a256 1 Release(thr, 0, addr); d260 5 a264 5 JAVA_FUNC_ENTER(__tsan_java_release); DPrintf("#%d: java_release_store(0x%zx)\n", thr->tid, addr); DCHECK_NE(jctx, 0); DCHECK_GE(addr, jctx->heap_begin); DCHECK_LT(addr, jctx->heap_begin + jctx->heap_size); d266 1 a266 1 ReleaseStore(thr, 0, addr); @ 1.1.1.3 log @initial import of GCC 14.3.0. major changes in GCC 13: - improved sanitizer - zstd debug info compression - LTO improvements - SARIF based diagnostic support - new warnings: -Wxor-used-as-pow, -Wenum-int-mismatch, -Wself-move, -Wdangling-reference - many new -Wanalyzer* specific warnings - enhanced warnings: -Wpessimizing-move, -Wredundant-move - new attributes to mark file descriptors, c++23 "assume" - several C23 features added - several C++23 features added - many new features for Arm, x86, RISC-V major changes in GCC 14: - more strict C99 or newer support - ia64* marked deprecated (but seemingly still in GCC 15.) - several new hardening features - support for "hardbool", which can have user supplied values of true/false - explicit support for stack scrubbing upon function exit - better auto-vectorisation support - added clang-compatible __has_feature and __has_extension - more C23, including -std=c23 - several C++26 features added - better diagnostics in C++ templates - new warnings: -Wnrvo, Welaborated-enum-base - many new features for Arm, x86, RISC-V - possible ABI breaking change for SPARC64 and small structures with arrays of floats. @ text @d109 1 a109 1 ctx->metamap.FreeRange(thr->proc(), ptr, size, false); d136 1 a136 1 ShadowSet(d, dend, Shadow::kEmpty); @