This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
[PATCH v6 08/15] vla: support for DW_AT_count
- From: Sanimir Agovic <sanimir dot agovic at intel dot com>
- To: brobecker at adacore dot com
- Cc: gdb-patches at sourceware dot org, tromey at redhat dot com
- Date: Thu, 10 Apr 2014 14:40:10 +0200
- Subject: [PATCH v6 08/15] vla: support for DW_AT_count
- Authentication-results: sourceware.org; auth=none
- References: <1397133617-26681-1-git-send-email-sanimir dot agovic at intel dot com>
This patch adds support for DW_AT_count as requested in the code review:
https://sourceware.org/ml/gdb-patches/2013-11/msg00200.html
2013-11-19 Sanimir Agovic <sanimir.agovic@intel.com>
Keven Boell <keven.boell@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.
Signed-off-by: Sanimir Agovic <sanimir.agovic@intel.com>
---
gdb/dwarf2read.c | 18 ++++++++++--------
gdb/gdbtypes.c | 4 ++++
gdb/gdbtypes.h | 6 +++++-
3 files changed, 19 insertions(+), 9 deletions(-)
diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c
index 436d0db..155bdb1 100644
--- a/gdb/dwarf2read.c
+++ b/gdb/dwarf2read.c
@@ -14340,6 +14340,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;
@@ -14406,15 +14407,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;
}
}
@@ -14467,6 +14466,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;
diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c
index ce582f8..61a5b3d 100644
--- a/gdb/gdbtypes.c
+++ b/gdb/gdbtypes.c
@@ -1625,6 +1625,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
{
diff --git a/gdb/gdbtypes.h b/gdb/gdbtypes.h
index 36e4a5f..d0757e5 100644
--- a/gdb/gdbtypes.h
+++ b/gdb/gdbtypes.h
@@ -392,7 +392,6 @@ struct dynamic_prop
} data;
};
-
/* Determine which field of the union main_type.fields[x].loc is used. */
enum field_loc_kind
@@ -622,6 +621,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;
--
1.8.4.2