Patchwork RFA: Backport fix for PR43764 to 4.5

login
register
mail settings
Submitter Richard Sandiford
Date Sept. 19, 2010, 6:51 p.m.
Message ID <87wrqh4le8.fsf@firetop.home>
Download mbox | patch
Permalink /patch/65167/
State New
Headers show

Comments

Richard Sandiford - Sept. 19, 2010, 6:51 p.m.
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.

Patch

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);
+	}
     }
 }