jonathan@comp.vuw.ac.nz (Jonathan) (11/28/88)
[[ Please mail any replies to me; we don't get the mailing list here.
Apologies if this has been fixed already. ]]
Summary::
Function copy_rtx_if_shared () in GCC-1.30 contains references
to XEP(x, 1) of rtx x, when RTX_CODE(x) == MEM.
Since rtx_length[MEM] == 1, this must be wrong.
Symptom::
GCC 1.30, built with my Pyramid machine description, on a Vax,
as a cross-compiler, dumps core when compiling function calls that
pass more than 12 arguments to the callee. (Pyramids provide
12 registers for passing arguments.)
Repeat-By::
Tricky, without the Pyramid machine description.
Hence the following:
Diagnosis::
Gdb shows that cc1 is dying in copy_rtx_if_shared(), on the
indicated line:
case MEM:
[... code omitted ...]
if (GET_CODE (XEXP (x, 0)) == REG
&& (REGNO (XEXP (x, 0)) == FRAME_POINTER_REGNUM
|| REGNO (XEXP (x, 0)) == ARG_POINTER_REGNUM)
=> && CONSTANT_ADDRESS_P (XEXP (x, 1)))
return x; ^
|
huh???
MEMs only have one field. Surely this code is bogus.
Using the gdb and the -dr flag to cc1, x points to the MEM
part of the rtl generated to pass the 13th argument:
(insn 63 62 64 (set (mem:SI (reg:SI 14))
(const_int 13)) -1 (nil)
(nil))
[[Register 14 is the data stack/argument pointer.]]
Fix-By:
Removing the if() and return included above is surely safe, but will
result in unnecessary copying of shared structure. There must
be a better fix.
It's hard to come up with one, since I don't understand what
the original code was intended to do. Perhaps
if (GET_CODE (XEXP (x, 0)) == REG
&& (REGNO (XEXP (x, 0)) == FRAME_POINTER_REGNUM
|| REGNO (XEXP (x, 0)) == ARG_POINTER_REGNUM))
is correct?