diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2021-06-19 08:16:45 -0700 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2021-12-03 05:12:30 -0800 |
commit | f7854b908977adce4ff669c4e0332ef868568b7c (patch) | |
tree | d2f77c87c4dd0166bbb3f636f2d7d717a26eed12 /gcc/config | |
parent | 97ffef3553267f52ca83dbebdcc8b5e3739febee (diff) | |
download | gcc-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')
-rw-r--r-- | gcc/config/i386/i386-expand.c | 2 | ||||
-rw-r--r-- | gcc/config/i386/i386-protos.h | 1 | ||||
-rw-r--r-- | gcc/config/i386/i386.c | 25 |
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 |