A weak symbol defined in the current object file may not turn out to
be the definition used at link time, if other copies of the symbol
exist.  This means they can't be considered file local;  Calls to
weak functions need a nop so that the linker can replace it with a toc
restoring insn if the function uses a different toc pointer to its
caller (for linker grouping of TOC into multiple sections).

Bootstrapped and regression tested powerpc64-linux.  OK for active
branches?

        PR target/67417
        * config/rs6000/predicates.md (current_file_function_operand): Don't
        return true for weak symbols.
        * config/rs6000/rs6000.c (rs6000_function_ok_for_sibcall): Likewise.

diff --git a/gcc/config/rs6000/predicates.md b/gcc/config/rs6000/predicates.md
index 6020a08..2e59b22 100644
--- a/gcc/config/rs6000/predicates.md
+++ b/gcc/config/rs6000/predicates.md
@@ -883,12 +883,12 @@
 (define_predicate "current_file_function_operand"
   (and (match_code "symbol_ref")
        (match_test "(DEFAULT_ABI != ABI_AIX || SYMBOL_REF_FUNCTION_P (op))
-                   && ((SYMBOL_REF_LOCAL_P (op)
-                        && ((DEFAULT_ABI != ABI_AIX
-                             && DEFAULT_ABI != ABI_ELFv2)
-                            || !SYMBOL_REF_EXTERNAL_P (op)))
-                       || (op == XEXP (DECL_RTL (current_function_decl),
-                                                 0)))")))
+                   && (SYMBOL_REF_LOCAL_P (op)
+                       || op == XEXP (DECL_RTL (current_function_decl), 0))
+                   && !((DEFAULT_ABI == ABI_AIX
+                         || DEFAULT_ABI == ABI_ELFv2)
+                        && (SYMBOL_REF_EXTERNAL_P (op)
+                            || SYMBOL_REF_WEAK (op)))")))
 
 ;; Return 1 if this operand is a valid input for a move insn.
 (define_predicate "input_operand"
diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c
index e1332c1..fa646b5 100644
--- a/gcc/config/rs6000/rs6000.c
+++ b/gcc/config/rs6000/rs6000.c
@@ -22659,6 +22659,7 @@ rs6000_function_ok_for_sibcall (tree decl, tree exp)
       || ((DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_ELFv2)
          && decl
          && !DECL_EXTERNAL (decl)
+         && !DECL_WEAK (decl)
          && (*targetm.binds_local_p) (decl))
       || (DEFAULT_ABI == ABI_V4
          && (!TARGET_SECURE_PLT

-- 
Alan Modra
Australia Development Lab, IBM

Reply via email to