[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: asyncsafe-spin.c fails to compile on Solaris 10 sparc
From: |
Bruno Haible |
Subject: |
Re: asyncsafe-spin.c fails to compile on Solaris 10 sparc |
Date: |
Sat, 28 Nov 2020 13:56:29 +0100 |
User-agent: |
KMail/5.1.3 (Linux/4.4.0-193-generic; KDE/5.18.0; x86_64; ; ) |
Hi Paul,
> I attempted to reproduce Tom Christensen's first problem listed here:
>
> https://lists.gnu.org/r/bug-gnulib/2020-11/msg00062.html
>
> on Solaris 10 sparc, by running this:
>
> ./gnulib-tool --create-testdir --dir foo getumask
>
> and then on Solaris:
>
> ./configure
> make
> make check
>
> This failed as follows:
>
> depbase=`echo asyncsafe-spin.o | sed 's|[^/]*$|.deps/&|;s|\.o$||'`;\
> gcc -std=gnu99 -DHAVE_CONFIG_H -I. -I.. -DGNULIB_STRICT_CHECKING=1
> -D_REENTRANT
> -g -O2 -MT asyncsafe-spin.o -MD -MP -MF $depbase.Tpo -c -o asyncsafe-spin.o
> asyncsafe-spin.c &&\
> mv -f $depbase.Tpo $depbase.Po
> /usr/ccs/bin/as: "/tmp/ccK0uCIY.s", line 19: error: cannot use v8plus
> instructions in a non-v8plus target binary
> /usr/ccs/bin/as: "/tmp/ccK0uCIY.s", line 39: error: cannot use v8plus
> instructions in a non-v8plus target binary
>
> These diagnostics come from these instructions:
>
> cas [%o0],%o1,%o2
> ...
> membar 2
>
> which come from asm directives in lib/asyncsafe-spin.c. These instructions
> are
> not portable to SPARC v8 processors (32-bit only); they assume SPARC v8+ or
> SPARC v9.
>
> I worked around the problem by configuring this way:
>
> ./configure CC='gcc -mcpu=v9 -m32'
>
> to compile for SPARC v9, which is fine for my hardware (a production Sun Fire
> 280R with an UltraSPARC III). I doubt whether anybody outside of computer
> museums cares about SPARC v8 hardware any more, but it would be nice if
> 'configure; make' just worked on Solaris 10 sparc so perhaps the
> asyncsafe-spin
> module should add the '-mcpu=v9 -m32' options on this platform, or maybe
> asyncsafe-spin.c could simply omit the relevant instructions on 32-bit sparc
> platforms.
While it can be worked around by the person who builds the GNU package, I agree
with you that it should better work out-of-the-box.
> I doubt whether anybody outside of computer
> museums cares about SPARC v8 hardware any more
Yes. SPARC v9 was released in 1993, that is, 27 years ago.
> maybe asyncsafe-spin.c could simply omit the relevant instructions on 32-bit
> sparc platforms.
Better not, since often binaries built for older platforms are run on newer
platforms. I surely still have binaries from 2000 that I run on hardware from
2017.
On my way to reproduce the issue, I picked the 'unstable9s' machine on
opencsw.org, with CC="gcc -mno-v8plus -O2", and encountered this error:
gcc -O2 -std=gnu99 -g -O2 -L/home/haible/prefix-sparc32/lib -o
test-asyncsafe-spin1 test-asyncsafe-spin1.o libtests.a ../gllib/libgnu.a
libtests.a ../gllib/libgnu.a libtests.a
Undefined first referenced
symbol in file
__sync_val_compare_and_swap_4 ../gllib/libgnu.a(asyncsafe-spin.o)
ld: fatal: Symbol referencing errors. No output written to test-asyncsafe-spin1
collect2: ld returned 1 exit status
This is a GCC 4.6.4, and it apparently does not implement the library
functions for GCC built-ins that are supposedly implemented since GCC 4.1.
The first patch deals with that.
Then, I do reproduce your error, with a slightly different assembler message:
/var/tmp//ccUF6VQS.s: Assembler messages:
/var/tmp//ccUF6VQS.s:19: Error: Architecture mismatch on "membar".
/var/tmp//ccUF6VQS.s:19: (Requires v9|v9a|v9b; requested architecture is v8.)
/var/tmp//ccUF6VQS.s:67: Error: Architecture mismatch on "cas".
/var/tmp//ccUF6VQS.s:67: (Requires leon|v9|v9a|v9b; requested architecture is
v8.)
/var/tmp//ccUF6VQS.s:103: Error: Architecture mismatch on "cas".
/var/tmp//ccUF6VQS.s:103: (Requires leon|v9|v9a|v9b; requested architecture is
v8.)
*** Error code 1
So, with this assembler, we need to turn on v9 support; v8+ support is not
sufficient. The second patch does this.
2020-11-28 Bruno Haible <bruno@clisp.org>
asyncsafe-spin: Fix compilation error with GCC on 32-bit SPARC.
Reported by Paul Eggert in
<https://lists.gnu.org/archive/html/bug-gnulib/2020-11/msg00066.html>.
* m4/sparcv8+.m4: New file.
* modules/sparcv8+: New file.
* modules/asyncsafe-spin (Depends-on): Add sparcv8+.
2020-11-28 Bruno Haible <bruno@clisp.org>
asyncsafe-spin: Fix build error with GCC on 32-bit SPARC.
* lib/asyncsafe-spin.c: Don't use GCC >= 4.1 primitives on SPARC.
0001-asyncsafe-spin-Fix-build-error-with-GCC-on-32-bit-SP.patch
Description: Text Data
0002-asyncsafe-spin-Fix-compilation-error-with-GCC-on-32-.patch
Description: Text Data