aboutsummaryrefslogtreecommitdiff
path: root/gcc/config/i386
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2021-06-19 08:16:45 -0700
committerH.J. Lu <hjl.tools@gmail.com>2021-12-03 05:12:30 -0800
commitf7854b908977adce4ff669c4e0332ef868568b7c (patch)
treed2f77c87c4dd0166bbb3f636f2d7d717a26eed12 /gcc/config/i386
parent97ffef3553267f52ca83dbebdcc8b5e3739febee (diff)
downloadgcc-f7854b908977adce4ff669c4e0332ef868568b7c.zip
gcc-f7854b908977adce4ff669c4e0332ef868568b7c.tar.gz
gcc-f7854b908977adce4ff669c4e0332ef868568b7c.tar.bz2
Add TARGET_IFUNC_REF_LOCAL_OK
1. On some targets, like PowerPC, reference to ifunc function resolver must be non-local so that compiler will properly emit PLT call. Add TARGET_IFUNC_REF_LOCAL_OK to allow binding indirect function resolver locally for targets which don't require special PLT call sequence. 2. Add ix86_call_use_plt_p to call local ifunc function resolvers via PLT. gcc/ PR target/51469 PR target/83782 * target.def (ifunc_ref_local_ok): Add a target hook. * varasm.c (default_binds_local_p_3): Force indirect function resolver non-local only if targetm.ifunc_ref_local_ok returns false. * config/i386/i386-expand.c (ix86_expand_call): Call ix86_call_use_plt_p to check if PLT should be used. * config/i386/i386-protos.h (ix86_call_use_plt_p): New. * config/i386/i386.c (output_pic_addr_const): Call ix86_call_use_plt_p to check if "@PLT" is needed. (ix86_call_use_plt_p): New. (TARGET_IFUNC_REF_LOCAL_OK): New. * doc/tm.texi.in: Add TARGET_IFUNC_REF_LOCAL_OK. * doc/tm.texi: Regenerated. gcc/testsuite/ PR target/51469 PR target/83782 * gcc.target/i386/pr83782-1.c: New test. * gcc.target/i386/pr83782-2.c: Likewise.
Diffstat (limited to 'gcc/config/i386')
-rw-r--r--gcc/config/i386/i386-expand.c2
-rw-r--r--gcc/config/i386/i386-protos.h1
-rw-r--r--gcc/config/i386/i386.c25
3 files changed, 26 insertions, 2 deletions
diff --git a/gcc/config/i386/i386-expand.c b/gcc/config/i386/i386-expand.c
index cba2880..068c5c2 100644
--- a/gcc/config/i386/i386-expand.c
+++ b/gcc/config/i386/i386-expand.c
@@ -9133,7 +9133,7 @@ ix86_expand_call (rtx retval, rtx fnaddr, rtx callarg1,
it an indirect call. */
if (flag_pic
&& GET_CODE (addr) == SYMBOL_REF
- && !SYMBOL_REF_LOCAL_P (addr))
+ && ix86_call_use_plt_p (addr))
{
if (flag_plt
&& (SYMBOL_REF_DECL (addr) == NULL_TREE
diff --git a/gcc/config/i386/i386-protos.h b/gcc/config/i386/i386-protos.h
index 1cd2197..7ffb408 100644
--- a/gcc/config/i386/i386-protos.h
+++ b/gcc/config/i386/i386-protos.h
@@ -152,6 +152,7 @@ extern void ix86_expand_sse_movcc (rtx, rtx, rtx, rtx);
extern void ix86_expand_sse_unpack (rtx, rtx, bool, bool);
extern bool ix86_expand_int_addcc (rtx[]);
extern rtx_insn *ix86_expand_call (rtx, rtx, rtx, rtx, rtx, bool);
+extern bool ix86_call_use_plt_p (rtx);
extern void ix86_split_call_vzeroupper (rtx, rtx);
extern void x86_initialize_trampoline (rtx, rtx, rtx);
extern rtx ix86_zero_extend_to_Pmode (rtx);
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index 80fee62..ccb57af 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -12150,7 +12150,7 @@ output_pic_addr_const (FILE *file, rtx x, int code)
assemble_name (file, name);
}
if (!TARGET_MACHO && !(TARGET_64BIT && TARGET_PECOFF)
- && code == 'P' && ! SYMBOL_REF_LOCAL_P (x))
+ && code == 'P' && ix86_call_use_plt_p (x))
fputs ("@PLT", file);
break;
@@ -15980,6 +15980,26 @@ ix86_zero_extend_to_Pmode (rtx exp)
return force_reg (Pmode, convert_to_mode (Pmode, exp, 1));
}
+/* Return true if the function is called via PLT. */
+
+bool
+ix86_call_use_plt_p (rtx call_op)
+{
+ if (SYMBOL_REF_LOCAL_P (call_op))
+ {
+ if (SYMBOL_REF_DECL (call_op))
+ {
+ /* NB: All ifunc functions must be called via PLT. */
+ cgraph_node *node
+ = cgraph_node::get (SYMBOL_REF_DECL (call_op));
+ if (node && node->ifunc_resolver)
+ return true;
+ }
+ return false;
+ }
+ return true;
+}
+
/* Return true if the function being called was marked with attribute
"noplt" or using -fno-plt and we are compiling for non-PIC. We need
to handle the non-PIC case in the backend because there is no easy
@@ -24582,6 +24602,9 @@ ix86_libgcc_floating_mode_supported_p
#define TARGET_GET_MULTILIB_ABI_NAME \
ix86_get_multilib_abi_name
+#undef TARGET_IFUNC_REF_LOCAL_OK
+#define TARGET_IFUNC_REF_LOCAL_OK hook_bool_void_true
+
static bool ix86_libc_has_fast_function (int fcode ATTRIBUTE_UNUSED)
{
#ifdef OPTION_GLIBC