eirik@labs.labs.tek.com (Eirik Fuller) (10/15/89)
For gcc-1.36 configured via "config.gcc sun4-os4":
The enclosed file (window.c) causes an abort in gcc-cc1 at an
unrecognized instruction when compiled with -O -finline-functions
(gdb) r -O -finline-functions -quiet window.c
Starting program: /free/gnu/gcc-sun4/cc1 -O -finline-functions -quiet window.c
window.c: In function Fscroll_down:
window.c:242: The following insn was not recognizable:
(insn/i 25 24 26 (parallel[
(set (reg:SI 75)
(neg:SI (reg:SI 74)))
(clobber (reg:SI 8))
(clobber (reg:SI 9))
(clobber (reg:SI 12))
(clobber (reg:SI 13))
] ) -1 (insn_list 24 (nil))
(expr_list:REG_DEAD (reg:SI 74)
(expr_list:REG_DEAD (reg:SI 8)
(expr_list:REG_DEAD (reg:SI 9)
(expr_list:REG_DEAD (reg:SI 12)
(expr_list:REG_DEAD (reg:SI 13)
(nil)))))))
Bpt 1, #0 0xdde64 in abort ()
#1 0x23070 in fatal_insn_not_found (insn=(rtx) 0x1113b0) (toplev.c line 481)
(gdb) p insn
$8 = (rtx) 0x1113b0
(gdb) prc
INSN (VOIDmode)
(gdb) pi
$9 = {0x19, 0x111370, 0x111430, 0x1113d0, 0xffffffff, 0x111f08, 0x111ef8}
#2 0xc9c98 in insn_extract (insn=(rtx) 0x1113b0) (insn-extract.c line 1375)
#3 0x9ae5c in regclass (f=(rtx) 0x110f20, nregs=87) (regclass.c line 402)
(gdb) l
397 }
398 else
399 {
400 int insn_code_number = recog_memoized (insn);
401
402 insn_extract (insn);
403
404 for (i = insn_n_operands[insn_code_number] - 1; i >= 0; i--)
405 reg_class_record (recog_operand[i], i,
406 insn_operand_constraint[insn_code_number]);
(gdb) p f
$10 = (rtx) 0x110f20
(gdb) prc
NOTE (VOIDmode)
(gdb) pi
$11 = {0x2, 0x0, 0x111080, 0x0, 0xffffffff, 0x220400, 0x56}
(gdb)
Here, condensed from preprocessed GNU emacs sources, is window.c:
struct buffer_text
{
unsigned char *p1;
unsigned char *p2;
int size1;
int size2;
int gap;
int modified;
int head_clip;
int tail_clip;
int pointloc;
};
struct buffer
{
struct buffer_text text;
struct buffer *next;
int local_var_flags;
int save_modified;
int modtime;
int auto_save_modified;
int last_window_start;
struct UndoData *undodata;
struct Lisp_Vector *syntax_table_v;
int markers;
int name;
int filename;
int directory;
int backed_up;
int save_length;
int auto_save_file_name;
int read_only;
int mark;
int local_var_alist;
int major_mode;
int mode_name;
int mode_line_format;
int keymap;
int abbrev_table;
int case_fold_search;
int tab_width;
int fill_column;
int left_margin;
int auto_fill_hook;
int truncate_lines;
int ctl_arrow;
int selective_display;
int selective_display_ellipses;
int minor_modes;
int overwrite_mode;
int abbrev_mode;
};
enum Lisp_Type
{
Lisp_Int,
Lisp_Symbol,
Lisp_Marker,
Lisp_String,
Lisp_Vector,
Lisp_Cons,
Lisp_Object_Unused_1,
Lisp_Buffer,
Lisp_Subr,
Lisp_Internal,
Lisp_Intfwd,
Lisp_Boolfwd,
Lisp_Process,
Lisp_Objfwd,
Lisp_Object_Unused_2,
Lisp_Internal_Stream,
Lisp_Buffer_Local_Value,
Lisp_Some_Buffer_Local_Value,
Lisp_Buffer_Objfwd,
Lisp_Void,
Lisp_Window,
Lisp_Window_Configuration
};
struct position
{
int bufpos;
int hpos;
int vpos;
int prevhpos;
int contin;
};
struct position *compute_motion ();
extern int Qt, Qnil, Qbeginning_of_buffer, Qend_of_buffer, Qminus,
selected_window, minibuf_window, Qinteger_or_marker_p;
int next_screen_context_lines, Qwindowp;
extern struct buffer_text bf_text;
extern struct buffer *bf_cur;
struct window
{
int size;
struct Lisp_Vector *vec_next;
int next;
int prev;
int hchild, vchild;
int parent;
int left;
int top;
int height;
int width;
int buffer;
int start;
int pointm;
int force_start;
int hscroll;
int use_time;
int sequence_number;
int temslot;
int last_modified;
int last_point;
int last_point_x;
int last_point_y;
int last_mark_x;
int last_mark_y;
int window_end_pos;
int window_end_valid;
int window_end_vpos;
int redo_mode_line;
int start_at_line_beg;
};
int Fpos_visible_in_window_p
(pos, window)
int pos, window;
{
register struct window *w;
register int top;
register int height;
register int posint;
register struct buffer_text *text;
struct position posval;
if ( ((pos) == (Qnil) ) )
posint = bf_text.pointloc ;
else
{
{ if (((enum Lisp_Type) (((pos)) >> 24 )) == Lisp_Marker) (pos) = marker_position (pos); else if (((enum Lisp_Type) (((pos)) >> 24 )) != Lisp_Int) pos = wrong_type_argument (Qinteger_or_marker_p, (pos)); } ;
posint = (((pos) << 32 -24 ) >> 32 -24 ) ;
}
if ( ((window) == (Qnil) ) )
window = selected_window;
else
{ if (((enum Lisp_Type) (((window)) >> 24 )) != Lisp_Window) window = wrong_type_argument (Qwindowp, (window)); } ;
w = ((struct window *) ((window) & ((1<<24 ) - 1) ) ) ;
top = marker_position (w->start);
if (posint < top)
return Qnil;
height = (w->height) - !((window) == ( minibuf_window) ) ;
bf_cur->text = bf_text;
text = &((struct buffer *) ((w->buffer) & ((1<<24 ) - 1) ) ) ->text;
if ((w->last_modified) >= text->modified)
{
if (posint < text->size1 + text->size2 + 1 - (w->window_end_pos)
|| ((w->window_end_vpos) < height))
return Qt;
return Qnil;
}
else
{
if (posint > text->size1 + text->size2 + 1)
return Qnil;
posval = *compute_motion (top, 0, 0,
posint, height, 0,
(w->width) - 1
- ((w->width) + (w->left) != (((struct window *) ((minibuf_window) & ((1<<24 ) - 1) ) ) ->width) ),
(((w->hscroll) << 32 -24 ) >> 32 -24 ) , 0);
return posval.vpos < height ? Qt : Qnil;
}
}
static
window_scroll (window, n)
int window;
int n;
{
register struct window *w = ((struct window *) ((window) & ((1<<24 ) - 1) ) ) ;
register int opoint = bf_text.pointloc ;
register int ht, pos;
register int tem;
int lose;
int bolp;
ht = (w->height) - !((window) == ( minibuf_window) ) ;
(tem) = bf_text.pointloc ;
tem = Fpos_visible_in_window_p (tem, window);
if ( ((tem) == (Qnil) ) )
{
Fvertical_motion (make_number (- ht / 2));
(tem) = bf_text.pointloc ;
Fset_marker (w->start, tem, w->buffer);
w->force_start = Qt;
}
bf_text.pointloc = (marker_position (w->start));
lose = n < 0 && bf_text.pointloc == bf_text.head_clip ;
Fvertical_motion (make_number (n));
pos = bf_text.pointloc ;
bolp = Fbolp ();
bf_text.pointloc = (opoint);
if (lose)
Fsignal (Qbeginning_of_buffer, Qnil);
if (pos < (bf_text.size1+bf_text.size2-bf_text.tail_clip) + 1)
{
Fset_marker (w->start, make_number (pos), w->buffer);
w->start_at_line_beg = bolp;
w->redo_mode_line = Qt;
(w->last_modified) = 0;
if (pos > opoint)
bf_text.pointloc = (pos);
if (n < 0)
{
bf_text.pointloc = (pos);
tem = Fvertical_motion (make_number (ht));
if (bf_text.pointloc > opoint || (tem) < ht)
bf_text.pointloc = (opoint);
else
Fvertical_motion (make_number (-1));
}
}
else
Fsignal (Qend_of_buffer, Qnil);
}
scroll_command (n, direction)
register int n;
int direction;
{
register int defalt
= direction * (window_height (selected_window) - 1
- next_screen_context_lines);
if ( ((n) == (Qnil) ) )
window_scroll (selected_window, defalt);
else if (((n) == ( Qminus) ) )
window_scroll (selected_window, - defalt);
else
{
n = Fprefix_numeric_value (n);
window_scroll (selected_window, (((n) << 32 -24 ) >> 32 -24 ) * direction);
}
}
int Fscroll_down (n)
int n;
{
scroll_command (n, -1);
return Qnil;
}