trq@moose.cita.toronto.edu (Tom Quinn) (10/05/88)
The following code causes gcc to get a fatal signal when compiled with
the "-O -fforce-mem -finline-functions" options. This is gcc version
1.28 on a Sun3/50 running SunOS 3.5.
Tom Quinn Canadian Institute for Theoretical Astrophysics
trq@moose.cita.toronto.edu
SOON TO BE trq@moose.cita.utoronto.ca
UUCP - decvax!utgpu!moose!trq
BITNET - quinn@utorphys.bitnet
ARPA - trq%moose.cita.toronto.edu@relay.cs.net
The compile:
gcc -g -v -O -fforce-mem -finline-functions -c Text.c
gcc version 1.28
/usr/local/lib/gcc-cpp -v -undef -D__GNU__ -D__GNUC__ -Dmc68000 -Dsun -Dunix -D__OPTIMIZE__ -D__HAVE_FPU__ -Dmc68020 Text.c /tmp/cca22018.cpp
GNU CPP version 1.28
/usr/local/lib/gcc-cc1 /tmp/cca22018.cpp -quiet -dumpbase Text.c -fforce-mem -finline-functions -g -O -version -o /tmp/cca22018.s
GNU C version 1.28 (68k, MIT syntax) compiled by GNU C version 1.28.
gcc: Program cc1 got fatal signal 6.
The code:
------------------------------------------------------------------------
typedef char * caddr_t;
typedef unsigned long XID;
typedef XID Window;
typedef struct {
struct _XDisplay *display;
Window root;
} Screen;
typedef struct _XDisplay {
int fd;
} Display;
typedef union _XEvent {
int type;
} XEvent;
typedef char *String;
typedef struct _WidgetRec *Widget;
typedef struct _WidgetClassRec *WidgetClass;
typedef unsigned int Cardinal;
typedef char Boolean;
typedef int Position;
typedef unsigned int Dimension;
typedef long XtArgVal;
extern Widget XtCreateManagedWidget ();
extern void XtRealizeWidget ();
extern Widget XtNameToWidget();
typedef void (*XtCallbackProc)();
typedef struct _XtCallbackRec {
XtCallbackProc callback;
caddr_t closure;
} XtCallbackRec;
extern char *XtMalloc();
extern void XtFree();
typedef struct {
String name;
XtArgVal value;
} Arg;
extern Widget XtCreatePopupShell();
typedef enum {XtGrabNone, XtGrabNonexclusive, XtGrabExclusive} XtGrabKind;
extern void XtPopup();
typedef struct _CorePart {
Widget parent;
String name;
Screen *screen;
Window window;
Position x, y;
Dimension width;
Dimension border_width;
} CorePart;
typedef struct _WidgetRec {
CorePart core;
} WidgetRec;
typedef struct _WidgetClassRec {
int core_class;
} WidgetClassRec;
extern void XtMoveWidget();
extern WidgetClass commandWidgetClass;
extern WidgetClass dialogWidgetClass;
extern WidgetClass transientShellWidgetClass;
int strlen();
typedef struct _TextRec *TextWidget;
typedef long XtTextPosition;
typedef struct _XtTextSource XtTextSourceRec, *XtTextSource;
typedef enum {XttextRead, XttextAppend, XttextEdit} XtTextEditType;
typedef struct {
int length;
} XtTextBlock, *XtTextBlockPtr;
typedef struct _XtTextSource {
XtTextEditType edit_mode;
};
typedef struct {
XtTextPosition left, right;
} XtTextSelection;
typedef struct _TextPart {
XtTextSource source;
XtTextPosition insertPos;
XtTextSelection s;
int dialog_horiz_offset;
int dialog_vert_offset;
Widget sbar;
Boolean showposition;
struct _dialog {
TextWidget text;
Widget widget;
Widget doit;
Widget message;
Boolean mapped;
struct _dialog *next;
} *dialog;
} TextPart;
typedef struct _TextRec {
CorePart core;
TextPart text;
} TextRec;
char *_XtTextGetText();
static DeleteOrKill(ctx, from, to, kill)
TextWidget ctx;
XtTextPosition from, to;
Boolean kill;
{
XtTextBlock text;
char *ptr;
if (kill && from < to) {
ptr = _XtTextGetText(ctx, from, to);
XStoreBuffer(((ctx)->core.screen->display) , ptr, strlen(ptr), 1);
XtFree(ptr);
}
text.length = 0;
if (ReplaceText(ctx, from, to, &text)) {
XBell(((ctx)->core.screen->display) , 50);
return;
}
_XtTextSetNewSelection(ctx, from, from);
ctx->text.insertPos = from;
ctx->text.showposition = 1 ;
}
static void DeleteCurrentSelection(ctx, event)
TextWidget ctx;
XEvent *event;
{
StartAction(ctx, event);
DeleteOrKill(ctx, ctx->text.s.left, ctx->text.s.right, 0 );
EndAction(ctx);
}
void _XtTextAbortDialog();
static void DoInsert();
static void InsertFile(w, event)
Widget w;
XEvent *event;
{
TextWidget ctx = (TextWidget)w;
register struct _dialog *dialog, *prev;
char *ptr;
register Widget popup;
static Arg popup_args[] = {
{ "x" , 0 },
{ "y" , 0 },
{"iconName" , (XtArgVal)"Insert File:" },
{"geometry" , 0 },
{"allowShellResize" , 1 },
{ "saveUnder" , 1 },
};
Arg args[2];
static XtCallbackRec callbacks[] = { {0 , 0 }, {0 , 0 } };
int x, y;
Window j;
StartAction(ctx, event);
if (ctx->text.source->edit_mode != XttextEdit) {
XBell(((w)->core.screen->display) , 50);
EndAction(ctx);
return;
}
if (ctx->text.s.left < ctx->text.s.right) {
ptr = _XtTextGetText(ctx, ctx->text.s.left, ctx->text.s.right);
DeleteCurrentSelection(ctx, (XEvent*)0 );
}
else {
ptr = "";
}
XTranslateCoordinates( ((w)->core.screen->display) , ((w)->core.window) ,
((((w)->core.screen) )->root) , 0, 0, &x, &y, &j );
x += ctx->text.dialog_horiz_offset;
y += ctx->text.dialog_vert_offset;
if (ctx->text.sbar)
x += ctx->text.sbar->core.width + ctx->text.sbar->core.border_width;
prev = 0 ;
for (dialog = ctx->text.dialog; dialog; dialog = dialog->next) {
if (!dialog->mapped)
break;
x += ctx->text.dialog_horiz_offset;
y += ctx->text.dialog_vert_offset;
prev = dialog;
}
if (dialog) {
_XtTextAbortDialog(w, (caddr_t)dialog, 0 );
XtMoveWidget(popup = dialog->widget->core.parent, x, y);
}
else {
dialog = ((struct _dialog *) XtMalloc((unsigned) sizeof(struct _dialog))) ;
if (prev)
prev->next = dialog;
else
ctx->text.dialog = dialog;
dialog->text = ctx;
dialog->message = (Widget)0 ;
dialog->next = 0 ;
popup_args[0].value = (XtArgVal)x;
popup_args[1].value = (XtArgVal)y;
popup = XtCreatePopupShell( "insertFile", transientShellWidgetClass, w,
popup_args, ((Cardinal) (sizeof(popup_args) / sizeof(popup_args[0]))) );
( ( args[0]).name = ( "label" ), ( args[0]).value = (XtArgVal)( "Insert File:" ) ) ;
( ( args[1]).name = ( "value" ), ( args[1]).value = (XtArgVal)( ptr ) ) ;
dialog->widget =
XtCreateManagedWidget("fileInsert", dialogWidgetClass, popup,
args, ((Cardinal)2) );
XtSetKeyboardFocus( dialog->widget,
XtNameToWidget( dialog->widget, "value" ));
callbacks[0].callback = _XtTextAbortDialog;
callbacks[0].closure = (caddr_t)dialog;
( ( args[0]).name = ( "callback" ), ( args[0]).value = (XtArgVal)( callbacks ) ) ;
XtCreateManagedWidget( "Cancel", commandWidgetClass, dialog->widget,
args, ((Cardinal)1) );
callbacks[0].callback = DoInsert;
dialog->doit =
XtCreateManagedWidget( "DoIt", commandWidgetClass, dialog->widget,
args, ((Cardinal)1) );
XtRealizeWidget( popup );
}
XtPopup(popup, XtGrabNone);
dialog->mapped = 1 ;
EndAction(ctx);
}