Re: [11/13] Make function.c use function_arg_info internally

2019-08-19 Thread Jeff Law
On 8/19/19 9:22 AM, Richard Sandiford wrote:
> This patch adds a function_arg_info field to assign_parm_data_one,
> so that:
> 
>   - passed_type -> arg.type
>   - promoted_mode -> arg.mode
>   - named_arg -> arg.named
> 
> We can then pass this function_arg_info directly to the converted
> hooks.
> 
> Between the initialisation of the assign_parm_data_one and the
> application of promotion rules (which is a state internal to
> assign_parm_find_data_types), arg.mode is equivalent to passed_mode
> (i.e. to TYPE_MODE).
> 
> 
> 2019-08-19  Richard Sandiford  
> 
> gcc/
>   * function.c (assign_parm_data_one): Replace passed_type,
>   promoted_mode and named_arg with a function_arg_info field.
>   (assign_parm_find_data_types): Remove local variables and
>   assign directly to "data".  Make data->passed_mode shadow
>   data->arg.mode until promotion, then assign the promoted
>   mode to data->arg.mode.
>   (assign_parms_setup_varargs, assign_parm_find_entry_rtl)
>   (assign_parm_find_stack_rtl, assign_parm_adjust_entry_rtl)
>   (assign_parm_remove_parallels, assign_parm_setup_block_p)
>   (assign_parm_setup_block, assign_parm_setup_reg)
>   (assign_parm_setup_stack, assign_parms, gimplify_parameters): Use
>   arg.mode instead of promoted_mode, arg.type instead of passed_type
>   and arg.named instead of named_arg.  Use data->arg for
>   function_arg_info structures that had the field values passed_type,
>   promoted_mode and named_arg.  Base other function_arg_infos on
>   data->arg, changing the necessary properties.
OK
jeff


[11/13] Make function.c use function_arg_info internally

2019-08-19 Thread Richard Sandiford
This patch adds a function_arg_info field to assign_parm_data_one,
so that:

  - passed_type -> arg.type
  - promoted_mode -> arg.mode
  - named_arg -> arg.named

We can then pass this function_arg_info directly to the converted
hooks.

Between the initialisation of the assign_parm_data_one and the
application of promotion rules (which is a state internal to
assign_parm_find_data_types), arg.mode is equivalent to passed_mode
(i.e. to TYPE_MODE).


2019-08-19  Richard Sandiford  

gcc/
* function.c (assign_parm_data_one): Replace passed_type,
promoted_mode and named_arg with a function_arg_info field.
(assign_parm_find_data_types): Remove local variables and
assign directly to "data".  Make data->passed_mode shadow
data->arg.mode until promotion, then assign the promoted
mode to data->arg.mode.
(assign_parms_setup_varargs, assign_parm_find_entry_rtl)
(assign_parm_find_stack_rtl, assign_parm_adjust_entry_rtl)
(assign_parm_remove_parallels, assign_parm_setup_block_p)
(assign_parm_setup_block, assign_parm_setup_reg)
(assign_parm_setup_stack, assign_parms, gimplify_parameters): Use
arg.mode instead of promoted_mode, arg.type instead of passed_type
and arg.named instead of named_arg.  Use data->arg for
function_arg_info structures that had the field values passed_type,
promoted_mode and named_arg.  Base other function_arg_infos on
data->arg, changing the necessary properties.

Index: gcc/function.c
===
--- gcc/function.c  2019-08-19 15:59:09.809778162 +0100
+++ gcc/function.c  2019-08-19 15:59:14.297745685 +0100
@@ -2264,15 +2264,13 @@ struct assign_parm_data_all
 struct assign_parm_data_one
 {
   tree nominal_type;
-  tree passed_type;
+  function_arg_info arg;
   rtx entry_parm;
   rtx stack_parm;
   machine_mode nominal_mode;
   machine_mode passed_mode;
-  machine_mode promoted_mode;
   struct locate_and_pad_arg_data locate;
   int partial;
-  BOOL_BITFIELD named_arg : 1;
   BOOL_BITFIELD passed_pointer : 1;
 };
 
@@ -2407,24 +2405,22 @@ assign_parms_augmented_arg_list (struct
 assign_parm_find_data_types (struct assign_parm_data_all *all, tree parm,
 struct assign_parm_data_one *data)
 {
-  tree nominal_type, passed_type;
-  machine_mode nominal_mode, passed_mode, promoted_mode;
   int unsignedp;
 
-  memset (data, 0, sizeof (*data));
+  *data = assign_parm_data_one ();
 
   /* NAMED_ARG is a misnomer.  We really mean 'non-variadic'. */
   if (!cfun->stdarg)
-data->named_arg = 1;  /* No variadic parms.  */
+data->arg.named = 1;  /* No variadic parms.  */
   else if (DECL_CHAIN (parm))
-data->named_arg = 1;  /* Not the last non-variadic parm. */
+data->arg.named = 1;  /* Not the last non-variadic parm. */
   else if (targetm.calls.strict_argument_naming (all->args_so_far))
-data->named_arg = 1;  /* Only variadic ones are unnamed.  */
+data->arg.named = 1;  /* Only variadic ones are unnamed.  */
   else
-data->named_arg = 0;  /* Treat as variadic.  */
+data->arg.named = 0;  /* Treat as variadic.  */
 
-  nominal_type = TREE_TYPE (parm);
-  passed_type = DECL_ARG_TYPE (parm);
+  data->nominal_type = TREE_TYPE (parm);
+  data->arg.type = DECL_ARG_TYPE (parm);
 
   /* Look out for errors propagating this far.  Also, if the parameter's
  type is void then its value doesn't matter.  */
@@ -2432,49 +2428,40 @@ assign_parm_find_data_types (struct assi
   /* This can happen after weird syntax errors
 or if an enum type is defined among the parms.  */
   || TREE_CODE (parm) != PARM_DECL
-  || passed_type == NULL
-  || VOID_TYPE_P (nominal_type))
+  || data->arg.type == NULL
+  || VOID_TYPE_P (data->nominal_type))
 {
-  nominal_type = passed_type = void_type_node;
-  nominal_mode = passed_mode = promoted_mode = VOIDmode;
-  goto egress;
+  data->nominal_type = data->arg.type = void_type_node;
+  data->nominal_mode = data->passed_mode = data->arg.mode = VOIDmode;
+  return;
 }
 
   /* Find mode of arg as it is passed, and mode of arg as it should be
  during execution of this function.  */
-  passed_mode = TYPE_MODE (passed_type);
-  nominal_mode = TYPE_MODE (nominal_type);
+  data->passed_mode = data->arg.mode = TYPE_MODE (data->arg.type);
+  data->nominal_mode = TYPE_MODE (data->nominal_type);
 
   /* If the parm is to be passed as a transparent union or record, use the
  type of the first field for the tests below.  We have already verified
  that the modes are the same.  */
-  if ((TREE_CODE (passed_type) == UNION_TYPE
-   || TREE_CODE (passed_type) == RECORD_TYPE)
-  && TYPE_TRANSPARENT_AGGR (passed_type))
-passed_type = TREE_TYPE (first_field (passed_type));
+  if ((TREE_CODE (data->arg.type) == UNION_TYPE
+   || TREE_CODE (data->arg.type) == RECORD_TYPE)
+  &&