public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r8-10865] x86_64: Fix up -fpic -mcmodel=large -fno-plt [PR98063]
@ 2021-04-22 16:49 Jakub Jelinek
  0 siblings, 0 replies; only message in thread
From: Jakub Jelinek @ 2021-04-22 16:49 UTC (permalink / raw)
  To: gcc-cvs

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

commit r8-10865-gc15b958bc1ac1dfab49953721cb797a1cc9ea164
Author: Jakub Jelinek <jakub@redhat.com>
Date:   Tue Dec 1 10:44:40 2020 +0100

    x86_64: Fix up -fpic -mcmodel=large -fno-plt [PR98063]
    
    On the following testcase with -fpic -mcmodel=large -fno-plt we emit
    call puts@GOTPCREL(%rip)
    but that is not really appropriate for CM_LARGE_PIC, the .text can be larger
    than 2GB in that case and the .got slot further away from %rip than what can
    fit into the signed 32-bit immediate.
    
    The following patch computes the address of the .got slot the way it is
    computed for that model for function pointer loads, and calls that.
    
    2020-12-01  Jakub Jelinek  <jakub@redhat.com>
    
            PR target/98063
            * config/i386/i386.c (ix86_expand_call): Handle non-plt
            CM_LARGE_PIC calls.
    
            * gcc.target/i386/pr98063.c: New test.
    
    (cherry picked from commit ebc8606a9408623e2fa2a02a5526b882ffd0e7a8)

Diff:
---
 gcc/config/i386/i386.c                  | 12 +++++++++++-
 gcc/testsuite/gcc.target/i386/pr98063.c | 13 +++++++++++++
 2 files changed, 24 insertions(+), 1 deletion(-)

diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index d97d5c0f0fe..31502774ef3 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -28517,7 +28517,17 @@ ix86_expand_call (rtx retval, rtx fnaddr, rtx callarg1,
 	    }
 	  else if (!TARGET_PECOFF && !TARGET_MACHO)
 	    {
-	      if (TARGET_64BIT)
+	      if (TARGET_64BIT
+		  && ix86_cmodel == CM_LARGE_PIC
+		  && DEFAULT_ABI != MS_ABI)
+		{
+		  fnaddr = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, addr),
+					   UNSPEC_GOT);
+		  fnaddr = gen_rtx_CONST (Pmode, fnaddr);
+		  fnaddr = force_reg (Pmode, fnaddr);
+		  fnaddr = gen_rtx_PLUS (Pmode, pic_offset_table_rtx, fnaddr);
+		}
+	      else if (TARGET_64BIT)
 		{
 		  fnaddr = gen_rtx_UNSPEC (Pmode,
 					   gen_rtvec (1, addr),
diff --git a/gcc/testsuite/gcc.target/i386/pr98063.c b/gcc/testsuite/gcc.target/i386/pr98063.c
new file mode 100644
index 00000000000..f76435a7194
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr98063.c
@@ -0,0 +1,13 @@
+/* PR target/98063 */
+/* { dg-do run { target { i?86-*-linux* x86_64-*-linux* } } } */
+/* { dg-require-effective-target lp64 } */
+/* { dg-require-effective-target fpic } */
+/* { dg-options "-O2 -fpic -mcmodel=large -fno-plt -save-temps" } */
+/* { dg-final { scan-assembler-not "puts@GOTPCREL" } } */
+
+int
+main ()
+{
+  __builtin_puts ("Hello, world!");
+  return 0;
+}


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

only message in thread, other threads:[~2021-04-22 16:49 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-04-22 16:49 [gcc r8-10865] x86_64: Fix up -fpic -mcmodel=large -fno-plt [PR98063] Jakub Jelinek

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