From 626ab8545065eb6e0fe579cb19e2f82091dccf73 Mon Sep 17 00:00:00 2001 From: wilson Date: Thu, 20 May 2010 06:26:52 +0000 Subject: [PATCH] PR target/43764 * 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@159610 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 7 +++++++ gcc/config/mips/mips.c | 31 ++++++++++++++++++++++++------- 2 files changed, 31 insertions(+), 7 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3816df0210e..d372423708c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2010-05-19 James E. Wilson + + PR target/43764 + * 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. + 2010-05-19 Joseph Myers * diagnostic.c (FLOAT, FFS): Don't undefine. diff --git a/gcc/config/mips/mips.c b/gcc/config/mips/mips.c index e0b594f41be..38664b5aac4 100644 --- a/gcc/config/mips/mips.c +++ b/gcc/config/mips/mips.c @@ -14006,23 +14006,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; } @@ -14154,9 +14166,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))); @@ -14166,7 +14179,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); + } } } -- 2.11.4.GIT