public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r10-10797] Darwin, X86: Adjust call clobbers to allow for lazy-binding [PR 100152].
@ 2022-05-29 19:13 Iain D Sandoe
  0 siblings, 0 replies; only message in thread
From: Iain D Sandoe @ 2022-05-29 19:13 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:b6a762bf4645d495ea2218dbabcebd0c15eb60fc

commit r10-10797-gb6a762bf4645d495ea2218dbabcebd0c15eb60fc
Author: Iain Sandoe <iain@sandoe.co.uk>
Date:   Mon May 3 08:22:53 2021 +0100

    Darwin, X86: Adjust call clobbers to allow for lazy-binding [PR 100152].
    
    We allow public functions defined in a TU to bind locally for PIC
    code (the default) on 64bit Mach-O.
    
    If such functions are not inlined, we cannot tell at compile-time if
    they might be called via the lazy symbol resolver (this can depend on
    options given at link-time).  Therefore, we must assume that the lazy
    resolver could be used which clobbers R11 and R10.
    
    Signed-off-by: Iain Sandoe <iain@sandoe.co.uk>
    
    gcc/ChangeLog:
    
            PR target/100152
            * config/i386/i386-expand.c (ix86_expand_call): If a call is
            to a non-local-binding, or local but to a public symbol, then
            assume that it might be indirected via the lazy symbol binder.
            Mark R10 and R10 as clobbered in that case.
    
    (cherry picked from commit 41bd1b190358fce213f5add8396faf14a32d5c23)

Diff:
---
 gcc/config/i386/i386-expand.c | 16 +++++++++++++++-
 1 file changed, 15 insertions(+), 1 deletion(-)

diff --git a/gcc/config/i386/i386-expand.c b/gcc/config/i386/i386-expand.c
index 011bad04770..6075532b8c9 100644
--- a/gcc/config/i386/i386-expand.c
+++ b/gcc/config/i386/i386-expand.c
@@ -7943,6 +7943,7 @@ ix86_expand_call (rtx retval, rtx fnaddr, rtx callarg1,
     pop = NULL;
   gcc_assert (!TARGET_64BIT || !pop);
 
+  rtx addr = XEXP (fnaddr, 0);
   if (TARGET_MACHO && !TARGET_64BIT)
     {
 #if TARGET_MACHO
@@ -7955,7 +7956,6 @@ ix86_expand_call (rtx retval, rtx fnaddr, rtx callarg1,
       /* Static functions and indirect calls don't need the pic register.  Also,
 	 check if PLT was explicitly avoided via no-plt or "noplt" attribute, making
 	 it an indirect call.  */
-      rtx addr = XEXP (fnaddr, 0);
       if (flag_pic
 	  && GET_CODE (addr) == SYMBOL_REF
 	  && !SYMBOL_REF_LOCAL_P (addr))
@@ -8118,6 +8118,20 @@ ix86_expand_call (rtx retval, rtx fnaddr, rtx callarg1,
 	}
     }
 
+  if (TARGET_MACHO && TARGET_64BIT && !sibcall
+      && ((GET_CODE (addr) == SYMBOL_REF && !SYMBOL_REF_LOCAL_P (addr))
+	  || !fndecl || TREE_PUBLIC (fndecl)))
+    {
+      /* We allow public functions defined in a TU to bind locally for PIC
+	 code (the default) on 64bit Mach-O.
+	 If such functions are not inlined, we cannot tell at compile-time if
+	 they will be called via the lazy symbol resolver (this can depend on
+	 options given at link-time).  Therefore, we must assume that the lazy
+	 resolver could be used which clobbers R11 and R10.  */
+      clobber_reg (&use, gen_rtx_REG (DImode, R11_REG));
+      clobber_reg (&use, gen_rtx_REG (DImode, R10_REG));
+    }
+
   if (vec_len > 1)
     call = gen_rtx_PARALLEL (VOIDmode, gen_rtvec_v (vec_len, vec));
   rtx_insn *call_insn = emit_call_insn (call);


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2022-05-29 19:13 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-05-29 19:13 [gcc r10-10797] Darwin, X86: Adjust call clobbers to allow for lazy-binding [PR 100152] Iain D Sandoe

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).