diff options
author | H.J. Lu <hongjiu.lu@intel.com> | 2019-01-22 14:53:41 +0000 |
---|---|---|
committer | H.J. Lu <hjl@gcc.gnu.org> | 2019-01-22 06:53:41 -0800 |
commit | 12f154688d9e942614d49178dee92b766afb64bb (patch) | |
tree | edc5ed79863d994cd35b293ee30303d2db1928e4 | |
parent | 44a7251e1e97caf3b2315f20d48519ff8fced152 (diff) | |
download | gcc-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/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/config/i386/i386.c | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/i386/pr88954-1.c | 15 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/i386/pr88954-2.c | 16 |
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 } } } } */ |