From a011dc399cc82be07326c89c926bd5880160b1ba Mon Sep 17 00:00:00 2001 From: Thomas Munro Date: Tue, 30 Jul 2024 22:12:42 +1200 Subject: [PATCH] Require compiler barrier support. Previously we had a fallback implementation of pg_compiler_barrier() that called an empty function across a translation unit boundary so the compiler couldn't see what it did. That shouldn't be needed on any current systems, and might not even work with a link time optimizer. Since we now require compiler-specific knowledge of how to implement atomics, we should also know how to implement compiler barriers on a hypothetical new system. Reviewed-by: Heikki Linnakangas Suggested-by: Andres Freund Discussion: https://postgr.es/m/721bf39a-ed8a-44b0-8b8e-be3bd81db748%40technowledgy.de Discussion: https://postgr.es/m/3351991.1697728588%40sss.pgh.pa.us --- src/backend/port/atomics.c | 8 -------- src/include/port/atomics.h | 3 +++ src/include/port/atomics/fallback.h | 15 --------------- 3 files changed, 3 insertions(+), 23 deletions(-) diff --git a/src/backend/port/atomics.c b/src/backend/port/atomics.c index 6f1e014d0b..19a84a7849 100644 --- a/src/backend/port/atomics.c +++ b/src/backend/port/atomics.c @@ -40,14 +40,6 @@ pg_spinlock_barrier(void) } #endif -#ifdef PG_HAVE_COMPILER_BARRIER_EMULATION -void -pg_extern_compiler_barrier(void) -{ - /* do nothing */ -} -#endif - #ifdef PG_HAVE_ATOMIC_U64_SIMULATION diff --git a/src/include/port/atomics.h b/src/include/port/atomics.h index c2ce10a718..edb0ae40dc 100644 --- a/src/include/port/atomics.h +++ b/src/include/port/atomics.h @@ -98,6 +98,9 @@ #if !defined(PG_HAVE_ATOMIC_U32_SUPPORT) #error "could not find an implementation of pg_atomic_uint32" #endif +#if !defined(pg_compiler_barrier_impl) +#error "could not find an implementation of pg_compiler_barrier" +#endif /* * Provide a spinlock-based implementation of the 64 bit variants, if diff --git a/src/include/port/atomics/fallback.h b/src/include/port/atomics/fallback.h index 8ffd1a8fd3..9f83827d83 100644 --- a/src/include/port/atomics/fallback.h +++ b/src/include/port/atomics/fallback.h @@ -33,21 +33,6 @@ extern void pg_spinlock_barrier(void); #define pg_memory_barrier_impl pg_spinlock_barrier #endif -#ifndef pg_compiler_barrier_impl -/* - * If the compiler/arch combination does not provide compiler barriers, - * provide a fallback. The fallback simply consists of a function call into - * an externally defined function. That should guarantee compiler barrier - * semantics except for compilers that do inter translation unit/global - * optimization - those better provide an actual compiler barrier. - * - * A native compiler barrier for sure is a lot faster than this... - */ -#define PG_HAVE_COMPILER_BARRIER_EMULATION -extern void pg_extern_compiler_barrier(void); -#define pg_compiler_barrier_impl pg_extern_compiler_barrier -#endif - #if !defined(PG_HAVE_ATOMIC_U64_SUPPORT)