From 108d9d6b61b05d96163dfd4cdea2d4d86f413b8e Mon Sep 17 00:00:00 2001 From: Petr Ledvina Date: Thu, 29 Dec 2016 19:31:02 +0100 Subject: [PATCH] Fix atomic.h `=m` output operand means that value is write only, gcc may discard previous value because it assumes that it will be overwritten. This bug was not triggered in gcc v4 because `asm volatile` triggered full memory barrier. With old version, this code will increase `markme` only by 2, not 3: ``` static int markme = 0; markme++; ATOMIC_BLOCK_NB(0xff) { ATOMIC_BARRIER(markme); // markme is marked as overwritten, previous increment can be discarded markme++; } markme++; ``` --- src/main/build/atomic.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/build/atomic.h b/src/main/build/atomic.h index 959c6e9d8d..f2436d5534 100644 --- a/src/main/build/atomic.h +++ b/src/main/build/atomic.h @@ -104,7 +104,7 @@ static inline uint8_t __basepriSetRetVal(uint8_t prio) __asm__ volatile ("\t# barier(" #data ") end\n" : : "m" (**__d)); \ } \ typeof(data) __attribute__((__cleanup__(__UNIQL(__barrierEnd)))) *__UNIQL(__barrier) = &data; \ - __asm__ volatile ("\t# barier (" #data ") start\n" : "=m" (*__UNIQL(__barrier))) + __asm__ volatile ("\t# barier (" #data ") start\n" : "+m" (*__UNIQL(__barrier))) // define these wrappers for atomic operations, use gcc buildins