From 12f154688d9e942614d49178dee92b766afb64bb Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Tue, 22 Jan 2019 14:53:41 +0000 Subject: [PATCH] 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 --- gcc/ChangeLog | 6 ++++++ gcc/config/i386/i386.c | 6 +++++- gcc/testsuite/ChangeLog | 6 ++++++ gcc/testsuite/gcc.target/i386/pr88954-1.c | 15 +++++++++++++++ gcc/testsuite/gcc.target/i386/pr88954-2.c | 16 ++++++++++++++++ 5 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.target/i386/pr88954-1.c create mode 100644 gcc/testsuite/gcc.target/i386/pr88954-2.c 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 + + PR target/88954 + * config/i386/i386.c (ix86_force_load_from_GOT_p): Also check + noplt attribute. + 2019-01-22 Richard Earnshaw 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 + + PR target/88954 + * gcc.target/i386/pr88954-1.c: New test. + * gcc.target/i386/pr88954-2.c: Likewise. + 2019-01-22 Richard Earnshaw 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 } } } } */ -- 2.7.4