[pushed,3/4] dwarf2read.c::read_subrange_type: Handle dynamic lower bounds

Message ID 1398715764-1548-4-git-send-email-brobecker@adacore.com
State Committed
Headers

Commit Message

Joel Brobecker April 28, 2014, 8:09 p.m. UTC
  Currently, read_subrange_type handles dynamicity only in the case of
the upper bound, and assumes that the lower bound is always static.
That's rooted in the fact that dynamicity was added to support C99
variable-length arrays, where the lower bound is always zero, and
therefore never dynamic.  But the lower bound can, in fact, be dynamic
in other languages such as Ada.

Consider for instance the following declaration in Ada...

    type Array_Type is array (L .. U) of Natural;

... where L and U are parameters of the function where the declaration
above was made, and whose value are 5 and 10.  Currently, the debugger
is able to print the value of the upper bound correctly, but not the
lower bound:

    (gdb) ptype array_type
    type = array (1 .. 10) of natural

After this patch, the debugger now prints:

    (gdb) ptype array_type
    type = array (5 .. 10) of natural

gdb/ChangeLog:

        * dwarf2read.c (read_subrange_type): Handle dynamic
        DW_AT_lower_bound attributes.

Tested on x86_64-linux, pushed.

---
 gdb/ChangeLog    | 5 +++++
 gdb/dwarf2read.c | 6 +-----
 2 files changed, 6 insertions(+), 5 deletions(-)
  

Patch

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 6c811ea..56f3c17 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,10 @@ 
 2014-04-28  Joel Brobecker  <brobecker@adacore.com>
 
+	* dwarf2read.c (read_subrange_type): Handle dynamic
+	DW_AT_lower_bound attributes.
+
+2014-04-28  Joel Brobecker  <brobecker@adacore.com>
+
 	* ada-lang.c (ada_discrete_type_high_bound): Resolve the type's
 	dynamic bounds before computing its upper bound.
 	(ada_discrete_type_low_bound): Same as above with the lower bound.
diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c
index e72cc4b..bf1e3d0 100644
--- a/gdb/dwarf2read.c
+++ b/gdb/dwarf2read.c
@@ -14572,13 +14572,9 @@  read_subrange_type (struct die_info *die, struct dwarf2_cu *cu)
       break;
     }
 
-  /* FIXME: For variable sized arrays either of these could be
-     a variable rather than a constant value.  We'll allow it,
-     but we don't know how to handle it.  */
   attr = dwarf2_attr (die, DW_AT_lower_bound, cu);
   if (attr)
-    low.data.const_val
-      = dwarf2_get_attr_constant_value (attr, low.data.const_val);
+    attr_to_dynamic_prop (attr, die, cu, &low);
   else if (!low_default_is_valid)
     complaint (&symfile_complaints, _("Missing DW_AT_lower_bound "
 				      "- DIE at 0x%x [in module %s]"),