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:
parent
44a7251e1e
commit
12f154688d
5 changed files with 48 additions and 1 deletions
|
@ -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
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
15
gcc/testsuite/gcc.target/i386/pr88954-1.c
Normal file
15
gcc/testsuite/gcc.target/i386/pr88954-1.c
Normal 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 } } } } */
|
16
gcc/testsuite/gcc.target/i386/pr88954-2.c
Normal file
16
gcc/testsuite/gcc.target/i386/pr88954-2.c
Normal 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 } } } } */
|
Loading…
Add table
Reference in a new issue