From: Keven Boell <keven.boell@intel.com>
To: gdb-patches@sourceware.org
Cc: sanimir.agovic@intel.com, keven.boell@intel.com
Subject: [PATCH 02/23] dwarf: add DW_AT_data_location support
Date: Wed, 04 Jun 2014 05:55:00 -0000 [thread overview]
Message-ID: <1401861266-6240-3-git-send-email-keven.boell@intel.com> (raw)
In-Reply-To: <1401861266-6240-1-git-send-email-keven.boell@intel.com>
An object might have a descriptor proceeding the actual value.
To point the debugger to the actually value of an object
DW_AT_data_location is used for. For example the compile may
emit for this entity:
1| int foo[N];
the following descriptor:
struct array {
size_t size;
void* data; // DW_AT_data_location describes this location
}
This allows GDB to print the actual data of an type.
2014-05-28 Sanimir Agovic <sanimir.agovic@intel.com>
Keven Boell <keven.boell@intel.com>
* dwarf2read.c (set_die_type): Parse and save DW_AT_data_location
attribute.
* gdbtypes.c (is_dynamic_type): Consider a type being dynamic if
the data location has not yet been resolved.
(resolve_dynamic_type): Evaluate data location baton
if present and save its value.
* gdbtypes.h <main_type>: Add data_location.
(TYPE_DATA_LOCATION): New macro.
(TYPE_DATA_LOCATION_ADDR): New macro.
(TYPE_DATA_LOCATION_IS_ADDRESS): New macro.
* value.c: Include dwarf2loc.h.
(value_fetch_lazy): Use data location addres to read value from
memory.
(coerce_ref): Construct new value from data location.
Change-Id: Ic633fa125efdb5e438204e4f80bb3a1c97758b12
Signed-off-by: Keven Boell <keven.boell@intel.com>
---
gdb/dwarf2read.c | 15 +++++++++++++++
gdb/gdbtypes.c | 29 +++++++++++++++++++++++++++--
gdb/gdbtypes.h | 14 ++++++++++++++
gdb/value.c | 8 +++++++-
4 files changed, 63 insertions(+), 3 deletions(-)
diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c
index 6ebfffc..7a0f7f4 100644
--- a/gdb/dwarf2read.c
+++ b/gdb/dwarf2read.c
@@ -21499,6 +21499,7 @@ set_die_type (struct die_info *die, struct type *type, struct dwarf2_cu *cu)
{
struct dwarf2_per_cu_offset_and_type **slot, ofs;
struct objfile *objfile = cu->objfile;
+ struct attribute *attr;
/* For Ada types, make sure that the gnat-specific data is always
initialized (if not already set). There are a few types where
@@ -21513,6 +21514,20 @@ set_die_type (struct die_info *die, struct type *type, struct dwarf2_cu *cu)
&& !HAVE_GNAT_AUX_INFO (type))
INIT_GNAT_SPECIFIC (type);
+ /* Read DW_AT_data_location and set in type. */
+ attr = dwarf2_attr (die, DW_AT_data_location, cu);
+ if (attr_form_is_block (attr))
+ {
+ struct dynamic_prop prop;
+
+ if (attr_to_dynamic_prop (attr, die, cu, &prop))
+ {
+ TYPE_DATA_LOCATION (type)
+ = obstack_alloc (&objfile->objfile_obstack, sizeof (prop));
+ *TYPE_DATA_LOCATION (type) = prop;
+ }
+ }
+
if (dwarf2_per_objfile->die_type_hash == NULL)
{
dwarf2_per_objfile->die_type_hash =
diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c
index 2a0cfe4..c12c159 100644
--- a/gdb/gdbtypes.c
+++ b/gdb/gdbtypes.c
@@ -1635,8 +1635,12 @@ is_dynamic_type (struct type *type)
or the elements it contains have a dynamic contents. */
if (is_dynamic_type (TYPE_INDEX_TYPE (type)))
return 1;
- else
- return is_dynamic_type (TYPE_TARGET_TYPE (type));
+ else if (TYPE_DATA_LOCATION (type) != NULL
+ && (TYPE_DATA_LOCATION_KIND (type) == PROP_LOCEXPR
+ || TYPE_DATA_LOCATION_KIND (type) == PROP_LOCLIST))
+ return 1;
+ else
+ return is_dynamic_type (TYPE_TARGET_TYPE (type));
break;
}
default:
@@ -1728,6 +1732,8 @@ resolve_dynamic_type (struct type *type, CORE_ADDR addr)
{
struct type *real_type = check_typedef (type);
struct type *resolved_type = type;
+ const struct dynamic_prop *prop;
+ CORE_ADDR value;
if (!is_dynamic_type (real_type))
return type;
@@ -1759,6 +1765,18 @@ resolve_dynamic_type (struct type *type, CORE_ADDR addr)
break;
}
+ type = resolved_type;
+
+ /* Resolve data_location attribute. */
+ prop = TYPE_DATA_LOCATION (type);
+ if (dwarf2_evaluate_property (prop, addr, &value))
+ {
+ TYPE_DATA_LOCATION_ADDR (type) = value;
+ TYPE_DATA_LOCATION_KIND (type) = PROP_CONST;
+ }
+ else
+ TYPE_DATA_LOCATION (type) = NULL;
+
return resolved_type;
}
@@ -3968,6 +3986,13 @@ copy_type_recursive (struct objfile *objfile,
*TYPE_RANGE_DATA (new_type) = *TYPE_RANGE_DATA (type);
}
+ /* Copy the data location information. */
+ if (TYPE_DATA_LOCATION (type) != NULL)
+ {
+ TYPE_DATA_LOCATION (new_type) = xmalloc (sizeof (struct dynamic_prop));
+ *TYPE_DATA_LOCATION (new_type) = *TYPE_DATA_LOCATION (type);
+ }
+
/* Copy pointers to other types. */
if (TYPE_TARGET_TYPE (type))
TYPE_TARGET_TYPE (new_type) =
diff --git a/gdb/gdbtypes.h b/gdb/gdbtypes.h
index 86b1d62..c6d14d2 100644
--- a/gdb/gdbtypes.h
+++ b/gdb/gdbtypes.h
@@ -722,6 +722,10 @@ struct main_type
struct func_type *func_stuff;
} type_specific;
+
+ /* * Indirection to actual data. */
+
+ struct dynamic_prop *data_location;
};
/* * A ``struct type'' describes a particular instance of a type, with
@@ -1201,6 +1205,16 @@ extern void allocate_gnat_aux_type (struct type *);
#define TYPE_LOW_BOUND_KIND(range_type) \
TYPE_RANGE_DATA(range_type)->low.kind
+/* Attribute accessors for VLA support. */
+#define TYPE_DATA_LOCATION(thistype) \
+ TYPE_MAIN_TYPE(thistype)->data_location
+#define TYPE_DATA_LOCATION_BATON(thistype) \
+ TYPE_DATA_LOCATION (thistype)->data.baton
+#define TYPE_DATA_LOCATION_ADDR(thistype) \
+ TYPE_DATA_LOCATION (thistype)->data.const_val
+#define TYPE_DATA_LOCATION_KIND(thistype) \
+ TYPE_DATA_LOCATION (thistype)->kind
+
/* Moto-specific stuff for FORTRAN arrays. */
#define TYPE_ARRAY_UPPER_BOUND_IS_UNDEFINED(arraytype) \
diff --git a/gdb/value.c b/gdb/value.c
index d125a09..1c88dfd 100644
--- a/gdb/value.c
+++ b/gdb/value.c
@@ -3635,8 +3635,14 @@ value_fetch_lazy (struct value *val)
}
else if (VALUE_LVAL (val) == lval_memory)
{
- CORE_ADDR addr = value_address (val);
struct type *type = check_typedef (value_enclosing_type (val));
+ CORE_ADDR addr;
+
+ if (TYPE_DATA_LOCATION (type) != NULL
+ && TYPE_DATA_LOCATION_KIND (type) == PROP_CONST)
+ addr = TYPE_DATA_LOCATION_ADDR (type);
+ else
+ addr = value_address (val);
if (TYPE_LENGTH (type))
read_value_memory (val, 0, value_stack (val),
--
1.7.9.5
next prev parent reply other threads:[~2014-06-04 5:54 UTC|newest]
Thread overview: 49+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-06-04 5:54 [PATCH 00/23] Fortran dynamic array support Keven Boell
2014-06-04 5:54 ` [PATCH 15/23] test: dynamic arrays passed to subroutines Keven Boell
2014-06-04 5:54 ` [PATCH 14/23] test: evaluate dynamic arrays using Fortran primitives Keven Boell
2014-06-04 5:54 ` [PATCH 06/23] vla: reconstruct value to compute bounds of target type Keven Boell
2014-06-04 5:54 ` [PATCH 03/23] vla: introduce allocated/associated flags Keven Boell
2014-06-04 5:54 ` [PATCH 04/23] vla: make dynamic fortran arrays functional Keven Boell
2014-06-16 21:02 ` Jan Kratochvil
2014-06-17 13:53 ` Keven Boell
2014-06-17 17:26 ` Jan Kratochvil
2014-06-04 5:54 ` [PATCH 20/23] test: dynamic string evaluations Keven Boell
2014-06-16 18:41 ` Jan Kratochvil
2014-06-17 13:52 ` Keven Boell
2014-06-04 5:54 ` [PATCH 05/23] vla: make field selection work with vla Keven Boell
2014-06-04 5:54 ` [PATCH 10/23] vla: get Fortran dynamic strings working Keven Boell
2014-06-04 5:54 ` [PATCH 13/23] test: evaluate Fortran dynamic arrays of types Keven Boell
2014-06-16 20:57 ` Jan Kratochvil
2014-06-04 5:54 ` [PATCH 08/23] vla: get dynamic array corner cases to work Keven Boell
2014-06-04 5:54 ` [PATCH 16/23] test: correct ptype of dynamic arrays in Fortran Keven Boell
2014-06-04 5:54 ` [PATCH 11/23] vla: add stride support to fortran arrays Keven Boell
2014-06-04 5:54 ` [PATCH 12/23] test: basic tests for dynamic array evaluations in Fortran Keven Boell
2014-06-04 5:54 ` [PATCH 07/23] vla: use value constructor instead of raw-buffer manipulation Keven Boell
2014-06-04 5:54 ` [PATCH 23/23] test: stride support for dynamic arrays Keven Boell
2014-06-04 5:55 ` [PATCH 18/23] test: dynamic arrays passed to functions Keven Boell
2014-06-04 5:55 ` [PATCH 17/23] test: evaluating allocation/association status Keven Boell
2014-06-04 5:55 ` [PATCH 01/23] dwarf: add dwarf3 DW_OP_push_object_address opcode Keven Boell
2014-06-05 20:47 ` Tom Tromey
2014-06-11 12:30 ` Keven Boell
2014-06-10 9:54 ` Joel Brobecker
2014-06-11 12:26 ` Keven Boell
2014-06-11 13:08 ` Joel Brobecker
2014-06-12 7:57 ` Keven Boell
2014-06-12 15:47 ` Joel Brobecker
2014-06-17 13:52 ` Keven Boell
2014-06-21 15:21 ` Joel Brobecker
2014-07-07 15:29 ` Joel Brobecker
2014-06-04 5:55 ` [PATCH 09/23] vla: changed string length semantic Keven Boell
2014-06-04 5:55 ` [PATCH 22/23] test: test sizeof for dynamic fortran arrays Keven Boell
2014-06-04 5:55 ` Keven Boell [this message]
2014-06-10 12:10 ` [PATCH 02/23] dwarf: add DW_AT_data_location support Joel Brobecker
2014-06-11 12:29 ` Keven Boell
2014-06-14 13:21 ` Jan Kratochvil
2014-06-04 5:55 ` [PATCH 21/23] test: basic MI test for the dynamic array support Keven Boell
2014-06-04 5:55 ` [PATCH 19/23] test: accessing dynamic array history values Keven Boell
2014-06-04 7:10 ` [PATCH 00/23] Fortran dynamic array support Eli Zaretskii
2014-06-04 12:50 ` Joel Brobecker
2014-06-14 18:57 ` Jan Kratochvil
2014-06-14 19:39 ` Jan Kratochvil
2014-06-17 13:54 ` Keven Boell
2014-06-17 17:20 ` Jan Kratochvil
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1401861266-6240-3-git-send-email-keven.boell@intel.com \
--to=keven.boell@intel.com \
--cc=gdb-patches@sourceware.org \
--cc=sanimir.agovic@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).