This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
RFA: Backport fix for PR43764 to 4.5
- From: Richard Sandiford <rdsandiford at googlemail dot com>
- To: gcc-patches at gcc dot gnu dot org
- Date: Sun, 19 Sep 2010 19:51:27 +0100
- Subject: RFA: Backport fix for PR43764 to 4.5
This MIPS-specific patch from Jim Wilson fixes a lot of failures on
o32 GNU/Linux targets. Is it OK to backport to 4.5? Tested there on
mips64-linux-gnu (-mabi=32, -mabi=n32, -mabi=64, -mabi=32/-mips16).
Richard
gcc/
Backport from mainline:
2010-05-19 James E. Wilson <wilson@codesourcery.com>
PR target/43764
* config/mips/mips.c (mips_call_expr_from_insn): New arg second_call.
Set it.
(mips_annotate_pic_calls): Pass new arg to mips_call_expr_from_insn.
Use it.
Index: gcc/config/mips/mips.c
===================================================================
--- gcc/config/mips/mips.c 2010-09-19 12:04:04.000000000 +0100
+++ gcc/config/mips/mips.c 2010-09-19 12:04:04.000000000 +0100
@@ -14007,23 +14007,35 @@ r10k_insert_cache_barriers (void)
}
/* If INSN is a call, return the underlying CALL expr. Return NULL_RTX
- otherwise. */
+ otherwise. If INSN has two call rtx, then store the second one in
+ SECOND_CALL. */
static rtx
-mips_call_expr_from_insn (rtx insn)
+mips_call_expr_from_insn (rtx insn, rtx *second_call)
{
rtx x;
+ rtx x2;
if (!CALL_P (insn))
return NULL_RTX;
x = PATTERN (insn);
if (GET_CODE (x) == PARALLEL)
- x = XVECEXP (x, 0, 0);
+ {
+ /* Calls returning complex values have two CALL rtx. Look for the second
+ one here, and return it via the SECOND_CALL arg. */
+ x2 = XVECEXP (x, 0, 1);
+ if (GET_CODE (x2) == SET)
+ x2 = XEXP (x2, 1);
+ if (GET_CODE (x2) == CALL)
+ *second_call = x2;
+
+ x = XVECEXP (x, 0, 0);
+ }
if (GET_CODE (x) == SET)
x = XEXP (x, 1);
-
gcc_assert (GET_CODE (x) == CALL);
+
return x;
}
@@ -14155,9 +14167,10 @@ mips_annotate_pic_calls (void)
FOR_EACH_BB (bb)
FOR_BB_INSNS (bb, insn)
{
- rtx call, reg, symbol;
+ rtx call, reg, symbol, second_call;
- call = mips_call_expr_from_insn (insn);
+ second_call = 0;
+ call = mips_call_expr_from_insn (insn, &second_call);
if (!call)
continue;
gcc_assert (MEM_P (XEXP (call, 0)));
@@ -14167,7 +14180,11 @@ mips_annotate_pic_calls (void)
symbol = mips_find_pic_call_symbol (insn, reg);
if (symbol)
- mips_annotate_pic_call_expr (call, symbol);
+ {
+ mips_annotate_pic_call_expr (call, symbol);
+ if (second_call)
+ mips_annotate_pic_call_expr (second_call, symbol);
+ }
}
}