On Wed, Dec 4, 2024 at 9:48 PM H.J. Lu <hjl.to...@gmail.com> wrote:
>
> Remove the targetm.calls.promote_prototypes call from C, C++ and Ada
> frontends.

I'm conditionally approving this unless FE maintainers complain before holidays
(the effect of the hook is re-instantiated during RTL expansion in 1/7).

I've added the FE maintainers to CC

Richard.

> gcc/
>
>         PR c/48274
>         PR middle-end/14907
>         PR middle-end/112877
>         * gimple.cc (gimple_builtin_call_types_compatible_p): Remove the
>         targetm.calls.promote_prototypes call.
>         * tree.cc (tree_builtin_call_types_compatible_p): Likewise.
>
> gcc/ada/
>
>         PR middle-end/14907
>         PR middle-end/112877
>         * gcc-interface/utils.cc (create_param_decl): Remove the
>         targetm.calls.promote_prototypes call.
>
> gcc/c/
>
>         PR c/48274
>         PR middle-end/14907
>         PR middle-end/112877
>         * c-decl.cc (start_decl): Remove the
>         targetm.calls.promote_prototypes call.
>         (store_parm_decls_oldstyle): Likewise.
>         (finish_function): Likewise.
>         * c-typeck.cc (convert_argument): Likewise.
>         (c_safe_arg_type_equiv_p): Likewise.
>
> gcc/cp/
>
>         PR middle-end/14907
>         PR middle-end/112877
>         * call.cc (type_passed_as): Remove the
>         targetm.calls.promote_prototypes call.
>         (convert_for_arg_passing): Likewise.
>         * typeck.cc (cxx_safe_arg_type_equiv_p): Likewise.
>
> Signed-off-by: H.J. Lu <hjl.to...@gmail.com>
> ---
>  gcc/ada/gcc-interface/utils.cc | 24 --------------------
>  gcc/c/c-decl.cc                | 40 ----------------------------------
>  gcc/c/c-typeck.cc              | 19 ++++------------
>  gcc/cp/call.cc                 | 10 ---------
>  gcc/cp/typeck.cc               | 13 ++++-------
>  gcc/gimple.cc                  | 10 +--------
>  gcc/tree.cc                    | 14 ------------
>  7 files changed, 9 insertions(+), 121 deletions(-)
>
> diff --git a/gcc/ada/gcc-interface/utils.cc b/gcc/ada/gcc-interface/utils.cc
> index 8e8cf55ae12..cbbac5160d2 100644
> --- a/gcc/ada/gcc-interface/utils.cc
> +++ b/gcc/ada/gcc-interface/utils.cc
> @@ -3282,30 +3282,6 @@ tree
>  create_param_decl (tree name, tree type)
>  {
>    tree param_decl = build_decl (input_location, PARM_DECL, name, type);
> -
> -  /* Honor TARGET_PROMOTE_PROTOTYPES like the C compiler, as not doing so
> -     can lead to various ABI violations.  */
> -  if (targetm.calls.promote_prototypes (NULL_TREE)
> -      && INTEGRAL_TYPE_P (type)
> -      && TYPE_PRECISION (type) < TYPE_PRECISION (integer_type_node))
> -    {
> -      /* We have to be careful about biased types here.  Make a subtype
> -        of integer_type_node with the proper biasing.  */
> -      if (TREE_CODE (type) == INTEGER_TYPE
> -         && TYPE_BIASED_REPRESENTATION_P (type))
> -       {
> -         tree subtype
> -           = make_unsigned_type (TYPE_PRECISION (integer_type_node));
> -         TREE_TYPE (subtype) = integer_type_node;
> -         TYPE_BIASED_REPRESENTATION_P (subtype) = 1;
> -         SET_TYPE_RM_MIN_VALUE (subtype, TYPE_MIN_VALUE (type));
> -         SET_TYPE_RM_MAX_VALUE (subtype, TYPE_MAX_VALUE (type));
> -         type = subtype;
> -       }
> -      else
> -       type = integer_type_node;
> -    }
> -
>    DECL_ARG_TYPE (param_decl) = type;
>    return param_decl;
>  }
> diff --git a/gcc/c/c-decl.cc b/gcc/c/c-decl.cc
> index 1c11c216bd6..9642257c961 100644
> --- a/gcc/c/c-decl.cc
> +++ b/gcc/c/c-decl.cc
> @@ -5719,26 +5719,6 @@ start_decl (struct c_declarator *declarator, struct 
> c_declspecs *declspecs,
>         DECL_EXTERNAL (decl) = !DECL_EXTERNAL (decl);
>      }
>
> -  if (TREE_CODE (decl) == FUNCTION_DECL
> -      && targetm.calls.promote_prototypes (TREE_TYPE (decl)))
> -    {
> -      struct c_declarator *ce = declarator;
> -
> -      if (ce->kind == cdk_pointer)
> -       ce = declarator->declarator;
> -      if (ce->kind == cdk_function)
> -       {
> -         tree args = ce->u.arg_info->parms;
> -         for (; args; args = DECL_CHAIN (args))
> -           {
> -             tree type = TREE_TYPE (args);
> -             if (type && INTEGRAL_TYPE_P (type)
> -                 && TYPE_PRECISION (type) < TYPE_PRECISION 
> (integer_type_node))
> -               DECL_ARG_TYPE (args) = c_type_promotes_to (type);
> -           }
> -       }
> -    }
> -
>    if (TREE_CODE (decl) == FUNCTION_DECL
>        && DECL_DECLARED_INLINE_P (decl)
>        && DECL_UNINLINABLE (decl)
> @@ -11172,13 +11152,6 @@ store_parm_decls_oldstyle (tree fndecl, const struct 
> c_arg_info *arg_info)
>                      useful for argument types like uid_t.  */
>                   DECL_ARG_TYPE (parm) = TREE_TYPE (parm);
>
> -                 if (targetm.calls.promote_prototypes (TREE_TYPE 
> (current_function_decl))
> -                     && INTEGRAL_TYPE_P (TREE_TYPE (parm))
> -                     && (TYPE_PRECISION (TREE_TYPE (parm))
> -                         < TYPE_PRECISION (integer_type_node)))
> -                   DECL_ARG_TYPE (parm)
> -                     = c_type_promotes_to (TREE_TYPE (parm));
> -
>                   /* ??? Is it possible to get here with a
>                      built-in prototype or will it always have
>                      been diagnosed as conflicting with an
> @@ -11406,19 +11379,6 @@ finish_function (location_t end_loc)
>    if (c_dialect_objc ())
>      objc_finish_function ();
>
> -  if (TREE_CODE (fndecl) == FUNCTION_DECL
> -      && targetm.calls.promote_prototypes (TREE_TYPE (fndecl)))
> -    {
> -      tree args = DECL_ARGUMENTS (fndecl);
> -      for (; args; args = DECL_CHAIN (args))
> -       {
> -         tree type = TREE_TYPE (args);
> -         if (INTEGRAL_TYPE_P (type)
> -             && TYPE_PRECISION (type) < TYPE_PRECISION (integer_type_node))
> -           DECL_ARG_TYPE (args) = c_type_promotes_to (type);
> -       }
> -    }
> -
>    if (DECL_INITIAL (fndecl) && DECL_INITIAL (fndecl) != error_mark_node)
>      BLOCK_SUPERCONTEXT (DECL_INITIAL (fndecl)) = fndecl;
>
> diff --git a/gcc/c/c-typeck.cc b/gcc/c/c-typeck.cc
> index e60f89a21d9..d5f947132ad 100644
> --- a/gcc/c/c-typeck.cc
> +++ b/gcc/c/c-typeck.cc
> @@ -4124,12 +4124,6 @@ convert_argument (location_t ploc, tree function, tree 
> fundecl,
>                                          val, origtype, ic_argpass,
>                                          npc, fundecl, function,
>                                          parmnum + 1, warnopt);
> -
> -  if (targetm.calls.promote_prototypes (fundecl ? TREE_TYPE (fundecl) : 0)
> -      && INTEGRAL_TYPE_P (type)
> -      && (TYPE_PRECISION (type) < TYPE_PRECISION (integer_type_node)))
> -    parmval = default_conversion (parmval);
> -
>    return parmval;
>  }
>
> @@ -6665,17 +6659,12 @@ c_safe_arg_type_equiv_p (tree t1, tree t2)
>        && TREE_CODE (t2) == POINTER_TYPE)
>      return true;
>
> -  /* The signedness of the parameter matters only when an integral
> -     type smaller than int is promoted to int, otherwise only the
> -     precision of the parameter matters.
> -     This check should make sure that the callee does not see
> -     undefined values in argument registers.  */
> +  /* Only the precision of the parameter matters.  This check should
> +     make sure that the callee does not see undefined values in argument
> +     registers.  */
>    if (INTEGRAL_TYPE_P (t1)
>        && INTEGRAL_TYPE_P (t2)
> -      && TYPE_PRECISION (t1) == TYPE_PRECISION (t2)
> -      && (TYPE_UNSIGNED (t1) == TYPE_UNSIGNED (t2)
> -         || !targetm.calls.promote_prototypes (NULL_TREE)
> -         || TYPE_PRECISION (t1) >= TYPE_PRECISION (integer_type_node)))
> +      && TYPE_PRECISION (t1) == TYPE_PRECISION (t2))
>      return true;
>
>    return comptypes (t1, t2);
> diff --git a/gcc/cp/call.cc b/gcc/cp/call.cc
> index 9fbc1602b0d..02946b80434 100644
> --- a/gcc/cp/call.cc
> +++ b/gcc/cp/call.cc
> @@ -9437,11 +9437,6 @@ type_passed_as (tree type)
>    /* Pass classes with copy ctors by invisible reference.  */
>    if (TREE_ADDRESSABLE (type))
>      type = build_reference_type (type);
> -  else if (targetm.calls.promote_prototypes (NULL_TREE)
> -          && INTEGRAL_TYPE_P (type)
> -          && COMPLETE_TYPE_P (type)
> -          && tree_int_cst_lt (TYPE_SIZE (type), TYPE_SIZE 
> (integer_type_node)))
> -    type = integer_type_node;
>
>    return type;
>  }
> @@ -9477,11 +9472,6 @@ convert_for_arg_passing (tree type, tree val, 
> tsubst_flags_t complain)
>    /* Pass classes with copy ctors by invisible reference.  */
>    else if (TREE_ADDRESSABLE (type))
>      val = build1 (ADDR_EXPR, build_reference_type (type), val);
> -  else if (targetm.calls.promote_prototypes (NULL_TREE)
> -          && INTEGRAL_TYPE_P (type)
> -          && COMPLETE_TYPE_P (type)
> -          && tree_int_cst_lt (TYPE_SIZE (type), TYPE_SIZE 
> (integer_type_node)))
> -    val = cp_perform_integral_promotions (val, complain);
>    if (complain & tf_warning)
>      {
>        if (warn_suggest_attribute_format)
> diff --git a/gcc/cp/typeck.cc b/gcc/cp/typeck.cc
> index adc71132721..dc3c817374d 100644
> --- a/gcc/cp/typeck.cc
> +++ b/gcc/cp/typeck.cc
> @@ -1372,17 +1372,12 @@ cxx_safe_arg_type_equiv_p (tree t1, tree t2)
>        && TYPE_PTR_P (t2))
>      return true;
>
> -  /* The signedness of the parameter matters only when an integral
> -     type smaller than int is promoted to int, otherwise only the
> -     precision of the parameter matters.
> -     This check should make sure that the callee does not see
> -     undefined values in argument registers.  */
> +  /* Only the precision of the parameter matters.  This check should
> +     make sure that the callee does not see undefined values in argument
> +     registers.  */
>    if (INTEGRAL_TYPE_P (t1)
>        && INTEGRAL_TYPE_P (t2)
> -      && TYPE_PRECISION (t1) == TYPE_PRECISION (t2)
> -      && (TYPE_UNSIGNED (t1) == TYPE_UNSIGNED (t2)
> -         || !targetm.calls.promote_prototypes (NULL_TREE)
> -         || TYPE_PRECISION (t1) >= TYPE_PRECISION (integer_type_node)))
> +      && TYPE_PRECISION (t1) == TYPE_PRECISION (t2))
>      return true;
>
>    return same_type_p (t1, t2);
> diff --git a/gcc/gimple.cc b/gcc/gimple.cc
> index 477315cb1b8..2ddbe1dfc34 100644
> --- a/gcc/gimple.cc
> +++ b/gcc/gimple.cc
> @@ -2896,15 +2896,7 @@ gimple_builtin_call_types_compatible_p (const gimple 
> *stmt, tree fndecl)
>         return true;
>        tree arg = gimple_call_arg (stmt, i);
>        tree type = TREE_VALUE (targs);
> -      if (!useless_type_conversion_p (type, TREE_TYPE (arg))
> -         /* char/short integral arguments are promoted to int
> -            by several frontends if targetm.calls.promote_prototypes
> -            is true.  Allow such promotion too.  */
> -         && !(INTEGRAL_TYPE_P (type)
> -              && TYPE_PRECISION (type) < TYPE_PRECISION (integer_type_node)
> -              && targetm.calls.promote_prototypes (TREE_TYPE (fndecl))
> -              && useless_type_conversion_p (integer_type_node,
> -                                            TREE_TYPE (arg))))
> +      if (!useless_type_conversion_p (type, TREE_TYPE (arg)))
>         return false;
>        targs = TREE_CHAIN (targs);
>      }
> diff --git a/gcc/tree.cc b/gcc/tree.cc
> index 83a03374a32..c510bcc65dd 100644
> --- a/gcc/tree.cc
> +++ b/gcc/tree.cc
> @@ -8694,20 +8694,6 @@ tree_builtin_call_types_compatible_p (const_tree call, 
> tree fndecl)
>               && POINTER_TYPE_P (TREE_TYPE (arg))
>               && tree_nop_conversion_p (type, TREE_TYPE (arg)))
>             continue;
> -         /* char/short integral arguments are promoted to int
> -            by several frontends if targetm.calls.promote_prototypes
> -            is true.  Allow such promotion too.  */
> -         if (INTEGRAL_TYPE_P (type)
> -             && TYPE_PRECISION (type) < TYPE_PRECISION (integer_type_node)
> -             && INTEGRAL_TYPE_P (TREE_TYPE (arg))
> -             && !TYPE_UNSIGNED (TREE_TYPE (arg))
> -             && targetm.calls.promote_prototypes (TREE_TYPE (fndecl))
> -             && (gimple_form
> -                 ? useless_type_conversion_p (integer_type_node,
> -                                              TREE_TYPE (arg))
> -                 : tree_nop_conversion_p (integer_type_node,
> -                                          TREE_TYPE (arg))))
> -           continue;
>           return false;
>         }
>      }
> --
> 2.47.1
>

Reply via email to