This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [ARM/FDPIC v3 08/21] [ARM] FDPIC: Ensure local/global binding for function descriptors
- From: "Richard Earnshaw (lists)" <Richard dot Earnshaw at arm dot com>
- To: Christophe Lyon <christophe dot lyon at st dot com>, gcc-patches at gcc dot gnu dot org
- Cc: christophe dot lyon at linaro dot org
- Date: Fri, 12 Oct 2018 12:54:03 +0100
- Subject: Re: [ARM/FDPIC v3 08/21] [ARM] FDPIC: Ensure local/global binding for function descriptors
- References: <20181011133518.17258-1-christophe.lyon@st.com> <20181011133518.17258-9-christophe.lyon@st.com>
On 11/10/18 14:34, Christophe Lyon wrote:
> Use local binding rules to decide whether we can use GOTOFFFUNCDESC to
> compute the function address.
>
> 2018-XX-XX Christophe Lyon <christophe.lyon@st.com>
> Mickaël Guêné <mickael.guene@st.com>
>
> gcc/
> * config/arm/arm.c (arm_local_funcdesc_p): New function.
> (legitimize_pic_address): Ensure binding rules on function
Enforce?
> pointers in FDPIC mode.
> (arm_assemble_integer): Likewise.
>
> Change-Id: I3fa0b63bc0f672903f405aa72cc46052de1c0feb
>
> diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c
> index a6dce36..d0144fd 100644
> --- a/gcc/config/arm/arm.c
> +++ b/gcc/config/arm/arm.c
> @@ -3768,6 +3768,42 @@ arm_options_perform_arch_sanity_checks (void)
> }
> }
>
> +/* Test whether a local function descriptor is canonical, i.e.,
> + whether we can use GOTOFFFUNCDESC to compute the address of the
> + function. */
> +static bool
> +arm_local_funcdesc_p (rtx fnx)
Given that this function doesn't return what it's name implies when not
FDPIC, I think the name should reflect that. Please rename to
arm_fdpic_local...
> +{
> + tree fn;
> + enum symbol_visibility vis;
> + bool ret;
> +
> + if (!TARGET_FDPIC)
> + return TRUE;
> +
> + if (! SYMBOL_REF_LOCAL_P (fnx))
> + return FALSE;
> +
> + fn = SYMBOL_REF_DECL (fnx);
> +
> + if (! fn)
> + return FALSE;
> +
> + vis = DECL_VISIBILITY (fn);
> +
> + if (vis == VISIBILITY_PROTECTED)
> + /* Private function descriptors for protected functions are not
> + canonical. Temporarily change the visibility to global so that
> + we can ensure unicity of funcdesc pointers. */
s/unicity/uniqueness/
> + DECL_VISIBILITY (fn) = VISIBILITY_DEFAULT;
> +
> + ret = default_binds_local_p_1 (fn, flag_pic);
> +
> + DECL_VISIBILITY (fn) = vis;
> +
> + return ret;
> +}
> +
> static void
> arm_add_gc_roots (void)
> {
> @@ -7485,7 +7521,9 @@ legitimize_pic_address (rtx orig, machine_mode mode, rtx reg)
> || (GET_CODE (orig) == SYMBOL_REF
> && SYMBOL_REF_LOCAL_P (orig)
> && (SYMBOL_REF_DECL (orig)
> - ? !DECL_WEAK (SYMBOL_REF_DECL (orig)) : 1)))
> + ? !DECL_WEAK (SYMBOL_REF_DECL (orig)) : 1)
> + && (!SYMBOL_REF_FUNCTION_P(orig)
space before parenthesis
> + || arm_local_funcdesc_p (orig))))
> && NEED_GOT_RELOC
> && arm_pic_data_is_text_relative)
> insn = arm_pic_static_addr (orig, reg);
> @@ -23053,7 +23091,9 @@ arm_assemble_integer (rtx x, unsigned int size, int aligned_p)
> || (GET_CODE (x) == SYMBOL_REF
> && (!SYMBOL_REF_LOCAL_P (x)
> || (SYMBOL_REF_DECL (x)
> - ? DECL_WEAK (SYMBOL_REF_DECL (x)) : 0))))
> + ? DECL_WEAK (SYMBOL_REF_DECL (x)) : 0)
> + || (SYMBOL_REF_FUNCTION_P (x)
> + && !arm_local_funcdesc_p (x)))))
> {
> if (TARGET_FDPIC && SYMBOL_REF_FUNCTION_P (x))
> fputs ("(GOTFUNCDESC)", asm_out_file);
>
OK with those changes.
R.
[gonna have to stop now and I'm OoO next week]