Opened 8 years ago
Closed 6 years ago
#10204 closed Bugs (wontfix)
boost::lockfree:queue: g++ -fgnu-tm and -O1/2/3 flag not working
| Reported by: | Owned by: | timblechmann | |
|---|---|---|---|
| Milestone: | To Be Determined | Component: | atomic |
| Version: | Boost 1.55.0 | Severity: | Problem |
| Keywords: | -fgnu-tm -O compiler flag combination | Cc: | Andrey.Semashev@… |
Description
The combination of g++ -fgnu-tm and optimization flags do not work when when using boost::lockfree::queue.
#include <boost/lockfree/queue.hpp>
int main () {
boost::lockfree::queue<int> lfqueue;
lfqueue.push(234);
return 0;
}
Compiling it using
g++ -std=c++11 -g -Wall -Werror -lboost_system -fgnu-tm
works. Adding -O1 / -O2 / -O3 leads to the error:
In file included from /usr/include/boost/atomic/detail/platform.hpp:22:0,
from /usr/include/boost/atomic/atomic.hpp:17,
from /usr/include/boost/atomic.hpp:12,
from /usr/include/boost/lockfree/detail/atomic.hpp:39,
from /usr/include/boost/lockfree/queue.hpp:22,
from errtest.cpp:2:
/usr/include/boost/atomic/detail/gcc-atomic.hpp: In member function ‘void boost::atomics::detail::base_atomic<T, void, 8u, Sign>::store(const value_type&, boost::memory_order) volatile [with T = boost::lockfree::detail::tagged_ptr<boost::lockfree::queue<int>::node>; bool Sign = false; boost::atomics::detail::base_atomic<T, void, 8u, Sign>::value_type = boost::lockfree::detail::tagged_ptr<boost::lockfree::queue<int>::node>]’:
/usr/include/boost/atomic/detail/gcc-atomic.hpp:35:39: error: inlining failed in call to always_inline ‘constexpr int boost::atomics::detail::convert_memory_order_to_gcc(boost::memory_order) noexcept’:
BOOST_FORCEINLINE BOOST_CONSTEXPR int convert_memory_order_to_gcc(memory_order order) BOOST_NOEXCEPT
^
In file included from /usr/include/boost/atomic/detail/platform.hpp:22:0,
from /usr/include/boost/atomic/atomic.hpp:17,
from /usr/include/boost/atomic.hpp:12,
from /usr/include/boost/lockfree/detail/atomic.hpp:39,
from /usr/include/boost/lockfree/queue.hpp:22,
from errtest.cpp:2:
/usr/include/boost/atomic/detail/gcc-atomic.hpp:764:87: error: called from here
__atomic_store_n(&v_, tmp, atomics::detail::convert_memory_order_to_gcc(order));
I am using an up-to-date arch linux system with gcc 4.9.0 and boost 1.55.0
Change History (9)
comment:1 by , 8 years ago
| Component: | lockfree → atomic |
|---|
comment:2 by , 8 years ago
With boost 1.56 I get the same error (it only uses different header files):
g++ -Idownload/modular-boost/ -O2 -fgnu-tm errtest.cpp
In file included from download/modular-boost/boost/atomic/detail/operations_lockfree.hpp:21:0,
from download/modular-boost/boost/atomic/detail/operations.hpp:17,
from download/modular-boost/boost/atomic/fences.hpp:21,
from download/modular-boost/boost/atomic/atomic.hpp:20,
from download/modular-boost/boost/atomic.hpp:12,
from download/modular-boost/boost/lockfree/detail/atomic.hpp:30,
from download/modular-boost/boost/lockfree/queue.hpp:19,
from errtest.cpp:1:
download/modular-boost/boost/atomic/detail/ops_gcc_atomic.hpp: In static member function ‘static v
download/modular-boost/boost/atomic/detail/ops_gcc_atomic.hpp:67:39: error: inlining failed in cal
BOOST_FORCEINLINE BOOST_CONSTEXPR int convert_memory_order_to_gcc(memory_order order) BOOST_NOEXC
^
download/modular-boost/boost/atomic/detail/ops_gcc_atomic.hpp:81:90: error: called from here
__atomic_store_n(&storage, v, atomics::detail::convert_memory_order_to_gcc(order));
comment:3 by , 8 years ago
replace BOOST_FORCEINLINE by inline (in file boost/atomic/detail/gcc-atomic.hpp, line 35) -> code compiles
follow-up: 6 comment:4 by , 8 years ago
| Cc: | added |
|---|
I cannot reproduce this with gcc 4.8.2 but it shows with 4.7.3.
BOOST_FORCEINLINE is crucial in Boost.Atomic, it cannot be replaced with inline lightly. For now I don't have a solution for this, so I'm afraid at least 1.56 will be released with this problem.
comment:5 by , 8 years ago
BTW, this gcc bug seems to be related: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=53991
follow-up: 7 comment:6 by , 8 years ago
Replying to andysem:
I cannot reproduce this with gcc 4.8.2 but it shows with 4.7.3.
I can reproduce the error with gcc 4.8.2 - using boost::atomic<> and __transaction_atomic in the same app
BOOST_FORCEINLINE is crucial in Boost.Atomic, it cannot be replaced with inline lightly.
could you explain it why it is crucial, please
follow-up: 8 comment:7 by , 8 years ago
Replying to olli:
I can reproduce the error with gcc 4.8.2 - using
boost::atomic<>and__transaction_atomicin the same app
I don't have experience with gcc transactions, but as far as I understand atomic ops are not transaction safe and therefore should not be used inside transactions.
BOOST_FORCEINLINE is crucial in Boost.Atomic, it cannot be replaced with inline lightly.
could you explain it why it is crucial, please
It is commented in boost/atomic/detail/ops_gcc_atomic.hpp. In short, atomic<> functions must be inlined so that the compiler is able to see memory order arguments as constants. Otherwise it behaves as if seq_cst was specified.
comment:8 by , 8 years ago
Replying to andysem:
Replying to olli:
I can reproduce the error with gcc 4.8.2 - using
boost::atomic<>and__transaction_atomicin the same appI don't have experience with gcc transactions, but as far as I understand atomic ops are not transaction safe and therefore should not be used inside transactions.
I do not use atomics inside __transaction_atomic - only some parts of the code using atomics (e.g. spinlocks) are replaced by __transaction_atomic
comment:9 by , 6 years ago
| Resolution: | → wontfix |
|---|---|
| Status: | new → closed |
I don't think we will be able to work around this.

seem to be related to boost.atomic, which was pretty much rewritten for 1.56. can you test one of the beta releases?