Ping. This will fix bootstrap on FreeBSD (and it seems NetBSD). (Paolo provided some comments, though this looks like the simplest patch to fix the issue.)
Gerald On Mon, 1 Apr 2013, Gerald Pfeifer wrote: > Andi's patch broke bootstrap on all FreeBSD platforms, which took me > a bit to realize since he did not update the ChangeLog: > > 2013-03-23 Andi Kleen <a...@my.domain.org> > > * local_atomic (__always_inline): Add. > (__calculate_memory_order, atomic_thread_fence, > atomic_signal_fence, test_and_set, clear, store, load, > exchange, compare_exchange_weak, compare_exchange_strong, > fetch_add, fetch_sub, fetch_and, fetch_or, fetch_xor): > Add __always_inline to force inlining. > > The problem is the he added the following to local_atomic > > #ifndef __always_inline > #define __always_inline inline __attribute__((always_inline)) > #endif > > whereas /usr/include/sys/cdefs.h on FreeBSD has the following > > #define __always_inline __attribute__((__always_inline__)) > > and hence misses the inline (plus libitm/common.h already has > ALWAYS_INLINE for that purpose). > > I am fixing this by adding an explicit inline to those cases where > necessary. I did not add it to struct members, which are considered > inline by default (and believe Andi's patch may have been a bit over- > eager from that perspective). > > Bootstrapped and regression tested on i386-unknown-freebsd10.0. > > Okay? > > Gerald > > 2013-03-31 Gerald Pfeifer <ger...@pfeifer.com> > > PR bootstrap/56714 > * local_atomic (__calculate_memory_order): Mark inline. > (atomic_thread_fence): Ditto. > (atomic_signal_fence): Ditto. > (atomic_bool::atomic_flag_test_and_set_explicit): Ditto. > (atomic_bool::atomic_flag_clear_explicit): Ditto. > (atomic_bool::atomic_flag_test_and_set): Ditto. > (atomic_bool::atomic_flag_clear): Ditto. > > Index: local_atomic > =================================================================== > --- local_atomic (revision 197262) > +++ local_atomic (working copy) > @@ -75,7 +75,7 @@ > memory_order_seq_cst > } memory_order; > > - __always_inline memory_order > + inline __always_inline memory_order > __calculate_memory_order(memory_order __m) noexcept > { > const bool __cond1 = __m == memory_order_release; > @@ -85,13 +85,13 @@ > return __mo2; > } > > - __always_inline void > + inline __always_inline void > atomic_thread_fence(memory_order __m) noexcept > { > __atomic_thread_fence (__m); > } > > - __always_inline void > + inline __always_inline void > atomic_signal_fence(memory_order __m) noexcept > { > __atomic_thread_fence (__m); > @@ -1545,38 +1545,38 @@ > > > // Function definitions, atomic_flag operations. > - __always_inline bool > + inline __always_inline bool > atomic_flag_test_and_set_explicit(atomic_flag* __a, > memory_order __m) noexcept > { return __a->test_and_set(__m); } > > - __always_inline bool > + inline __always_inline bool > atomic_flag_test_and_set_explicit(volatile atomic_flag* __a, > memory_order __m) noexcept > { return __a->test_and_set(__m); } > > - __always_inline void > + inline __always_inline void > atomic_flag_clear_explicit(atomic_flag* __a, memory_order __m) noexcept > { __a->clear(__m); } > > - __always_inline void > + inline __always_inline void > atomic_flag_clear_explicit(volatile atomic_flag* __a, > memory_order __m) noexcept > { __a->clear(__m); } > > - __always_inline bool > + inline __always_inline bool > atomic_flag_test_and_set(atomic_flag* __a) noexcept > { return atomic_flag_test_and_set_explicit(__a, memory_order_seq_cst); } > > - __always_inline bool > + inline __always_inline bool > atomic_flag_test_and_set(volatile atomic_flag* __a) noexcept > { return atomic_flag_test_and_set_explicit(__a, memory_order_seq_cst); } > > - __always_inline void > + inline __always_inline void > atomic_flag_clear(atomic_flag* __a) noexcept > { atomic_flag_clear_explicit(__a, memory_order_seq_cst); } > > - __always_inline void > + inline __always_inline void > atomic_flag_clear(volatile atomic_flag* __a) noexcept > { atomic_flag_clear_explicit(__a, memory_order_seq_cst); } > >