ado@NCIFCRF.GOV (Arthur David Olson) (04/29/89)
(We're running SunOS 4.0 on a Sun 3/280.) Description: Compiling the XV11R3 server on a Sun3 with gcc 1.35 doesn't work if you use enough options. Repeat-By: Compiling and getting a core dump in the "CreateWindow" function of the server. The attached code will show up the problem if you compile it on a Sun3 this way: gcc -fstrength-reduce -fcombine-regs -finline-functions -S -O try.c The problem is in this generated code. . . L22: movel a6@(-66),a4 movew a4@(16),a0 subl a2,a2 movel a4@(18),d2 lea a0@(a0:l:2),a4 movel a4,d0 movel d0,d3 asll #2,d3 addl a4@(18),d3 . . .where gcc is copying the value of "pScreen", stored in a6@(-66), to a4, then calculating another value into a4, and finally, in the "addl a4@(18), d3" instruction, assuming that a4 still holds the value of pScreen, not realizing that it's been clobbered. -- Space: Canada, 0 tries ever. Arthur David Olson ado@ncifcrf.gov ADO is a trademark of Ampex. -- typedef unsigned long XID; typedef XID Window; typedef XID Drawable; typedef XID Font; typedef XID Pixmap; typedef XID Cursor; typedef XID Colormap; typedef XID GContext; typedef XID KeySym; typedef unsigned long Mask; typedef unsigned long Atom; typedef unsigned long VisualID; typedef unsigned long Time; typedef unsigned char KeyCode; typedef long INT32; typedef short INT16; typedef char INT8; typedef unsigned long CARD32; typedef unsigned short CARD16; typedef unsigned char CARD8; typedef unsigned long BITS32; typedef unsigned short BITS16; typedef unsigned char BYTE; typedef unsigned char BOOL; typedef struct _xRectangle { INT16 x , y ; CARD16 width , height ; } xRectangle; typedef CARD16 KeyButMask; typedef struct { union { struct { BYTE type; BYTE detail; CARD16 sequenceNumber ; } u; struct { CARD32 pad00 ; CARD32 time ; CARD32 root , event , child ; INT16 rootX , rootY , eventX , eventY ; KeyButMask state ; BOOL sameScreen; BYTE pad1; } keyButtonPointer; struct { CARD32 pad00 ; CARD32 time ; CARD32 root , event , child ; INT16 rootX , rootY , eventX , eventY ; KeyButMask state ; BYTE mode; BYTE flags; } enterLeave; struct { CARD32 pad00 ; CARD32 window ; BYTE mode; BYTE pad1, pad2, pad3; } focus; struct { CARD32 pad00 ; CARD32 window ; CARD16 x , y , width , height ; CARD16 count ; CARD16 pad2 ; } expose; struct { CARD32 pad00 ; CARD32 drawable ; CARD16 x , y , width , height ; CARD16 minorEvent ; CARD16 count ; BYTE majorEvent; BYTE pad1, pad2, pad3; } graphicsExposure; struct { CARD32 pad00 ; CARD32 drawable ; CARD16 minorEvent ; BYTE majorEvent; BYTE bpad; } noExposure; struct { CARD32 pad00 ; CARD32 window ; CARD8 state; BYTE pad1, pad2, pad3; } visibility; struct { CARD32 pad00 ; CARD32 parent , window ; INT16 x , y ; CARD16 width , height , borderWidth ; BOOL override; BYTE bpad; } createNotify; struct { CARD32 pad00 ; CARD32 event , window ; } destroyNotify; struct { CARD32 pad00 ; CARD32 event , window ; BOOL fromConfigure; BYTE pad1, pad2, pad3; } unmapNotify; struct { CARD32 pad00 ; CARD32 event , window ; BOOL override; BYTE pad1, pad2, pad3; } mapNotify; struct { CARD32 pad00 ; CARD32 parent , window ; } mapRequest; struct { CARD32 pad00 ; CARD32 event , window , parent ; INT16 x , y ; BOOL override; BYTE pad1, pad2, pad3; } reparent; struct { CARD32 pad00 ; CARD32 event , window , aboveSibling ; INT16 x , y ; CARD16 width , height , borderWidth ; BOOL override; BYTE bpad; } configureNotify; struct { CARD32 pad00 ; CARD32 parent , window , sibling ; INT16 x , y ; CARD16 width , height , borderWidth ; CARD16 valueMask ; CARD32 pad1 ; } configureRequest; struct { CARD32 pad00 ; CARD32 event , window ; INT16 x , y ; CARD32 pad1, pad2, pad3, pad4; } gravity; struct { CARD32 pad00 ; CARD32 window ; CARD16 width , height ; } resizeRequest; struct { CARD32 pad00 ; CARD32 event , window , parent ; BYTE place; BYTE pad1, pad2, pad3; } circulate; struct { CARD32 pad00 ; CARD32 window ; CARD32 atom ; CARD32 time ; BYTE state; BYTE pad1; CARD16 pad2 ; } property; struct { CARD32 pad00 ; CARD32 time ; CARD32 window ; CARD32 atom ; } selectionClear; struct { CARD32 pad00 ; CARD32 time ; CARD32 owner , requestor ; CARD32 selection , target , property ; } selectionRequest; struct { CARD32 pad00 ; CARD32 time ; CARD32 requestor ; CARD32 selection , target , property ; } selectionNotify; struct { CARD32 pad00 ; CARD32 window ; CARD32 colormap ; BOOL new; BYTE state; BYTE pad1, pad2; } colormap; struct { CARD32 pad00 ; CARD8 request; CARD8 firstKeyCode; CARD8 count; BYTE pad1; } mappingNotify; struct { CARD32 pad00 ; CARD32 window ; union { struct { CARD32 type ; INT32 longs0 ; INT32 longs1 ; INT32 longs2 ; INT32 longs3 ; INT32 longs4 ; } l; struct { CARD32 type ; INT16 shorts0 ; INT16 shorts1 ; INT16 shorts2 ; INT16 shorts3 ; INT16 shorts4 ; INT16 shorts5 ; INT16 shorts6 ; INT16 shorts7 ; INT16 shorts8 ; INT16 shorts9 ; } s; struct { CARD32 type ; INT8 bytes[20]; } b; } u; } clientMessage; } u; } xEvent; typedef unsigned char *pointer; typedef int Bool; typedef unsigned long ATOM; unsigned long *Xalloc(); typedef struct _Box *BoxPtr; typedef struct _PixmapFormat *PixmapFormatPtr; typedef struct _Visual *VisualPtr; typedef struct _Depth *DepthPtr; typedef struct _Screen *ScreenPtr; typedef struct _Region *RegionPtr; typedef struct _DrawInfo *DrawablePtr; typedef struct _Pixmap *PixmapPtr; typedef struct _GCInterest *GCInterestPtr; typedef struct _GC *GCPtr; typedef unsigned long Pixel; typedef struct _PixmapFormat { unsigned char depth; unsigned char bitsPerPixel; unsigned char scanlinePad; } PixmapFormatRec; typedef struct _Visual { unsigned long vid; short screen; short class; unsigned long redMask, greenMask, blueMask; int offsetRed, offsetGreen, offsetBlue; short bitsPerRGBValue; short ColormapEntries; short nplanes; } VisualRec; typedef struct _Depth { int depth; int numVids; unsigned long *vids; } DepthRec; typedef struct _Screen { int myNum; ATOM id; short width, height; short mmWidth, mmHeight; short numDepths; DepthPtr allowedDepths; short rootDepth; unsigned long rootVisual; unsigned long defColormap; short minInstalledCmaps, maxInstalledCmaps; char backingStoreSupport, saveUnderSupport; unsigned long whitePixel, blackPixel; unsigned long rgf; GCPtr GCperDepth[8 +1]; PixmapPtr PixmapPerDepth[1]; pointer devPrivate; short numVisuals; VisualPtr visuals; Bool (* CloseScreen)(); void (* QueryBestSize)(); Bool (* SaveScreen)(); void (* GetImage)(); unsigned int *(* GetSpans)(); void (* PointerNonInterestBox)(); Bool (* CreateWindow)(); Bool (* DestroyWindow)(); Bool (* PositionWindow)(); Bool (* ChangeWindowAttributes)(); Bool (* RealizeWindow)(); Bool (* UnrealizeWindow)(); int (* ValidateTree)(); void (* WindowExposures)(); PixmapPtr (* CreatePixmap)(); Bool (* DestroyPixmap)(); Bool (* RealizeFont)(); Bool (* UnrealizeFont)(); void (* ConstrainCursor)(); void (* CursorLimits)(); Bool (* DisplayCursor)(); Bool (* RealizeCursor)(); Bool (* UnrealizeCursor)(); void (* RecolorCursor)(); Bool (* SetCursorPosition)(); Bool (* CreateGC)(); void (* CreateColormap)(); void (* DestroyColormap)(); void (* InstallColormap)(); void (* UninstallColormap)(); int (* ListInstalledColormaps) (); void (* StoreColors)(); void (* ResolveColor)(); RegionPtr (* RegionCreate)(); void (* RegionCopy)(); void (* RegionDestroy)(); int (* Intersect)(); int (* Union)(); int (* Subtract)(); int (* Inverse)(); void (* RegionReset)(); void (* TranslateRegion)(); int (* RectIn)(); Bool (* PointInRegion)(); Bool (* RegionNotEmpty)(); void (* RegionEmpty)(); BoxPtr (*RegionExtents)(); void (* SendGraphicsExpose)(); void (* BlockHandler)(); void (* WakeupHandler)(); pointer blockData; pointer wakeupData; } ScreenRec; typedef struct _ScreenInfo { int imageByteOrder; int bitmapScanlineUnit; int bitmapScanlinePad; int bitmapBitOrder; int numPixmapFormats; PixmapFormatRec formats[8 ]; int arraySize; int numScreens; ScreenPtr screen; } ScreenInfo; typedef struct _DDXPoint { short x, y; } DDXPointRec; typedef struct _Box { short x1, y1, x2, y2; } BoxRec; typedef struct _Region { long size; long numRects; BoxPtr rects; BoxRec extents; } RegionRec; typedef struct _BackingStore *BackingStorePtr; typedef struct _Window *WindowPtr; typedef struct _DrawInfo { short type; ScreenPtr pScreen; int depth; unsigned long serialNumber; } DrawableRec; typedef struct _Pixmap { DrawableRec drawable; int width, height; int refcnt; int devKind; pointer devPrivate; } PixmapRec; typedef struct _Cursor *CursorPtr; typedef struct _Property *PropertyPtr; typedef struct _Client *ClientPtr; typedef struct _BackingStore { RegionPtr obscured; DDXPointRec oldAbsCorner; void (* SaveDoomedAreas)(); RegionPtr (* RestoreAreas)(); void (* ExposeCopy)(); void (* TranslateBackingStore)(); void (* ClearToBackground)(); void (* DrawGuarantee)(); } BackingStoreRec; typedef struct _Window { DrawableRec drawable; VisualID visual; struct _Window *parent; struct _Window *nextSib; struct _Window *prevSib; struct _Window *firstChild; struct _Window *lastChild; CursorPtr cursor; ClientPtr client; Window wid; RegionPtr clipList; RegionPtr winSize; RegionPtr borderClip; RegionPtr borderSize; RegionPtr exposed; RegionPtr borderExposed; xRectangle clientWinSize; DDXPointRec absCorner; DDXPointRec oldAbsCorner; int class; Mask eventMask; Mask dontPropagateMask; Mask allEventMasks; Mask deliverableEvents; pointer otherClients; pointer passiveGrabs; PropertyPtr userProps; XID nolongerused; PixmapPtr backgroundTile; unsigned long backgroundPixel; PixmapPtr borderTile; unsigned long borderPixel; int borderWidth; void (* PaintWindowBackground)(); void (* PaintWindowBorder)(); void (* CopyWindow)(); void (* ClearToBackground)(); unsigned long backingBitPlanes; unsigned long backingPixel; int backingStore; BackingStorePtr backStorage; char bitGravity; char winGravity; Colormap colormap; Bool saveUnder:1; unsigned visibility:2; unsigned mapped:1; unsigned realized:1; unsigned viewable:1; unsigned overrideRedirect:1; unsigned marked:1; pointer devBackingStore; pointer devPrivate; } WindowRec; typedef unsigned long Leds; typedef struct { unsigned short color; short refcnt; } SHAREDCOLOR; typedef struct { unsigned short red, green, blue; } LOCO; typedef struct { SHAREDCOLOR *red, *green, *blue; } SHCO; typedef struct _Cursor { unsigned char *source; unsigned char *mask; long width; long height; long xhot; long yhot; unsigned foreRed, foreGreen, foreBlue; unsigned backRed, backGreen, backBlue; int refcnt; pointer devPriv[3 ]; } CursorRec; typedef struct _Client { int index; Mask clientAsMask; pointer requestBuffer; pointer osPrivate; Bool swapped; void (* pSwapReplyFunc)(); XID errorValue; int sequence; int closeDownMode; int clientGone; int noClientException; DrawablePtr lastDrawable; Drawable lastDrawableID; GCPtr lastGC; GContext lastGCID; pointer *saveSet; int numSaved; int requestLog[100 ]; int requestLogIndex; pointer screenPrivate[3 ]; } ClientRec; typedef struct _DIXFontProp *DIXFontPropPtr; typedef struct _Font *FontPtr; typedef struct _GCInterest { struct _GCInterest *pNextGCInterest; struct _GCInterest *pLastGCInterest; int length; ATOM owner; unsigned long ValInterestMask; void (* ValidateGC) (); unsigned long ChangeInterestMask; int (* ChangeGC) (); void (* CopyGCSource) (); void (* CopyGCDest) (); void (* DestroyGC) (); pointer extPriv; } GCInterestRec; typedef struct _GC { ScreenPtr pScreen; pointer devPriv; pointer devBackingStore; int depth; unsigned long serialNumber; GCInterestPtr pNextGCInterest; GCInterestPtr pLastGCInterest; int alu; unsigned long planemask; unsigned long fgPixel, bgPixel; int lineWidth; int lineStyle; int capStyle; int joinStyle; int fillStyle; int fillRule; int arcMode; PixmapPtr tile; PixmapPtr stipple; DDXPointRec patOrg; FontPtr font; int subWindowMode; Bool graphicsExposures; DDXPointRec clipOrg; pointer clientClip; int clientClipType; int dashOffset; int numInDashList; unsigned char *dash; unsigned long stateChanges; DDXPointRec lastWinOrg; int miTranslate:1; void (* FillSpans)(); void (* SetSpans)(); void (* PutImage)(); RegionPtr (* CopyArea)(); RegionPtr (* CopyPlane)(); void (* PolyPoint)(); void (* Polylines)(); void (* PolySegment)(); void (* PolyRectangle)(); void (* PolyArc)(); void (* FillPolygon)(); void (* PolyFillRect)(); void (* PolyFillArc)(); int (* PolyText8)(); int (* PolyText16)(); void (* ImageText8)(); void (* ImageText16)(); void (* ImageGlyphBlt)(); void (* PolyGlyphBlt)(); void (* PushPixels)(); void (* LineHelper)(); void (* ChangeClip) (); void (* DestroyClip) (); void (* CopyClip)(); } GC; int screenIsSaved = 1 ; int defaultBackingStore = 0 ; ClippedRegionFromBox(pWin, Rgn, x, y, w, h) register WindowPtr pWin; RegionPtr Rgn; int x, y, w, h; { register ScreenPtr pScreen = pWin->drawable.pScreen; BoxRec box; box = *((* pScreen->RegionExtents)(pWin->winSize)); if (x > box.x1) box.x1 = x; if (y > box.y1) box.y1 = y; x += w; if (x < box.x2) box.x2 = x; y += h; if (y < box.y2) box.y2 = y; if (box.x1 > box.x2) box.x2 = box.x1; if (box.y1 > box.y2) box.y2 = box.y1; (* pScreen->RegionReset)(Rgn, &box); (* pScreen->Intersect)(Rgn, Rgn, pWin->winSize); } extern WindowPtr RealChildHead(); WindowPtr CreateWindow(wid, pParent, x, y, w, h, bw, class, vmask, vlist, depth, client, visual, error) Window wid; WindowPtr pParent; short x,y; unsigned short w, h, bw; unsigned short class; Mask vmask; XID *vlist; int depth; ClientPtr client; VisualID visual; int *error; { WindowPtr pWin, pHead; ScreenPtr pScreen; xEvent event; int idepth, ivisual; Bool fOK; DepthPtr pDepth; if (class == 0L ) class = pParent->class; if ((class != 1 ) && (class != 2 )) { *error = 2 ; client->errorValue = class; return (WindowPtr) 0 ; } if ((class != 2 ) && (pParent->class == 2 )) { *error = 8 ; return (WindowPtr) 0 ; } if ((class == 2 ) && ((bw != 0) || (depth != 0))) { *error = 8 ; return (WindowPtr) 0 ; } pScreen = pParent->drawable.pScreen; fOK = 0 ; if ((class == 1 ) && (depth == 0)) depth = pParent->drawable.depth; if (visual == 0L ) visual = pParent->visual; for(idepth = 0; idepth < pScreen->numDepths; idepth++) { pDepth = (DepthPtr) &pScreen->allowedDepths[idepth]; if ((depth == pDepth->depth) || (depth == 0)) { for (ivisual = 0; ivisual < pDepth->numVids; ivisual++) { if (visual == pDepth->vids[ivisual]) { fOK = 1 ; break; } } } } if (fOK == 0 ) { *error = 8 ; return (WindowPtr) 0 ; } if (((vmask & ( (1L<<2) | (1L<<3) )) == 0) && (class != 2 ) && (depth != pParent->drawable.depth)) { *error = 8 ; return (WindowPtr) 0 ; } if (((vmask & (1L<<13) ) == 0) && (class != 2 ) && ((visual != pParent->visual) || (pParent->colormap == 0L ))) { *error = 8 ; return (WindowPtr) 0 ; } pWin = (WindowPtr) Xalloc((unsigned long)( sizeof(WindowRec) )) ; InitProcedures(pWin); pWin->drawable = pParent->drawable; pWin->drawable.depth = depth; if (class == 2 ) pWin->drawable.type = (short) -1 ; pWin->wid = wid; pWin->client = client; pWin->visual = visual; pWin->class = class; SetWindowToDefaults(pWin, pScreen); if ((class == 2 ) || (visual != pParent->visual)) pWin->colormap = 0L ; else pWin->colormap = pParent->colormap; pWin->cursor = (CursorPtr) 0L ; pWin->borderWidth = (int) bw; pWin->backgroundTile = (PixmapPtr) 0L ; if ((vmask & ( (1L<<2) | (1L<<3) )) != 0) pWin->borderTile = (PixmapPtr)3 ; else { pWin->borderTile = pParent->borderTile; if (( ((pParent->borderTile != (PixmapPtr) 0L ) && (pParent->borderTile != (PixmapPtr)3 ) && (pParent->borderTile != (PixmapPtr) 1L ))? 1 : 0 ) ) pParent->borderTile->refcnt++; } pWin->borderPixel = pParent->borderPixel; pWin->clientWinSize.x = x + (int)bw; pWin->clientWinSize.y = y + (int)bw; pWin->clientWinSize.height = h; pWin->clientWinSize.width = w; pWin->absCorner.x = pWin->oldAbsCorner.x = pParent->absCorner.x + x + (int)bw; pWin->absCorner.y = pWin->oldAbsCorner.y = pParent->absCorner.y + y + (int)bw; pWin->clipList = (* pScreen->RegionCreate)( 0 , 1); pWin->borderClip = (* pScreen->RegionCreate)( 0 , 1); pWin->winSize = (* pScreen->RegionCreate)( 0 , 1); ClippedRegionFromBox(pParent, pWin->winSize, pWin->absCorner.x, pWin->absCorner.y, (int)w, (int)h); pWin->borderSize = (* pScreen->RegionCreate)( 0 , 1); if (bw) ClippedRegionFromBox(pParent, pWin->borderSize, pWin->absCorner.x - (int)bw, pWin->absCorner.y - (int)bw, (int)(w + (bw<<1)), (int)(h + (bw<<1))); else (* pScreen->RegionCopy)(pWin->borderSize, pWin->winSize); pWin->parent = pParent; pHead = RealChildHead(pParent); if (pHead) { pWin->nextSib = pHead->nextSib; if (pHead->nextSib) pHead->nextSib->prevSib = pWin; else pParent->lastChild = pWin; pHead->nextSib = pWin; pWin->prevSib = pHead; } else { pWin->nextSib = pParent->firstChild; if (pParent->firstChild) pParent->firstChild->prevSib = pWin; else pParent->lastChild = pWin; pParent->firstChild = pWin; } (*pScreen->CreateWindow)(pWin); (*pScreen->PositionWindow)(pWin, pWin->absCorner.x, pWin->absCorner.y); if ((vmask & (1L<<11) ) == 0) (void)EventSelectForWindow(pWin, client, (Mask)0); if (vmask) *error = ChangeWindowAttributes(pWin, vmask, vlist, pWin->client); else *error = 0 ; if (*error != 0 ) { (void)EventSelectForWindow(pWin, client, (Mask)0); DeleteWindow(pWin, wid); return (WindowPtr) 0 ; } if (!(vmask & (1L<<6) ) && (defaultBackingStore != 0 )) { XID value = defaultBackingStore; (void)ChangeWindowAttributes(pWin, (1L<<6) , &value, pWin->client); } WindowHasNewCursor(pWin); event.u.u.type = 16 ; event.u.createNotify.window = wid; event.u.createNotify.parent = pParent->wid; event.u.createNotify.x = x; event.u.createNotify.y = y; event.u.createNotify.width = w; event.u.createNotify.height = h; event.u.createNotify.borderWidth = bw; event.u.createNotify.override = pWin->overrideRedirect; DeliverEvents(pParent, &event, 1, ((WindowPtr) 0) ); return pWin; }