Subject: m68k gcc codegen bug? (affects libX11.a)
To: None <tech-toolchain@NetBSD.ORG>
From: Dave Huang <khym@bga.com>
List: tech-toolchain
Date: 04/07/1998 13:04:07
[ I originally posted this to port-m68k & port-mac68k, but nobody
commented on the gcc part... perhaps this is a better list for this
type of thing? ]
It looks like there's a codegen bug that affects the static version of
libX11 (and probably other things too?) In particular, the
XPolygonRegion that's in the libX11.a in NetBSD/m68k xcomp.tgz crashes.
I'm seeing the bug in a stock gcc 2.7.2.2 configured as a cross-compiler
w/netbsd-i386 host and netbsd-m68k target. Since the xcomp from the
NetBSD 1.3 release has a bad libX11.a too, I assume it's in the gcc in
the NetBSD tree too. I haven't tried gcc 2.8.1 or egcs.
Here's the portion of lib/X11/PolyReg.c that makes gcc misbehave:
typedef struct _XRegion {
long size;
long numRects;
BOX *rects;
BOX extents;
} REGION;
Region
XPolygonRegion(Pts, Count, rule)
int Count; /* number of pts */
XPoint *Pts; /* the pts */
int rule; /* winding rule */
{
Region region;
[...]
if ((region->extents.x1 != region->extents.x2) &&
(region->extents.y1 != region->extents.y2)) {
region->numRects = 1;
*(region->rects) = region->extents;
}
[...]
}
When compiled with -O, everything looks good. Here's the body of the
if block (a1 and d7 both contain region):
5de: 7201 moveq #1,%d1
5e0: 2341 0004 movel %d1,%a1@(4)
5e4: 2047 moveal %d7,%a0
5e6: 2228 000c movel %a0@(12),%d1
5ea: 2428 0010 movel %a0@(16),%d2
5ee: 2268 0008 moveal %a0@(8),%a1
5f2: 2281 movel %d1,%a1@
5f4: 2342 0004 movel %d2,%a1@(4)
But when compiled with -O2, gcc comes up with this (a1 and fp@(-1188)
both contain region):
646: 7e01 moveq #1,%d7
648: 2347 0004 movel %d7,%a1@(4)
64c: 226e fb5c moveal %fp@(-1188),%a1
650: 2c29 000c movel %a1@(12),%d6
654: 2e29 0010 movel %a1@(16),%d7
658: 226e fb58 moveal %fp@(-1192),%a1 <-- eh??
65c: 2286 movel %d6,%a1@
65e: 2347 0004 movel %d7,%a1@(4)
What's this %fp@(-1192) stuff about? It's never initialized, so the
code ends up trying to write to some random memory location, usually
resulting in a SEGV.
Oy, no wonder mozilla crashed... anyways, if anyone's interested,
there's a NetBSD/m68k mozilla binary at
http://www.bga.com/~khym/netbsd/mozilla-netbsd-m68k.gz
It's statically linked 'cuz I had to cross-link the thing... native ld
seg faulted trying to link the thing. *growl* Native cc seg faulted or
got signal 6 trying to compile some of the files too.
I used fvdl's patches, btw, and set JB_SP_INDEX to 2. (I think that's
right... that's what I got from looking at setjmp.S, at least :)
Linked w/yesterday's lesstif-current.
--
Name: Dave Huang | Mammal, mammal / their names are called /
INet: khym@bga.com | they raise a paw / the bat, the cat /
FurryMUCK: Dahan | dolphin and dog / koala bear and hog -- TMBG