public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [RS6000] Weak functions may not be file local
@ 2015-09-01  7:51 Alan Modra
  2015-09-01 14:06 ` David Edelsohn
  0 siblings, 1 reply; 2+ messages in thread
From: Alan Modra @ 2015-09-01  7:51 UTC (permalink / raw)
  To: gcc-patches; +Cc: David Edelsohn

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

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [RS6000] Weak functions may not be file local
  2015-09-01  7:51 [RS6000] Weak functions may not be file local Alan Modra
@ 2015-09-01 14:06 ` David Edelsohn
  0 siblings, 0 replies; 2+ messages in thread
From: David Edelsohn @ 2015-09-01 14:06 UTC (permalink / raw)
  To: Alan Modra; +Cc: GCC Patches

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

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2015-09-01 14:06 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-09-01  7:51 [RS6000] Weak functions may not be file local Alan Modra
2015-09-01 14:06 ` David Edelsohn

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).