2021-03-04 Jakub Jelinek PR debug/99388 * dwarf2out.c (insert_float): Change return type from void to unsigned, handle GET_MODE_SIZE (mode) == 2 and return element size. (mem_loc_descriptor, loc_descriptor, add_const_value_attribute): Adjust callers. --- gcc/dwarf2out.c.jj 2021-03-03 09:53:55.391191719 +0100 +++ gcc/dwarf2out.c 2021-03-04 15:51:23.174396552 +0100 @@ -3825,7 +3825,7 @@ static void add_data_member_location_att static bool add_const_value_attribute (dw_die_ref, rtx); static void insert_int (HOST_WIDE_INT, unsigned, unsigned char *); static void insert_wide_int (const wide_int &, unsigned char *, int); -static void insert_float (const_rtx, unsigned char *); +static unsigned insert_float (const_rtx, unsigned char *); static rtx rtl_for_decl_location (tree); static bool add_location_or_const_value_attribute (dw_die_ref, tree, bool); static bool tree_add_const_value_attribute (dw_die_ref, tree); @@ -16292,11 +16292,12 @@ mem_loc_descriptor (rtx rtl, machine_mod scalar_float_mode float_mode = as_a (mode); unsigned int length = GET_MODE_SIZE (float_mode); unsigned char *array = ggc_vec_alloc (length); + unsigned int elt_size = insert_float (rtl, array); - insert_float (rtl, array); mem_loc_result->dw_loc_oprnd2.val_class = dw_val_class_vec; - mem_loc_result->dw_loc_oprnd2.v.val_vec.length = length / 4; - mem_loc_result->dw_loc_oprnd2.v.val_vec.elt_size = 4; + mem_loc_result->dw_loc_oprnd2.v.val_vec.length + = length / elt_size; + mem_loc_result->dw_loc_oprnd2.v.val_vec.elt_size = elt_size; mem_loc_result->dw_loc_oprnd2.v.val_vec.array = array; } } @@ -16866,11 +16867,11 @@ loc_descriptor (rtx rtl, machine_mode mo { unsigned int length = GET_MODE_SIZE (smode); unsigned char *array = ggc_vec_alloc (length); + unsigned int elt_size = insert_float (rtl, array); - insert_float (rtl, array); loc_result->dw_loc_oprnd2.val_class = dw_val_class_vec; - loc_result->dw_loc_oprnd2.v.val_vec.length = length / 4; - loc_result->dw_loc_oprnd2.v.val_vec.elt_size = 4; + loc_result->dw_loc_oprnd2.v.val_vec.length = length / elt_size; + loc_result->dw_loc_oprnd2.v.val_vec.elt_size = elt_size; loc_result->dw_loc_oprnd2.v.val_vec.array = array; } } @@ -19689,7 +19690,7 @@ insert_wide_int (const wide_int &val, un /* Writes floating point values to dw_vec_const array. */ -static void +static unsigned insert_float (const_rtx rtl, unsigned char *array) { long val[4]; @@ -19699,11 +19700,19 @@ insert_float (const_rtx rtl, unsigned ch real_to_target (val, CONST_DOUBLE_REAL_VALUE (rtl), mode); /* real_to_target puts 32-bit pieces in each long. Pack them. */ + if (GET_MODE_SIZE (mode) < 4) + { + gcc_assert (GET_MODE_SIZE (mode) == 2); + insert_int (val[0], 2, array); + return 2; + } + for (i = 0; i < GET_MODE_SIZE (mode) / 4; i++) { insert_int (val[i], 4, array); array += 4; } + return 4; } /* Attach a DW_AT_const_value attribute for a variable or a parameter which @@ -19752,9 +19761,10 @@ add_const_value_attribute (dw_die_ref di scalar_float_mode mode = as_a (GET_MODE (rtl)); unsigned int length = GET_MODE_SIZE (mode); unsigned char *array = ggc_vec_alloc (length); + unsigned int elt_size = insert_float (rtl, array); - insert_float (rtl, array); - add_AT_vec (die, DW_AT_const_value, length / 4, 4, array); + add_AT_vec (die, DW_AT_const_value, length / elt_size, elt_size, + array); } return true;