wood@DG-RTP.DG.COM (Tom Wood) (01/17/90)
This is potentially a processor specific problem, but as far as I can tell
it isn't. I have a rather large sample program that when compiled will
generate a SIGSEGV from cc1. This occurs in GCC 1.35 on the m88100, but
the flaw is also in 1.36.92.
The loop in eliminate_frame_pointer (in reload1.c) starts off as follows:
for (insn = first; insn; insn = NEXT_INSN (insn))
{
rtx pattern = PATTERN (insn);
switch (GET_CODE (insn))
{
case INSN:
The SIGSEGV occurs when insn is "(barrier A B C)" and it's address is such
that PATTERN(insn) ((char *)insn + 16 on the 88k) is just off the edge
of the data segment. GET_CODE (insn) is UnKnown, so pattern is never used.
Here's the obvious change for this:
*** reload1.c.orig Tue Jan 16 14:53:51 1990
--- reload1.c Tue Jan 16 14:54:55 1990
***************
*** 1088,1097 ****
for (insn = first; insn; insn = NEXT_INSN (insn))
{
! rtx pattern = PATTERN (insn);
switch (GET_CODE (insn))
{
case INSN:
frame_pointer_address_altered = 0;
alter_frame_pointer_addresses (pattern, depth);
/* Rerecognize insn if changed. */
--- 1088,1098 ----
for (insn = first; insn; insn = NEXT_INSN (insn))
{
! rtx pattern;
switch (GET_CODE (insn))
{
case INSN:
+ pattern = PATTERN (insn);
frame_pointer_address_altered = 0;
alter_frame_pointer_addresses (pattern, depth);
/* Rerecognize insn if changed. */
***************
*** 1129,1134 ****
--- 1130,1136 ----
break;
case JUMP_INSN:
+ pattern = PATTERN (insn);
frame_pointer_address_altered = 0;
alter_frame_pointer_addresses (pattern, depth);
/* Rerecognize insn if changed. */
***************
*** 1155,1160 ****
--- 1157,1163 ----
break;
case CALL_INSN:
+ pattern = PATTERN (insn);
frame_pointer_address_altered = 0;
alter_frame_pointer_addresses (pattern, depth);
/* Rerecognize insn if changed. */