aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorH.J. Lu <hongjiu.lu@intel.com>2019-01-22 14:53:41 +0000
committerH.J. Lu <hjl@gcc.gnu.org>2019-01-22 06:53:41 -0800
commit12f154688d9e942614d49178dee92b766afb64bb (patch)
treeedc5ed79863d994cd35b293ee30303d2db1928e4
parent44a7251e1e97caf3b2315f20d48519ff8fced152 (diff)
downloadgcc-12f154688d9e942614d49178dee92b766afb64bb.zip
gcc-12f154688d9e942614d49178dee92b766afb64bb.tar.gz
gcc-12f154688d9e942614d49178dee92b766afb64bb.tar.bz2
i386: Load external function address via GOT slot
With noplt attribute, we load the external function address via the GOT slot so that linker won't create an PLT entry for extern function address. gcc/ PR target/88954 * config/i386/i386.c (ix86_force_load_from_GOT_p): Also check noplt attribute. gcc/testsuite/ PR target/88954 * gcc.target/i386/pr88954-1.c: New test. * gcc.target/i386/pr88954-2.c: Likewise. From-SVN: r268152
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/config/i386/i386.c6
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/gcc.target/i386/pr88954-1.c15
-rw-r--r--gcc/testsuite/gcc.target/i386/pr88954-2.c16
5 files changed, 48 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 2409e7f..88c2e14 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2019-01-22 H.J. Lu <hongjiu.lu@intel.com>
+
+ PR target/88954
+ * config/i386/i386.c (ix86_force_load_from_GOT_p): Also check
+ noplt attribute.
+
2019-01-22 Richard Earnshaw <rearnsha@arm.com>
PR target/88469
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index 88557f2..7485a86 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -15189,10 +15189,14 @@ ix86_force_load_from_GOT_p (rtx x)
{
return ((TARGET_64BIT || HAVE_AS_IX86_GOT32X)
&& !TARGET_PECOFF && !TARGET_MACHO
- && !flag_plt && !flag_pic
+ && !flag_pic
&& ix86_cmodel != CM_LARGE
&& GET_CODE (x) == SYMBOL_REF
&& SYMBOL_REF_FUNCTION_P (x)
+ && (!flag_plt
+ || (SYMBOL_REF_DECL (x)
+ && lookup_attribute ("noplt",
+ DECL_ATTRIBUTES (SYMBOL_REF_DECL (x)))))
&& !SYMBOL_REF_LOCAL_P (x));
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 50705fe..5fb19c4 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2019-01-22 H.J. Lu <hongjiu.lu@intel.com>
+
+ PR target/88954
+ * gcc.target/i386/pr88954-1.c: New test.
+ * gcc.target/i386/pr88954-2.c: Likewise.
+
2019-01-22 Richard Earnshaw <rearnsha@arm.com>
PR target/88469
diff --git a/gcc/testsuite/gcc.target/i386/pr88954-1.c b/gcc/testsuite/gcc.target/i386/pr88954-1.c
new file mode 100644
index 0000000..69cb940
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr88954-1.c
@@ -0,0 +1,15 @@
+/* { dg-do compile { target *-*-linux* } } */
+/* { dg-options "-O2 -fno-pic -fplt" } */
+
+extern void bar (void) __attribute__((noplt));
+
+void *
+foo (void)
+{
+ return &bar;
+}
+
+/* { dg-final { scan-assembler "mov\(l|q\)\[ \t\]*bar@GOTPCREL" { target { ! ia32 } } } } */
+/* { dg-final { scan-assembler "movl\[ \t\]*bar@GOT," { target { ia32 && got32x_reloc } } } } */
+/* { dg-final { scan-assembler-not "\(mov|lea\)\(l|q\)\[ \t\]*\(\\\$|\)bar," { target { ! ia32 } } } } */
+/* { dg-final { scan-assembler-not "\(mov|lea\)l\[ \t\]*\(\\\$|\)bar," { target { ia32 && got32x_reloc } } } } */
diff --git a/gcc/testsuite/gcc.target/i386/pr88954-2.c b/gcc/testsuite/gcc.target/i386/pr88954-2.c
new file mode 100644
index 0000000..3bc4ee4
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr88954-2.c
@@ -0,0 +1,16 @@
+/* { dg-do compile { target *-*-linux* } } */
+/* { dg-options "-O2 -fno-pic -fplt" } */
+
+extern void bar (void) __attribute__((noplt));
+extern void *p;
+
+void
+foo (void)
+{
+ p = &bar;
+}
+
+/* { dg-final { scan-assembler "mov\(l|q\)\[ \t\]*bar@GOTPCREL" { target { ! ia32 } } } } */
+/* { dg-final { scan-assembler "movl\[ \t\]*bar@GOT," { target { ia32 && got32x_reloc } } } } */
+/* { dg-final { scan-assembler-not "mov\(l|q\)\[ \t\]*\\\$bar," { target { ! ia32 } } } } */
+/* { dg-final { scan-assembler-not "mov\(l|q\)\[ \t\]*\\\$bar," { target { ia32 && got32x_reloc } } } } */