summaryrefslogtreecommitdiff
path: root/meta/recipes-devtools/gcc/gcc-4.6.0/gcc-4_6-branch-backports/0365-gcc.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta/recipes-devtools/gcc/gcc-4.6.0/gcc-4_6-branch-backports/0365-gcc.patch')
-rw-r--r--meta/recipes-devtools/gcc/gcc-4.6.0/gcc-4_6-branch-backports/0365-gcc.patch125
1 files changed, 125 insertions, 0 deletions
diff --git a/meta/recipes-devtools/gcc/gcc-4.6.0/gcc-4_6-branch-backports/0365-gcc.patch b/meta/recipes-devtools/gcc/gcc-4.6.0/gcc-4_6-branch-backports/0365-gcc.patch
new file mode 100644
index 000000000..378076392
--- /dev/null
+++ b/meta/recipes-devtools/gcc/gcc-4.6.0/gcc-4_6-branch-backports/0365-gcc.patch
@@ -0,0 +1,125 @@
+From 158892fce220b03d3fe3d8d7656e1b0786609283 Mon Sep 17 00:00:00 2001
+From: rsandifo <rsandifo@138bc75d-0d04-0410-961f-82ee72b054a4>
+Date: Sun, 29 May 2011 17:47:51 +0000
+Subject: [PATCH] gcc/
+ PR target/43995
+ * config/mips/mips.c (mips_pic_call_symbol_from_set): Add a
+ recurse_p argument. Only follow register copies if it is set,
+ and prevent mips_find_pic_call_symbol from recursing.
+ (mips_find_pic_call_symbol): Add a recurse_p argument.
+ Pass it to mips_pic_call_symbol_from_set.
+ (mips_annotate_pic_calls): Update accordingly.
+
+git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_6-branch@174404 138bc75d-0d04-0410-961f-82ee72b054a4
+
+index 9de479b..027fc2d 100644
+--- a/gcc/config/mips/mips.c
++++ b/gcc/config/mips/mips.c
+@@ -1186,7 +1186,7 @@ static const struct mips_rtx_cost_data
+ }
+ };
+
+-static rtx mips_find_pic_call_symbol (rtx, rtx);
++static rtx mips_find_pic_call_symbol (rtx, rtx, bool);
+ static int mips_register_move_cost (enum machine_mode, reg_class_t,
+ reg_class_t);
+ static unsigned int mips_function_arg_boundary (enum machine_mode, const_tree);
+@@ -14160,12 +14160,16 @@ mips_call_expr_from_insn (rtx insn, rtx *second_call)
+ }
+
+ /* REG is set in DEF. See if the definition is one of the ways we load a
+- register with a symbol address for a mips_use_pic_fn_addr_reg_p call. If
+- it is return the symbol reference of the function, otherwise return
+- NULL_RTX. */
++ register with a symbol address for a mips_use_pic_fn_addr_reg_p call.
++ If it is, return the symbol reference of the function, otherwise return
++ NULL_RTX.
++
++ If RECURSE_P is true, use mips_find_pic_call_symbol to interpret
++ the values of source registers, otherwise treat such registers as
++ having an unknown value. */
+
+ static rtx
+-mips_pic_call_symbol_from_set (df_ref def, rtx reg)
++mips_pic_call_symbol_from_set (df_ref def, rtx reg, bool recurse_p)
+ {
+ rtx def_insn, set;
+
+@@ -14192,21 +14196,39 @@ mips_pic_call_symbol_from_set (df_ref def, rtx reg)
+ return symbol;
+ }
+
+- /* Follow simple register copies. */
+- if (REG_P (src))
+- return mips_find_pic_call_symbol (def_insn, src);
++ /* Follow at most one simple register copy. Such copies are
++ interesting in cases like:
++
++ for (...)
++ {
++ locally_binding_fn (...);
++ }
++
++ and:
++
++ locally_binding_fn (...);
++ ...
++ locally_binding_fn (...);
++
++ where the load of locally_binding_fn can legitimately be
++ hoisted or shared. However, we do not expect to see complex
++ chains of copies, so a full worklist solution to the problem
++ would probably be overkill. */
++ if (recurse_p && REG_P (src))
++ return mips_find_pic_call_symbol (def_insn, src, false);
+ }
+
+ return NULL_RTX;
+ }
+
+-/* Find the definition of the use of REG in INSN. See if the definition is
+- one of the ways we load a register with a symbol address for a
+- mips_use_pic_fn_addr_reg_p call. If it is return the symbol reference of
+- the function, otherwise return NULL_RTX. */
++/* Find the definition of the use of REG in INSN. See if the definition
++ is one of the ways we load a register with a symbol address for a
++ mips_use_pic_fn_addr_reg_p call. If it is return the symbol reference
++ of the function, otherwise return NULL_RTX. RECURSE_P is as for
++ mips_pic_call_symbol_from_set. */
+
+ static rtx
+-mips_find_pic_call_symbol (rtx insn, rtx reg)
++mips_find_pic_call_symbol (rtx insn, rtx reg, bool recurse_p)
+ {
+ df_ref use;
+ struct df_link *defs;
+@@ -14218,7 +14240,7 @@ mips_find_pic_call_symbol (rtx insn, rtx reg)
+ defs = DF_REF_CHAIN (use);
+ if (!defs)
+ return NULL_RTX;
+- symbol = mips_pic_call_symbol_from_set (defs->ref, reg);
++ symbol = mips_pic_call_symbol_from_set (defs->ref, reg, recurse_p);
+ if (!symbol)
+ return NULL_RTX;
+
+@@ -14227,7 +14249,7 @@ mips_find_pic_call_symbol (rtx insn, rtx reg)
+ {
+ rtx other;
+
+- other = mips_pic_call_symbol_from_set (defs->ref, reg);
++ other = mips_pic_call_symbol_from_set (defs->ref, reg, recurse_p);
+ if (!rtx_equal_p (symbol, other))
+ return NULL_RTX;
+ }
+@@ -14298,7 +14320,7 @@ mips_annotate_pic_calls (void)
+ if (!REG_P (reg))
+ continue;
+
+- symbol = mips_find_pic_call_symbol (insn, reg);
++ symbol = mips_find_pic_call_symbol (insn, reg, true);
+ if (symbol)
+ {
+ mips_annotate_pic_call_expr (call, symbol);
+--
+1.7.0.4
+