From fecaac3765895574348015a1794de65c2e2a64c6 Mon Sep 17 00:00:00 2001 From: Hartmut Penner Date: Mon, 4 Feb 2002 08:29:08 +0000 Subject: [PATCH] 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 --- gcc/ChangeLog | 5 +++++ gcc/varasm.c | 24 +++++++++++++++++++++--- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index babb0e450c8..1b6153b6000 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2002-02-04 Hartmut Penner + + * 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 * output.h (SECTION_OVERRIDE): Define. diff --git a/gcc/varasm.c b/gcc/varasm.c index 8bd5807c46d..18d200863ab 100644 --- a/gcc/varasm.c +++ b/gcc/varasm.c @@ -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; }