Index: lib/sanitizer_common/sanitizer_atomic_clang.h =================================================================== --- lib/sanitizer_common/sanitizer_atomic_clang.h +++ lib/sanitizer_common/sanitizer_atomic_clang.h @@ -48,6 +48,14 @@ typename T::Type v, memory_order mo) { (void)mo; DCHECK(!((uptr)a % sizeof(*a))); +#if defined(_MIPS_SIM) && _MIPS_SIM == _ABIO32 + typedef typename T::Type Type; + if (sizeof(*a) == 8) { + Type volatile *val_ptr = const_cast(&a->val_dont_use); + return __mips_sync_fetch_and_add( + reinterpret_cast(val_ptr), (u64)v); + } +#endif return __sync_fetch_and_add(&a->val_dont_use, v); } @@ -56,6 +64,14 @@ typename T::Type v, memory_order mo) { (void)mo; DCHECK(!((uptr)a % sizeof(*a))); +#if defined(_MIPS_SIM) && _MIPS_SIM == _ABIO32 + typedef typename T::Type Type; + if (sizeof(*a) == 8) { + Type volatile *val_ptr = const_cast(&a->val_dont_use); + return __mips_sync_fetch_and_add( + reinterpret_cast(val_ptr), -((u64)(v))); + } +#endif return __sync_fetch_and_add(&a->val_dont_use, -v); }