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