Commit 835eb810 by Jakub Jelinek

re PR debug/43762 (VLA artificial length var loclist is missing DW_OP_stack_value)

	PR debug/43762
	* dwarf2out.c (add_bound_info): Always call loc_list_from_tree
	with want_address 2 and in case a single element list might be
	possible, call it again with want_address 0.

From-SVN: r158430
parent db624ecb
2010-04-12 Kaushik Phatak<kaushik.phatak@kpitcummins.com> 2010-04-16 Jakub Jelinek <jakub@redhat.com>
PR debug/43762
* dwarf2out.c (add_bound_info): Always call loc_list_from_tree
with want_address 2 and in case a single element list might be
possible, call it again with want_address 0.
2010-04-12 Kaushik Phatak <kaushik.phatak@kpitcummins.com>
* config/h8300/predicate.md (bit_operand): Allow immediate values that * config/h8300/predicate.md (bit_operand): Allow immediate values that
satisfy 'U' constraint. satisfy 'U' constraint.
......
...@@ -16355,8 +16355,6 @@ lower_bound_default (void) ...@@ -16355,8 +16355,6 @@ lower_bound_default (void)
static void static void
add_bound_info (dw_die_ref subrange_die, enum dwarf_attribute bound_attr, tree bound) add_bound_info (dw_die_ref subrange_die, enum dwarf_attribute bound_attr, tree bound)
{ {
int want_address = 2;
switch (TREE_CODE (bound)) switch (TREE_CODE (bound))
{ {
case ERROR_MARK: case ERROR_MARK:
...@@ -16419,7 +16417,6 @@ add_bound_info (dw_die_ref subrange_die, enum dwarf_attribute bound_attr, tree b ...@@ -16419,7 +16417,6 @@ add_bound_info (dw_die_ref subrange_die, enum dwarf_attribute bound_attr, tree b
add_AT_die_ref (subrange_die, bound_attr, decl_die); add_AT_die_ref (subrange_die, bound_attr, decl_die);
break; break;
} }
want_address = 0;
} }
/* FALLTHRU */ /* FALLTHRU */
...@@ -16431,15 +16428,23 @@ add_bound_info (dw_die_ref subrange_die, enum dwarf_attribute bound_attr, tree b ...@@ -16431,15 +16428,23 @@ add_bound_info (dw_die_ref subrange_die, enum dwarf_attribute bound_attr, tree b
dw_die_ref ctx, decl_die; dw_die_ref ctx, decl_die;
dw_loc_list_ref list; dw_loc_list_ref list;
list = loc_list_from_tree (bound, want_address); list = loc_list_from_tree (bound, 2);
if (list == NULL) if (list == NULL || single_element_loc_list_p (list))
break;
if (single_element_loc_list_p (list))
{ {
add_AT_loc (subrange_die, bound_attr, list->expr); /* If DW_AT_*bound is not a reference nor constant, it is
a DWARF expression rather than location description.
For that loc_list_from_tree (bound, 0) is needed.
If that fails to give a single element list,
fall back to outputting this as a reference anyway. */
dw_loc_list_ref list2 = loc_list_from_tree (bound, 0);
if (list2 && single_element_loc_list_p (list2))
{
add_AT_loc (subrange_die, bound_attr, list2->expr);
break; break;
} }
}
if (list == NULL)
break;
if (current_function_decl == 0) if (current_function_decl == 0)
ctx = comp_unit_die; ctx = comp_unit_die;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment