93 lines
3.7 KiB
Diff
93 lines
3.7 KiB
Diff
2021-03-04 Jakub Jelinek <jakub@redhat.com>
|
|
|
|
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 <scalar_float_mode> (mode);
|
|
unsigned int length = GET_MODE_SIZE (float_mode);
|
|
unsigned char *array = ggc_vec_alloc<unsigned char> (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<unsigned char> (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 <scalar_float_mode> (GET_MODE (rtl));
|
|
unsigned int length = GET_MODE_SIZE (mode);
|
|
unsigned char *array = ggc_vec_alloc<unsigned char> (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;
|
|
|