This patch adds a POD version of fixed_size_mode. The only current use is for storing the __builtin_apply and __builtin_result register modes, which were made fixed_size_modes by the previous patch.
2017-10-23 Richard Sandiford <richard.sandif...@linaro.org> Alan Hayward <alan.hayw...@arm.com> David Sherwood <david.sherw...@arm.com> gcc/ * coretypes.h (fixed_size_mode): Declare. (fixed_size_mode_pod): New typedef. * builtins.h (target_builtins::x_apply_args_mode) (target_builtins::x_apply_result_mode): Change type to fixed_size_mode_pod. * builtins.c (apply_args_size, apply_result_size, result_vector) (expand_builtin_apply_args_1, expand_builtin_apply) (expand_builtin_return): Update accordingly. Index: gcc/coretypes.h =================================================================== --- gcc/coretypes.h 2017-09-11 17:10:58.656085547 +0100 +++ gcc/coretypes.h 2017-10-23 11:42:57.592545063 +0100 @@ -59,6 +59,7 @@ typedef const struct rtx_def *const_rtx; class scalar_int_mode; class scalar_float_mode; class complex_mode; +class fixed_size_mode; template<typename> class opt_mode; typedef opt_mode<scalar_mode> opt_scalar_mode; typedef opt_mode<scalar_int_mode> opt_scalar_int_mode; @@ -66,6 +67,7 @@ typedef opt_mode<scalar_float_mode> opt_ template<typename> class pod_mode; typedef pod_mode<scalar_mode> scalar_mode_pod; typedef pod_mode<scalar_int_mode> scalar_int_mode_pod; +typedef pod_mode<fixed_size_mode> fixed_size_mode_pod; /* Subclasses of rtx_def, using indentation to show the class hierarchy, along with the relevant invariant. Index: gcc/builtins.h =================================================================== --- gcc/builtins.h 2017-08-30 12:18:46.602740973 +0100 +++ gcc/builtins.h 2017-10-23 11:42:57.592545063 +0100 @@ -29,14 +29,14 @@ struct target_builtins { the register is not used for calling a function. If the machine has register windows, this gives only the outbound registers. INCOMING_REGNO gives the corresponding inbound register. */ - machine_mode x_apply_args_mode[FIRST_PSEUDO_REGISTER]; + fixed_size_mode_pod x_apply_args_mode[FIRST_PSEUDO_REGISTER]; /* For each register that may be used for returning values, this gives a mode used to copy the register's value. VOIDmode indicates the register is not used for returning values. If the machine has register windows, this gives only the outbound registers. INCOMING_REGNO gives the corresponding inbound register. */ - machine_mode x_apply_result_mode[FIRST_PSEUDO_REGISTER]; + fixed_size_mode_pod x_apply_result_mode[FIRST_PSEUDO_REGISTER]; }; extern struct target_builtins default_target_builtins; Index: gcc/builtins.c =================================================================== --- gcc/builtins.c 2017-10-23 11:41:23.140260335 +0100 +++ gcc/builtins.c 2017-10-23 11:42:57.592545063 +0100 @@ -1358,7 +1358,6 @@ apply_args_size (void) static int size = -1; int align; unsigned int regno; - machine_mode mode; /* The values computed by this function never change. */ if (size < 0) @@ -1374,7 +1373,7 @@ apply_args_size (void) for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++) if (FUNCTION_ARG_REGNO_P (regno)) { - mode = targetm.calls.get_raw_arg_mode (regno); + fixed_size_mode mode = targetm.calls.get_raw_arg_mode (regno); gcc_assert (mode != VOIDmode); @@ -1386,7 +1385,7 @@ apply_args_size (void) } else { - apply_args_mode[regno] = VOIDmode; + apply_args_mode[regno] = as_a <fixed_size_mode> (VOIDmode); } } return size; @@ -1400,7 +1399,6 @@ apply_result_size (void) { static int size = -1; int align, regno; - machine_mode mode; /* The values computed by this function never change. */ if (size < 0) @@ -1410,7 +1408,7 @@ apply_result_size (void) for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++) if (targetm.calls.function_value_regno_p (regno)) { - mode = targetm.calls.get_raw_result_mode (regno); + fixed_size_mode mode = targetm.calls.get_raw_result_mode (regno); gcc_assert (mode != VOIDmode); @@ -1421,7 +1419,7 @@ apply_result_size (void) apply_result_mode[regno] = mode; } else - apply_result_mode[regno] = VOIDmode; + apply_result_mode[regno] = as_a <fixed_size_mode> (VOIDmode); /* Allow targets that use untyped_call and untyped_return to override the size so that machine-specific information can be stored here. */ @@ -1440,7 +1438,7 @@ apply_result_size (void) result_vector (int savep, rtx result) { int regno, size, align, nelts; - machine_mode mode; + fixed_size_mode mode; rtx reg, mem; rtx *savevec = XALLOCAVEC (rtx, FIRST_PSEUDO_REGISTER); @@ -1469,7 +1467,7 @@ expand_builtin_apply_args_1 (void) { rtx registers, tem; int size, align, regno; - machine_mode mode; + fixed_size_mode mode; rtx struct_incoming_value = targetm.calls.struct_value_rtx (cfun ? TREE_TYPE (cfun->decl) : 0, 1); /* Create a block where the arg-pointer, structure value address, @@ -1573,7 +1571,7 @@ expand_builtin_apply_args (void) expand_builtin_apply (rtx function, rtx arguments, rtx argsize) { int size, align, regno; - machine_mode mode; + fixed_size_mode mode; rtx incoming_args, result, reg, dest, src; rtx_call_insn *call_insn; rtx old_stack_level = 0; @@ -1734,7 +1732,7 @@ expand_builtin_apply (rtx function, rtx expand_builtin_return (rtx result) { int size, align, regno; - machine_mode mode; + fixed_size_mode mode; rtx reg; rtx_insn *call_fusage = 0;