aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Modra <amodra@bigpond.net.au>2004-11-27 01:06:55 +0000
committerAlan Modra <amodra@gcc.gnu.org>2004-11-27 11:36:55 +1030
commit3eb4e360ee7ce6cf014834653222157a50d9cc79 (patch)
treefe6313223241f2a345807a6943eaa87cf9653bcd
parent360e353587b4c3f654598babb476aed69f760b51 (diff)
downloadgcc-3eb4e360ee7ce6cf014834653222157a50d9cc79.zip
gcc-3eb4e360ee7ce6cf014834653222157a50d9cc79.tar.gz
gcc-3eb4e360ee7ce6cf014834653222157a50d9cc79.tar.bz2
re PR middle-end/12769 (-mlongcall doesn't convert all calls to long calls for builtin functions)
PR target/12769 * config/rs6000/rs6000.c (init_cumulative_args): Set call_cookie from rs6000_default_long_calls for libcalls. From-SVN: r91362
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/config/rs6000/rs6000.c12
2 files changed, 13 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 3ec691e..857aa8f 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2004-11-27 Alan Modra <amodra@bigpond.net.au>
+
+ PR target/12769
+ * config/rs6000/rs6000.c (init_cumulative_args): Set call_cookie
+ from rs6000_default_long_calls for libcalls.
+
2004-11-26 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
* expmed.c (extract_bit_field): When extracting from non-integer mode,
diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c
index 5511e4b..b7deebb 100644
--- a/gcc/config/rs6000/rs6000.c
+++ b/gcc/config/rs6000/rs6000.c
@@ -278,7 +278,8 @@ static GTY(()) int rs6000_sr_alias_set;
/* Call distance, overridden by -mlongcall and #pragma longcall(1).
The only place that looks at this is rs6000_set_default_type_attributes;
everywhere else should rely on the presence or absence of a longcall
- attribute on the function declaration. */
+ attribute on the function declaration. Exception: init_cumulative_args
+ looks at it too, for libcalls. */
int rs6000_default_long_calls;
const char *rs6000_longcall_switch;
@@ -4699,10 +4700,11 @@ init_cumulative_args (CUMULATIVE_ARGS *cum, tree fntype,
cum->nargs_prototype = n_named_args;
/* Check for a longcall attribute. */
- if (fntype
- && lookup_attribute ("longcall", TYPE_ATTRIBUTES (fntype))
- && !lookup_attribute ("shortcall", TYPE_ATTRIBUTES (fntype)))
- cum->call_cookie = CALL_LONG;
+ if ((!fntype && rs6000_default_long_calls)
+ || (fntype
+ && lookup_attribute ("longcall", TYPE_ATTRIBUTES (fntype))
+ && !lookup_attribute ("shortcall", TYPE_ATTRIBUTES (fntype))))
+ cum->call_cookie |= CALL_LONG;
if (TARGET_DEBUG_ARG)
{