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 2409e7f59a1..88c2e149f22 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 88557f26c44..7485a86d7d5 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 50705fe6bb0..5fb19c473e1 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 00000000000..69cb940ae4f --- /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 00000000000..3bc4ee47bae --- /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.30.2