Skip to content

Commit

Permalink
i386: Disallow sibcall for calling ifunc functions with PIC register
Browse files Browse the repository at this point in the history
Disallow siball when calling ifunc functions with PIC register so that
PIC register can be restored.

gcc/

	PR target/105960
	* config/i386/i386.cc (ix86_function_ok_for_sibcall): Return
	false if PIC register is used when calling ifunc functions.

gcc/testsuite/

	PR target/105960
	* gcc.target/i386/pr105960.c: New test.
  • Loading branch information
hjl-tools committed Jun 20, 2022
1 parent 1b23812 commit fe9765c
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 0 deletions.
9 changes: 9 additions & 0 deletions gcc/config/i386/i386.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1015,6 +1015,15 @@ ix86_function_ok_for_sibcall (tree decl, tree exp)
}
}

if (decl && ix86_use_pseudo_pic_reg ())
{
/* When PIC register is used, it must be restored after ifunc
function returns. */
cgraph_node *node = cgraph_node::get (decl);
if (node && node->ifunc_resolver)
return false;
}

/* Otherwise okay. That also includes certain types of indirect calls. */
return true;
}
Expand Down
19 changes: 19 additions & 0 deletions gcc/testsuite/gcc.target/i386/pr105960.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
/* { dg-do compile } */
/* { dg-require-ifunc "" } */
/* { dg-options "-O2 -fpic" } */

__attribute__((target_clones("default","fma")))
static inline double
expfull_ref(double x)
{
return __builtin_pow(x, 0.1234);
}

double
exp_ref(double x)
{
return expfull_ref(x);
}

/* { dg-final { scan-assembler "jmp\[ \t\]*expfull_ref@PLT" { target { ! ia32 } } } } */
/* { dg-final { scan-assembler "call\[ \t\]*expfull_ref@PLT" { target ia32 } } } */

0 comments on commit fe9765c

Please sign in to comment.