vla: support for DW_AT_count
authorSanimir Agovic <sanimir.agovic@intel.com>
Tue, 19 Nov 2013 12:54:24 +0000 (12:54 +0000)
committerJoel Brobecker <brobecker@adacore.com>
Mon, 14 Apr 2014 16:17:54 +0000 (09:17 -0700)
This patch adds support for DW_AT_count as requested in the code review:

  https://sourceware.org/ml/gdb-patches/2013-11/msg00200.html

gdb/ChangeLog:

* dwarf2read.c (read_subrange_type): Convert DW_AT_count to a dynamic
property and store it as the high bound and flag the range accordingly.
* gdbtypes.c (resolve_dynamic_bounds): If range is flagged as
RANGE_UPPER_BOUND_IS_COUNT assign low + high - 1 as the new high bound.
* gdbtypes.h (enum range_flags): New enum.
(struct range_bounds): Add flags member.

gdb/ChangeLog
gdb/dwarf2read.c
gdb/gdbtypes.c
gdb/gdbtypes.h

index 0630f1c749a3fa4bf6406e85c1e229567b83b686..717c197a69550fa1c3e4fdc4061877119ff879e2 100644 (file)
@@ -1,3 +1,12 @@
+2014-04-14  Sanimir Agovic  <sanimir.agovic@intel.com>
+
+       * dwarf2read.c (read_subrange_type): Convert DW_AT_count to a dynamic
+       property and store it as the high bound and flag the range accordingly.
+       * gdbtypes.c (resolve_dynamic_bounds): If range is flagged as
+       RANGE_UPPER_BOUND_IS_COUNT assign low + high - 1 as the new high bound.
+       * gdbtypes.h (enum range_flags): New enum.
+       (struct range_bounds): Add flags member.
+
 2014-04-14  Sanimir Agovic  <sanimir.agovic@intel.com>
 
        * c-typeprint.c (c_type_print_varspec_suffix): Added
index ff66cce73335712b7f41e766fc848406ab603b0f..7c6449178cdc3bbb3d8d566f5453a009c8a31dd6 100644 (file)
@@ -14493,6 +14493,7 @@ read_subrange_type (struct die_info *die, struct dwarf2_cu *cu)
   struct attribute *attr;
   struct dynamic_prop low, high;
   int low_default_is_valid;
+  int high_bound_is_count = 0;
   const char *name;
   LONGEST negative_mask;
 
@@ -14559,15 +14560,13 @@ read_subrange_type (struct die_info *die, struct dwarf2_cu *cu)
   if (!attr_to_dynamic_prop (attr, die, cu, &high))
     {
       attr = dwarf2_attr (die, DW_AT_count, cu);
-      if (attr)
-       {
-         int count = dwarf2_get_attr_constant_value (attr, 1);
-         high.data.const_val = low.data.const_val + count - 1;
-       }
-      else
+      if (attr_to_dynamic_prop (attr, die, cu, &high))
        {
-         /* Unspecified array length.  */
-         high.data.const_val = low.data.const_val - 1;
+         /* If bounds are constant do the final calculation here.  */
+         if (low.kind == PROP_CONST && high.kind == PROP_CONST)
+           high.data.const_val = low.data.const_val + high.data.const_val - 1;
+         else
+           high_bound_is_count = 1;
        }
     }
 
@@ -14627,6 +14626,9 @@ read_subrange_type (struct die_info *die, struct dwarf2_cu *cu)
 
   range_type = create_range_type (NULL, orig_base_type, &low, &high);
 
+  if (high_bound_is_count)
+    TYPE_RANGE_DATA (range_type)->flag_upper_bound_is_count = 1;
+
   /* Ada expects an empty array on no boundary attributes.  */
   if (attr == NULL && cu->language != language_ada)
     TYPE_HIGH_BOUND_KIND (range_type) = PROP_UNDEFINED;
index d510ee67d450dc9a3614fa1160717a6f0cbc343e..57101e1eeecb23aa16ac93b40c827d78c506a106 100644 (file)
@@ -1698,6 +1698,10 @@ resolve_dynamic_bounds (struct type *type, CORE_ADDR addr)
     {
       high_bound.kind = PROP_CONST;
       high_bound.data.const_val = value;
+
+      if (TYPE_RANGE_DATA (range_type)->flag_upper_bound_is_count)
+       high_bound.data.const_val
+         = low_bound.data.const_val + high_bound.data.const_val - 1;
     }
   else
     {
index 97411d142c99e4f1791028f1225e075e6323f79b..6c3bb330c11712c95ad6baab910601ec79b57d81 100644 (file)
@@ -663,6 +663,11 @@ struct main_type
       /* * High bound of range.  */
 
       struct dynamic_prop high;
+
+      /* True if HIGH range bound contains the number of elements in the
+        subrange. This affects how the final hight bound is computed.  */
+
+      int flag_upper_bound_is_count : 1;
     } *bounds;
 
   } flds_bnds;