From f00b0f17d6889d811468c2c77508fbea8bfc377d Mon Sep 17 00:00:00 2001 From: Claudiu Zissulescu Date: Tue, 19 Jan 2016 14:40:16 +0100 Subject: [PATCH] UPDATE1: Fix handling complex PIC moves. The arc_legitimate_pc_offset_p condition is too lax. Updated it. The fix is done in development tree: [arc-4.8-dev f00b0f1] and will be a part of the next release of ARC GNU tools. Once that new release happens this patch must be removed. gcc/ 2016-01-18 Claudiu Zissulescu * config/arc/arc.c (arc_needs_pcl_p ): New function (arc_legitimate_pc_offset_p): Use arc_needs_pcl_p. --- gcc/config/arc/arc.c | 42 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 40 insertions(+), 2 deletions(-) diff --git a/gcc/config/arc/arc.c b/gcc/config/arc/arc.c index f7cae9f..18d88a3 100644 --- a/gcc/config/arc/arc.c +++ b/gcc/config/arc/arc.c @@ -5234,6 +5234,45 @@ arc_rtx_costs (rtx x, int code, int outer_code, int opno ATTRIBUTE_UNUSED, } } +/* Helper used by arc_legitimate_pc_offset_p. */ + +static bool +arc_needs_pcl_p (rtx x) +{ + register const char *fmt; + register int i, j; + + if ((GET_CODE (x) == UNSPEC) + && (XVECLEN (x, 0) == 1) + && (GET_CODE (XVECEXP (x, 0, 0)) == SYMBOL_REF)) + switch (XINT (x, 1)) + { + case ARC_UNSPEC_GOT: + case ARC_UNSPEC_GOTOFFPC: + case UNSPEC_TLS_GD: + case UNSPEC_TLS_IE: + return true; + default: + break; + } + + fmt = GET_RTX_FORMAT (GET_CODE (x)); + for (i = GET_RTX_LENGTH (GET_CODE (x)) - 1; i >= 0; i--) + { + if (fmt[i] == 'e') + { + if (arc_needs_pcl_p (XEXP (x, i))) + return true; + } + else if (fmt[i] == 'E') + for (j = XVECLEN (x, i) - 1; j >= 0; j--) + if (arc_needs_pcl_p (XVECEXP (x, i, j))) + return true; + } + + return false; +} + /* Return true if ADDR is an address that needs to be expressed as an explicit sum of pcl + offset. */ @@ -5242,8 +5281,7 @@ arc_legitimate_pc_offset_p (rtx addr) { if (GET_CODE (addr) != CONST) return false; - addr = XEXP (addr, 0); - return flag_pic && !arc_raw_symbolic_reference_mentioned_p (addr, false); + return arc_needs_pcl_p (addr); } /* Return true if ADDR is a valid pic address. -- 2.5.0