aboutsummaryrefslogtreecommitdiff
path: root/gcc/config/rs6000/rs6000.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/config/rs6000/rs6000.c')
-rw-r--r--gcc/config/rs6000/rs6000.c18
1 files changed, 12 insertions, 6 deletions
diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c
index 85d6dbe..dbdb008 100644
--- a/gcc/config/rs6000/rs6000.c
+++ b/gcc/config/rs6000/rs6000.c
@@ -222,7 +222,7 @@ static const char * rs6000_xcoff_strip_name_encoding PARAMS ((const char *));
#endif
static void rs6000_xcoff_encode_section_info PARAMS ((tree, int))
ATTRIBUTE_UNUSED;
-static void rs6000_binds_local_p PARAMS ((tree));
+static bool rs6000_binds_local_p PARAMS ((tree));
static int rs6000_adjust_cost PARAMS ((rtx, rtx, rtx, int));
static int rs6000_adjust_priority PARAMS ((rtx, int));
static int rs6000_issue_rate PARAMS ((void));
@@ -9503,8 +9503,14 @@ function_ok_for_sibcall (fndecl)
}
}
if (DEFAULT_ABI == ABI_DARWIN
- || (TREE_ASM_WRITTEN (fndecl) && !flag_pic) || !TREE_PUBLIC (fndecl))
- return 1;
+ || (*targetm.binds_local_p) (fndecl))
+ {
+ tree attr_list = TYPE_ATTRIBUTES (TREE_TYPE (fndecl));
+
+ if (!lookup_attribute ("longcall", attr_list)
+ || lookup_attribute ("shortcall", attr_list))
+ return 1;
+ }
}
return 0;
}
@@ -13207,13 +13213,13 @@ rs6000_xcoff_encode_section_info (decl, first)
/* Cross-module name binding. For AIX and PPC64 Linux, which always are
PIC, use private copy of flag_pic. */
-static void
+static bool
rs6000_binds_local_p (decl)
tree decl;
{
if (DEFAULT_ABI == ABI_AIX)
- default_binds_local_p_1 (decl, rs6000_flag_pic);
+ return default_binds_local_p_1 (decl, rs6000_flag_pic);
else
- default_binds_local_p_1 (decl, flag_pic);
+ return default_binds_local_p_1 (decl, flag_pic);
}