diff options
author | Tom Tromey <tromey@adacore.com> | 2020-04-24 13:40:31 -0600 |
---|---|---|
committer | Tom Tromey <tromey@adacore.com> | 2020-04-24 13:40:31 -0600 |
commit | b249d2c2c01775fb015b38b272389b8693e414f6 (patch) | |
tree | 5c41219789c65cf9f6f65f46568a432c063f68c4 /gdb/dwarf2/loc.h | |
parent | 61122aa9ed4096c3d85b01d52a0c0f67fb441533 (diff) | |
download | gdb-b249d2c2c01775fb015b38b272389b8693e414f6.zip gdb-b249d2c2c01775fb015b38b272389b8693e414f6.tar.gz gdb-b249d2c2c01775fb015b38b272389b8693e414f6.tar.bz2 |
Prefer existing data when evaluating DWARF expression
When evaluating a DWARF expression, the dynamic type resolution code
will pass in a buffer of bytes via the property_addr_info. However,
the DWARF expression evaluator will then proceed to read memory from
the inferior, even when the request could be filled from this buffer.
This, in turn, is a problem in some cases; and specifically when
trying to handle the Ada scenario of extracting a variable-length
value from a packed array. Here, the ordinary DWARF expression cannot
be directly evaluated, because the data may appear at some arbitrary
bit offset. So, it is unpacked into a staging area and then the
expression is evaluated -- using an address of 0.
This patch fixes the problem by arranging for the DWARF evaluator, in
this case, to prefer passed-in memory when possible. The type of the
buffer in the property_addr_info is changed to an array_view so that
bounds checking can be done.
gdb/ChangeLog
2020-04-24 Tom Tromey <tromey@adacore.com>
* ada-lang.c (ada_discrete_type_high_bound, ada_discrete_type_low)
(ada_value_primitive_packed_val): Update.
* ada-valprint.c (ada_value_print_1): Update.
* dwarf2/loc.c (evaluate_for_locexpr_baton): New struct.
(dwarf2_locexpr_baton_eval): Take a property_addr_info rather than
just an address. Use evaluate_for_locexpr_baton.
(dwarf2_evaluate_property): Update.
* dwarf2/loc.h (struct property_addr_info) <valaddr>: Now an
array_view.
* findvar.c (default_read_var_value): Update.
* gdbtypes.c (compute_variant_fields_inner)
(resolve_dynamic_type_internal): Update.
(resolve_dynamic_type): Change type of valaddr parameter.
* gdbtypes.h (resolve_dynamic_type): Update.
* valarith.c (value_subscripted_rvalue): Update.
* value.c (value_from_contents_and_address): Update.
Diffstat (limited to 'gdb/dwarf2/loc.h')
-rw-r--r-- | gdb/dwarf2/loc.h | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/gdb/dwarf2/loc.h b/gdb/dwarf2/loc.h index 6ff9b79..9815368 100644 --- a/gdb/dwarf2/loc.h +++ b/gdb/dwarf2/loc.h @@ -73,7 +73,7 @@ struct property_addr_info struct type *type; /* If not NULL, a buffer containing the object's value. */ - const gdb_byte *valaddr; + gdb::array_view<const gdb_byte> valaddr; /* The address of that object. */ CORE_ADDR addr; |