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
This commit is contained in:
H.J. Lu 2019-01-22 14:53:41 +00:00 committed by H.J. Lu
parent 44a7251e1e
commit 12f154688d
5 changed files with 48 additions and 1 deletions

View file

@ -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

View file

@ -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));
}

View file

@ -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

View file

@ -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 } } } } */

View file

@ -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 } } } } */