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(T) == 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(T) == 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); } @@ -79,7 +95,7 @@ Type cmpv = *cmp; Type prev; #if defined(_MIPS_SIM) && _MIPS_SIM == _ABIO32 - if (sizeof(*a) == 8) { + if (sizeof(T) == 8) { Type volatile *val_ptr = const_cast(&a->val_dont_use); prev = __mips_sync_val_compare_and_swap( reinterpret_cast(val_ptr), (u64)cmpv, (u64)xchg);