Hi,
I finally found out the cause of the problem that prevented us to
remove our copy of libgcc. The problem was that when switching to the
libgcc provided by GCC, there would be strange crashes. The cause of
these crashes is that the libgcc shipped with GCC is compiled with
default options, in Sparc64 case the machine model is 'embmedany'.
This makes memory accesses use %g4 as base register and since we don't
initialize it (because other code uses machine model 'medany'), there
will be crashes due to random base with some memory accesses in
libgcc. It's clear that the default machine model for Sparc64 is not
compatible with OpenBIOS, as is any libgcc compiled with this model.
I also found out how to make GCC compile and use separate libgccs
('multilib') for each machine model. This is enabled for sparc64-elf
target case with the following patch (applies to gcc-4.6-20100925).
--- gcc/config/sparc/t-crtfm.orig 2002-06-20 18:00:02.000000000 +0000
+++ gcc/config/sparc/t-crtfm 2010-10-03 14:45:31.000000000 +0000
@@ -1,4 +1,11 @@
EXTRA_PARTS += crtfastmath.o
+MULTILIB_OPTIONS = mcmodel=medany/mcmodel=medmid/mcmodel=medlow
+MULTILIB_DIRNAMES = medany medmid medlow
+MULTILIB_MATCHES =
+
+LIBGCC = stmp-multilib
+INSTALL_LIBGCC = install-multilib
+
$(T)crtfastmath.o: $(srcdir)/config/sparc/crtfastmath.c $(GCC_PASSES)
$(GCC_FOR_TARGET) $(MULTILIB_CFLAGS) $(LIBGCC2_CFLAGS) -c -o
$(T)crtfastmath.o $(srcdir)/config/sparc/crtfastmath.c
The correct configuration can be seen with this command:
$ sparc64-elf-gcc --print-multi-lib
.;
medany;@mcmodel=medany
medmid;@mcmodel=medmid
medlow;@mcmodel=medlow
$ sparc64-elf-gcc -v
Using built-in specs.
COLLECT_GCC=sparc64-elf-gcc
COLLECT_LTO_WRAPPER=/usr/local/libexec/gcc/sparc64-elf/4.6.0/lto-wrapper
Target: sparc64-elf
Configured with: ../configure --target=sparc64-elf
--enable-targets=sparc64-elf --disable-nls --disable-threads
--enable-languages=c --disable-shared --disable-libssp
--enable-multilib
Thread model: single
gcc version 4.6.0 20100925 (experimental) (GCC)
With this version, openbios-sparc64 without our local libgcc works as
well as the old version.
It may also be possible to change the default machine model, but I
didn't try that. This way may be easier if the GCC is not new enough
to support multilib.
Now the big question is, should we still aim for removal? I'm not sure
if libgccs shipped with native GCCs are compatible. Requiring a
specifically patched GCC does not seem so attractive, though most
people probably make a cross compiler anyway.