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;
}