From: H.J. Lu Date: Tue, 22 Jan 2019 14:53:41 +0000 (+0000) Subject: i386: Load external function address via GOT slot X-Git-Tag: upstream/12.2.0~26611 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=12f154688d9e942614d49178dee92b766afb64bb;p=platform%2Fupstream%2Fgcc.git 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 --- 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 } } } } */