hrp%snoid.CRAY.COM@UC.MSC.UMN.EDU (Hal Peterson) (10/14/88)
(this may be the same as a problem I reported earlier this week; the
symptoms are the same and the backtrace looks the same. The example
code is considerably smaller, so that should be a win.)
GCC version 1.29
(input file attached; it's some code from the X11R3 server.)
command line: "gcc -c -O -msoft-float crash.c"
configuration: md -> m68k.md
tm.h -> tm-sun3.h
running on a Sun-3/280 and on a Sun-3/50, both running SunOS 3.5.
CC1 dies with a fatal signal 11 and dumps core.
--
Hal Peterson / Cray Research / 1440 Northland Dr. / Mendota Hts, MN 55120
hrp%hall.cray.com@uc.msc.umn.edu bungia!cray!hrp (612) 681-3145
============================================================
extern unsigned long globalSerialNumber;
typedef long ptrdiff_t;
typedef unsigned long size_t;
typedef unsigned char *pointer;
typedef int Bool;
typedef unsigned long PIXEL;
typedef unsigned long ATOM;
typedef pointer FID;
typedef struct _FontPathRec *FontPathPtr;
typedef struct _NewClientRec *NewClientPtr;
char *alloca();
char *ReadRequestFromClient();
char *strcat();
char *strncat();
char *strcpy();
char *strncpy();
Bool CloseDownConnection();
FontPathPtr GetFontPath();
FontPathPtr ExpandFontNamePattern();
FID FiOpenForRead();
void CreateWellKnownSockets();
void SetDefaultFontPath();
void FreeFontRecord();
void SetFontPath();
void ErrorF();
void Error();
void FatalError();
void ProcessCommandLine();
void Xfree();
void FlushAllOutput();
void FlushIfCriticalOutputPending();
unsigned long *Xalloc();
unsigned long *Xrealloc();
long GetTimeInMillis();
typedef struct _DDXPoint *DDXPointPtr;
typedef struct _Box *BoxPtr;
extern unsigned long globalSerialNumber;
typedef struct _DDXPoint {
short x, y;
} DDXPointRec;
typedef struct _Box {
short x1, y1, x2, y2;
} BoxRec;
typedef struct _Region *RegionPtr;
extern int SingleRectRegionEqual();
typedef struct _miDash *miDashPtr;
extern void miPutImage();
extern void miGetImage();
extern RegionPtr miCopyArea();
extern RegionPtr miCopyPlane();
extern void miClearToBackground();
extern int miValidateTree();
extern void miPolySegment();
extern void miPolyRectangle();
extern void miFillPolygon();
extern int miPolyText8();
extern int miPolyText16();
extern void miImageText8();
extern void miImageText16();
extern int miFillConvexPoly();
extern int miFillGeneralPoly();
extern void miNotMiter();
extern void miMiter();
extern void miWideLine();
extern void miWideDash();
extern void miPolyArc();
extern void miPolyFillRect();
extern void miPolyFillArc();
extern void miPolyGlyphBlt();
extern void miImageGlyphBlt();
extern void miZeroLine();
extern void miPaintWindow();
extern miDashPtr miDashLine();
extern void miPushPixels();
extern void miGetPts(), miRoundCap(), miOneSegWide();
extern int miPtToAngle();
extern RegionPtr miRegionCreate();
extern void miRegionCopy();
extern void miRegionDestroy();
extern int miIntersect();
extern int miInverse();
extern int miUnion();
extern int miSubtract();
extern void miRegionReset();
extern void miTranslateRegion();
extern int miRectIn();
extern RegionPtr miRectsToRegion();
extern Bool miPointInRegion();
extern Bool miRegionNotEmpty();
extern void miRegionEmpty();
extern int miNumberRectsInRegion();
extern void miWindowExposures();
extern BoxPtr miRegionExtents();
extern void miSendGraphicsExpose();
extern RegionPtr miHandleExposures();
typedef struct _miDash {
DDXPointRec pt;
int e1, e2;
int e;
int which;
int newLine;
} miDashRec;
typedef struct _SppPoint {
double x, y;
} SppPointRec, *SppPointPtr;
extern SppPointRec miExtendSegment();
static miDashPtr CheckDashStorage();
miDashPtr
miDashLine(npt, ppt, nDash, pDash, offset, pnseg)
int npt;
DDXPointPtr ppt;
int nDash;
unsigned char *pDash;
int offset;
int *pnseg;
{
DDXPointRec pt1, pt2;
int lenCur;
int lenMax;
int iDash = 0;
int which;
miDashPtr pseg;
miDashPtr psegBase;
int nseg = 0;
int nsegMax = 0;
int x, y, len;
int adx, ady, signdx, signdy;
int du, dv, e1, e2, e, base_e = 0;
lenCur = offset;
which = 0 ;
while(lenCur > pDash[iDash])
{
lenCur -= pDash[iDash];
iDash++;
if (iDash >= nDash)
iDash = 0;
which = ~which;
}
lenMax = pDash[iDash];
psegBase = (miDashPtr)((void *)0) ;
pt2 = ppt[0];
while(--npt)
{
if ((((ppt[0]).x == ( ppt[1]).x) && ((ppt[0]).y == ( ppt[1]).y)) )
continue;
pt1 = *ppt++;
pt2 = *ppt;
adx = pt2.x - pt1.x;
ady = pt2.y - pt1.y;
signdx = ((adx) < 0 ? -1 : ((adx) > 0 ? 1 : 0)) ;
signdy = ((ady) < 0 ? -1 : ((ady) > 0 ? 1 : 0)) ;
adx = ((adx) > 0 ? (adx) : -(adx)) ;
ady = ((ady) > 0 ? (ady) : -(ady)) ;
if (adx > ady)
{
du = adx;
dv = ady;
len = adx;
}
else
{
du = ady;
dv = adx;
len = ady;
}
e1 = dv * 2;
e2 = e1 - 2*du;
e = e1 - du;
x = pt1.x;
y = pt1.y;
nseg++;
pseg = CheckDashStorage(&psegBase, nseg, &nsegMax);
pseg->pt = pt1;
pseg->e1 = e1;
pseg->e2 = e2;
base_e = pseg->e = e;
pseg->which = which;
pseg->newLine = 1;
while (len--)
{
if (adx > ady)
{
if (((signdx > 0) && (e < 0)) ||
((signdx <=0) && (e <=0))
)
{
e += e1;
}
else
{
y += signdy;
e += e2;
}
x += signdx;
}
else
{
if (((signdx > 0) && (e < 0)) ||
((signdx <=0) && (e <=0))
)
{
e +=e1;
}
else
{
x += signdx;
e += e2;
}
y += signdy;
}
lenCur++;
if (lenCur >= lenMax && (len || npt <= 1))
{
nseg++;
pseg = CheckDashStorage(&psegBase, nseg, &nsegMax);
pseg->pt.x = x;
pseg->pt.y = y;
pseg->e1 = e1;
pseg->e2 = e2;
pseg->e = e;
which = ~which;
pseg->which = which;
pseg->newLine = 0;
iDash++;
if (iDash >= nDash)
iDash = 0;
lenMax = pDash[iDash];
lenCur = 0;
}
}
}
if (lenCur == 0 && nseg != 0)
{
nseg--;
which = ~which;
}
*pnseg = nseg;
pseg = CheckDashStorage(&psegBase, nseg+1, &nsegMax);
pseg->pt = pt2;
pseg->e = base_e;
pseg->which = which;
pseg->newLine = 0;
return psegBase;
}
static
miDashPtr
CheckDashStorage(ppseg, nseg, pnsegMax)
miDashPtr *ppseg;
int nseg;
int *pnsegMax;
{
if (nseg > *pnsegMax)
{
*pnsegMax += 16 ;
*ppseg = (miDashPtr)Xrealloc(*ppseg,
(*pnsegMax)*sizeof(miDashRec));
}
return(*ppseg+(nseg-1));
}