Add expr_callee_abi

Richard Biener richard.guenther@gmail.com
Mon Oct 14 11:41:00 GMT 2019


On Fri, Oct 11, 2019 at 4:39 PM Richard Sandiford
<richard.sandiford@arm.com> wrote:
>
> This turned out to be useful for the SVE PCS support, and is a natural
> tree-level analogue of insn_callee_abi.
>
> Tested on aarch64-linux-gnu and x86_64-linux-gnu.  OK to install?
>
> Richard
>
>
> 2019-10-11  Richard Sandiford  <richard.sandiford@arm.com>
>
> gcc/
>         * function-abi.h (expr_callee_abi): Declare.
>         * function-abi.cc (expr_callee_abi): New function.
>
> Index: gcc/function-abi.h
> ===================================================================
> --- gcc/function-abi.h  2019-09-30 17:39:33.514597856 +0100
> +++ gcc/function-abi.h  2019-10-11 15:38:54.141605718 +0100
> @@ -315,5 +315,6 @@ call_clobbered_in_region_p (unsigned int
>  extern const predefined_function_abi &fntype_abi (const_tree);
>  extern function_abi fndecl_abi (const_tree);
>  extern function_abi insn_callee_abi (const rtx_insn *);
> +extern function_abi expr_callee_abi (const_tree);
>
>  #endif
> Index: gcc/function-abi.cc
> ===================================================================
> --- gcc/function-abi.cc 2019-09-30 17:39:33.514597856 +0100
> +++ gcc/function-abi.cc 2019-10-11 15:38:54.141605718 +0100
> @@ -229,3 +229,32 @@ insn_callee_abi (const rtx_insn *insn)
>
>    return default_function_abi;
>  }
> +
> +/* Return the ABI of the function called by CALL_EXPR EXP.  Return the
> +   default ABI for erroneous calls.  */
> +
> +function_abi
> +expr_callee_abi (const_tree exp)
> +{
> +  gcc_assert (TREE_CODE (exp) == CALL_EXPR);
> +
> +  if (tree fndecl = get_callee_fndecl (exp))
> +    return fndecl_abi (fndecl);

Please not.  The ABI in effect on the call is that of
the type of CALL_EXPR_FN, what GIMPLE optimizers
propagated as fndecl here doesn't matter.

> +
> +  tree callee = CALL_EXPR_FN (exp);
> +  if (callee == error_mark_node)
> +    return default_function_abi;
> +
> +  tree type = TREE_TYPE (callee);
> +  if (type == error_mark_node)
> +    return default_function_abi;
> +
> +  if (POINTER_TYPE_P (type))
> +    {
> +      type = TREE_TYPE (type);
> +      if (type == error_mark_node)
> +       return default_function_abi;
> +    }

so when it's not a POINTER_TYPE (it always shold be!)
then you're handing arbitrary types to fntype_abi.

> +  return fntype_abi (type);
> +}



More information about the Gcc-patches mailing list