Message ID | 20150901075113.GQ24814@bubble.grove.modra.org |
---|---|
State | New |
Headers | show |
On Tue, Sep 1, 2015 at 3:51 AM, Alan Modra <amodra@gmail.com> wrote: > 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. Okay. Thanks, David
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