varasm.c (decode_rtx_const): Allow unspec (symbol_ref) in constant pool to be identical by string address...

* varasm.c (decode_rtx_const): Allow unspec (symbol_ref) in
     constant pool to be identical by string address and index.

From-SVN: r49471
This commit is contained in:
Hartmut Penner 2002-02-04 08:29:08 +00:00 committed by Hartmut Penner
parent f7948d5146
commit fecaac3765
2 changed files with 26 additions and 3 deletions

View File

@ -1,3 +1,8 @@
2002-02-04 Hartmut Penner <hpenner@de.ibm.com>
* varasm.c (decode_rtx_const): Allow unspec (symbol_ref) in
constant pool to be identical by string address and index.
2002-02-04 Anthony Green <green@redhat.com>
* output.h (SECTION_OVERRIDE): Define.

View File

@ -2382,7 +2382,7 @@ decode_addr_const (exp, value)
value->offset = offset;
}
enum kind { RTX_DOUBLE, RTX_INT };
enum kind { RTX_DOUBLE, RTX_INT, RTX_UNSPEC };
struct rtx_const
{
ENUM_BITFIELD(kind) kind : 16;
@ -3613,7 +3613,24 @@ decode_rtx_const (mode, x, value)
abort ();
}
if (value->kind == RTX_INT && value->un.addr.base != 0)
if (value->kind == RTX_INT && value->un.addr.base != 0
&& GET_CODE (value->un.addr.base) == UNSPEC)
{
/* For a simple UNSPEC, the base is set to the
operand, the kind field is set to the index of
the unspec expression.
Together with the code below, in case that
the operand is a SYMBOL_REF or LABEL_REF,
the address of the string or the code_label
is taken as base. */
if (XVECLEN (value->un.addr.base, 0) == 1)
{
value->kind = RTX_UNSPEC + XINT (value->un.addr.base, 1);
value->un.addr.base = XVECEXP (value->un.addr.base, 0, 0);
}
}
if (value->kind != RTX_DOUBLE && value->un.addr.base != 0)
switch (GET_CODE (value->un.addr.base))
{
case SYMBOL_REF:
@ -3643,7 +3660,8 @@ simplify_subtraction (x)
decode_rtx_const (GET_MODE (x), XEXP (x, 0), &val0);
decode_rtx_const (GET_MODE (x), XEXP (x, 1), &val1);
if (val0.un.addr.base == val1.un.addr.base)
if (val0.kind != RTX_DOUBLE && val0.kind == val1.kind
&& val0.un.addr.base == val1.un.addr.base)
return GEN_INT (val0.un.addr.offset - val1.un.addr.offset);
return x;
}