[RS6000] Weak functions may not be file local

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.

	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.

From-SVN: r227386
This commit is contained in:
Alan Modra 2015-09-02 08:33:19 +09:30 committed by Alan Modra
parent 22219d9b1a
commit b2c72901da
3 changed files with 14 additions and 6 deletions

View File

@ -1,3 +1,10 @@
2015-09-02 Alan Modra <amodra@gmail.com>
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.
2015-09-01 Matthew Fortune <matthew.fortune@imgtec.com> 2015-09-01 Matthew Fortune <matthew.fortune@imgtec.com>
Andrew Bennett <andrew.bennett@imgtec.com> Andrew Bennett <andrew.bennett@imgtec.com>

View File

@ -902,12 +902,12 @@
(define_predicate "current_file_function_operand" (define_predicate "current_file_function_operand"
(and (match_code "symbol_ref") (and (match_code "symbol_ref")
(match_test "(DEFAULT_ABI != ABI_AIX || SYMBOL_REF_FUNCTION_P (op)) (match_test "(DEFAULT_ABI != ABI_AIX || SYMBOL_REF_FUNCTION_P (op))
&& ((SYMBOL_REF_LOCAL_P (op) && (SYMBOL_REF_LOCAL_P (op)
&& ((DEFAULT_ABI != ABI_AIX || op == XEXP (DECL_RTL (current_function_decl), 0))
&& DEFAULT_ABI != ABI_ELFv2) && !((DEFAULT_ABI == ABI_AIX
|| !SYMBOL_REF_EXTERNAL_P (op))) || DEFAULT_ABI == ABI_ELFv2)
|| (op == XEXP (DECL_RTL (current_function_decl), && (SYMBOL_REF_EXTERNAL_P (op)
0)))"))) || SYMBOL_REF_WEAK (op)))")))
;; Return 1 if this operand is a valid input for a move insn. ;; Return 1 if this operand is a valid input for a move insn.
(define_predicate "input_operand" (define_predicate "input_operand"

View File

@ -22833,6 +22833,7 @@ rs6000_function_ok_for_sibcall (tree decl, tree exp)
|| ((DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_ELFv2) || ((DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_ELFv2)
&& decl && decl
&& !DECL_EXTERNAL (decl) && !DECL_EXTERNAL (decl)
&& !DECL_WEAK (decl)
&& (*targetm.binds_local_p) (decl)) && (*targetm.binds_local_p) (decl))
|| (DEFAULT_ABI == ABI_V4 || (DEFAULT_ABI == ABI_V4
&& (!TARGET_SECURE_PLT && (!TARGET_SECURE_PLT