summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAndres Freund <andres@anarazel.de>2014-09-19 17:04:00 +0200
committerAndres Freund <andres@anarazel.de>2014-09-19 17:14:17 +0200
commit8557a9f75fa0ac15892b21cb57fa19cce415142b (patch)
tree867228965f01442dee980b62c3528b52e4457e59 /src
parentc5d11ebd5ac9e5501d0597fb083ced4bb87a1af2 (diff)
Mark x86's memory barrier inline assembly as clobbering the cpu flags.
x86's memory barrier assembly was marked as clobbering "memory" but not "cc" even though 'addl' sets various flags. As it turns out gcc on x86 implicitly assumes "cc" on every inline assembler statement, so it's not a bug. But as that's poorly documented and might get copied to architectures or compilers where that's not the case, it seems better to be precise. Discussion: 20140919100016.GH4277@alap3.anarazel.de To keep the code common, backpatch to 9.2 where explicit memory barriers were introduced.
Diffstat (limited to 'src')
-rw-r--r--src/include/storage/barrier.h4
1 files changed, 2 insertions, 2 deletions
diff --git a/src/include/storage/barrier.h b/src/include/storage/barrier.h
index 88a4f63ac1e..33a6d4ee689 100644
--- a/src/include/storage/barrier.h
+++ b/src/include/storage/barrier.h
@@ -70,7 +70,7 @@ extern slock_t dummy_spinlock;
* "lock; addl" has worked for longer than "mfence".
*/
#define pg_memory_barrier() \
- __asm__ __volatile__ ("lock; addl $0,0(%%esp)" : : : "memory")
+ __asm__ __volatile__ ("lock; addl $0,0(%%esp)" : : : "memory", "cc")
#define pg_read_barrier() pg_compiler_barrier()
#define pg_write_barrier() pg_compiler_barrier()
#elif defined(__x86_64__) /* 64 bit x86 */
@@ -84,7 +84,7 @@ extern slock_t dummy_spinlock;
* do those things, a compiler barrier should be enough.
*/
#define pg_memory_barrier() \
- __asm__ __volatile__ ("lock; addl $0,0(%%rsp)" : : : "memory")
+ __asm__ __volatile__ ("lock; addl $0,0(%%rsp)" : : : "memory", "cc")
#define pg_read_barrier() pg_compiler_barrier()
#define pg_write_barrier() pg_compiler_barrier()
#elif defined(__ia64__) || defined(__ia64)