Opened 14 years ago
Closed 14 years ago
#2263 closed Bugs (fixed)
On PA-RISC with GCC 4.3.1, thread primitives are misdetected
Reported by: | Owned by: | Peter Dimov | |
---|---|---|---|
Milestone: | Boost 1.37.0 | Component: | None |
Version: | Boost 1.36.0 | Severity: | Problem |
Keywords: | Cc: |
Description
In at least two places (boost/detail/spinlock.hpp and boost/detail/atomic_count.hpp), Boost assumes that if the following condition is true:
defined( GNUC ) && ( GNUC * 100 + GNUC_MINOR >= 401 )
then GCC sync primitives (e.g. sync_lock_test_and_set, sync_fetch_and_add) are available. This is not correct; GCC 4.3.1 on PA-RISC does not provide these operations. The following link error results:
/usr/ccs/bin/ld: Unsatisfied symbols:
sync_add_and_fetch_4 (first referenced in main.o) (code)
The test can be fixed like this:
defined( GNUC ) && ( GNUC * 100 + GNUC_MINOR >= 401 ) && !defined(hppa)
However, it seems like it would be more resiliant to list the platforms which do support these primitves (e.g. Itanium, i386...) rather than excepting specific platforms.
(Tested on HP-UX 11.11 using HP GCC 4.3.1 on a PA-8200 CPU.)
Change History (6)
comment:1 by , 14 years ago
Owner: | set to |
---|
comment:2 by , 14 years ago
Status: | new → assigned |
---|
comment:3 by , 14 years ago
comment:4 by , 14 years ago
Does GCC on PA-RISC indeed not provide even sync_lock_test_and_set? Or is it just sync_fetch_and_add that is not present?
comment:5 by , 14 years ago
it does not:
river@maiden:~>cat test.c int i; int main() { __sync_lock_test_and_set(&i, 1); return 0; } river@maiden:~>gcc test.c -o test -W -Wall /usr/ccs/bin/ld: Unsatisfied symbols: __sync_lock_test_and_set_4 (first referenced in /var/tmp//ccgdGbo1.o) (code) collect2: ld returned 1 exit status river@maiden:~>gcc -v Using built-in specs. Target: hppa1.1-hp-hpux11.11 Configured with: /tmp/gcc-4.3.1.tar.gz/gcc-4.3.1/configure --host=hppa1.1-hp-hpux11.11 --target=hppa1.1-hp-hpux11.11 --build=hppa1.1-hp-hpux11.11 --prefix=/opt/hp-gcc-4.3.1 --with-gnu-as --without-gnu-ld --with-ld=/usr/ccs/bin/ld --enable-threads=posix --enable-languages=c,c++ --with-gmp=/proj/opensrc/be/hppa1.1-hp-hpux11.11 --with-mpfr=/proj/opensrc/be/hppa1.1-hp-hpux11.11 Thread model: posix gcc version 4.3.1 (GCC)
(PA-RISC does provide a single atomic operation - 'load and clear word' (ldcw), which is roughly equivalent to __sync_lock_test_and_set(&x, 1)
. Unfortunately, I'm not comfortable enough with the platform to provide an implementation.)
comment:6 by , 14 years ago
Resolution: | → fixed |
---|---|
Status: | assigned → closed |
In addition to __hppa, need to also check __arm.