[OpenBIOS] cross-pcc compilation issue with GCC 4.5.0
Blue Swirl
blauwirbel at gmail.com
Tue Apr 27 19:55:24 CEST 2010
On 4/26/10, Stefan Reinauer <stepan at openbios.org> wrote:
> On 4/26/10 10:29 PM, Blue Swirl wrote:
> > On 4/26/10, Mark Cave-Ayland <mark.cave-ayland at siriusit.co.uk> wrote:
> >
> >> Segher Boessenkool wrote:
> >>
> >>
> >>
> >>> That patch [which doesn't display in the mail archive btw] seems to remove
> >>> -print-libgcc-file-name, and uses -lgcc instead -- not such a hot idea?
> >>>
> >>> I don't even know how to build OpenBIOS, so I'm not going to fix it,
> >>>
> >> sorry.
> >>
> >>>
> >> If you have a PPC cross-compiler installed, the build is easy:
> >>
> >> ./config/scripts/switch-arch cross-ppc
> >> make
> >>
> >> Then copy the resulting binary from obj-ppc/ into your share/qemu
> >> directory.
> >>
> >>
> >>
> >>> I'll do my best with directed questions of course :-)
> >>>
> >>>
> >> Even an idea as to what to look at first would be a great help...
> >>
> > I think I can now reproduce the crash, previously I had no problems
> > which made debugging a bit difficult. I changed gcc's memory model
> > flag to -mcmodel=medlow and now Milax crashes in __umodti3 like Igor
> > reported. Perhaps this flag may be different when gcc builds libgcc.
> >
> > The problem seems to be that gcc's libgcc divides by zero.
> > Breakpoint 10, __umodti3 (u=<value optimized out>,
> > v=0x0000000000000000fffffffffffffffe) at ../../gcc/libgcc2.c:911
> > 911 in ../../gcc/libgcc2.c
> > 11: $i4 = 0x0
> > 10: $i0 = 0x1
> > 1: x/i $pc
> > 0xffd1f980 <__umodti3+952>: udivx %i0, %i4, %g1
> >
> > Why this doesn't happen with our libgcc? Why it doesn't happen with
> > -mcmodel=medany? What a puzzle.
> >
> > One solution could be to check for division by zero in mudivmod(),
> > which is where __umodti3 is called from.
> >
>
>
> Changing the code model most likely changes the ABI, so it's no wonder
> it does not work anymore.
> The same thing happens if your gcc is compiled with a different
> "regparm" setting than your code.
>
> This was generally reported to the gcc folks last year but I think
> nothing has happened since then:
> http://gcc.gnu.org/bugzilla/show_bug.cgi?id=41055
>
> In coreboot we fixed the regparm issue by using a wrapper that converts
> between the ABIs:
>
> http://tracker.coreboot.org/trac/coreboot/browser/trunk/src/arch/i386/Makefile.inc#L91
> http://tracker.coreboot.org/trac/coreboot/browser/trunk/src/lib/gcc.c
>
> Not sure whether something similar is possible for the code model, too,
> but it sounds less trivial.
> So until then the GCC folks' answer is: If your code uses compile time
> options that change the ABI of your compiler, you need to compile a
> compiler (well, libgcc) with those options, too. So the simplest way is
> just not assuming any ABI details if possible and not using CFLAGS that
> change the default ABI.
I made another test by removing any -mcmodel flags. That makes Milax
not crash, though it doesn't work any better. But then all Linux tests
start to crash.
I would suppose that without -mcmodel, gcc and libgcc would always
match. The remaining suspects (besides general bugginess of gcc or my
hosed configuration) are -m64 (and related as flags) and -fno-builtin.
More information about the OpenBIOS
mailing list