diff options
author | Sanimir Agovic <sanimir.agovic@intel.com> | 2013-10-09 15:28:22 +0100 |
---|---|---|
committer | Sanimir Agovic <sanimir.agovic@intel.com> | 2014-04-11 13:43:48 +0100 |
commit | 37c1ab67a35025d37d42c449deab5f254f9f59da (patch) | |
tree | 58b22b4d781f80685e330c47d41571991a082fa2 /gdb/dwarf2loc.h | |
parent | 729efb13174d6522fba4aa7ab273e7f25a253c47 (diff) | |
download | gdb-37c1ab67a35025d37d42c449deab5f254f9f59da.zip gdb-37c1ab67a35025d37d42c449deab5f254f9f59da.tar.gz gdb-37c1ab67a35025d37d42c449deab5f254f9f59da.tar.bz2 |
type: add c99 variable length array support
The dwarf standard allow certain attributes to be expressed as dwarf
expressions rather than constants. For instance upper-/lowerbound attributes.
In case of a c99 variable length array the upperbound is a dynamic attribute.
With this change c99 vla behave the same as with static arrays.
1| void foo (size_t n) {
2| int ary[n];
3| memset(ary, 0, sizeof(ary));
4| }
(gdb) print ary
$1 = {0 <repeats 42 times>}
* dwarf2loc.c (dwarf2_locexpr_baton_eval): New function.
(dwarf2_evaluate_property): New function.
* dwarf2loc.h (dwarf2_evaluate_property): New function prototype.
* dwarf2read.c (attr_to_dynamic_prop): New function.
(read_subrange_type): Use attr_to_dynamic_prop to read high bound
attribute.
* gdbtypes.c: Include dwarf2loc.h.
(is_dynamic_type): New function.
(resolve_dynamic_type): New function.
(resolve_dynamic_bounds): New function.
(get_type_length): New function.
(check_typedef): Use get_type_length to compute type length.
* gdbtypes.h (TYPE_HIGH_BOUND_KIND): New macro.
(TYPE_LOW_BOUND_KIND): New macro.
(is_dynamic_type): New function prototype.
* value.c (value_from_contents_and_address): Call resolve_dynamic_type
to resolve dynamic properties of the type. Update comment.
* valops.c (get_value_at, value_at, value_at_lazy): Update comment.
Diffstat (limited to 'gdb/dwarf2loc.h')
-rw-r--r-- | gdb/dwarf2loc.h | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/gdb/dwarf2loc.h b/gdb/dwarf2loc.h index 786e77c..36173c5 100644 --- a/gdb/dwarf2loc.h +++ b/gdb/dwarf2loc.h @@ -90,6 +90,14 @@ struct value *dwarf2_evaluate_loc_desc (struct type *type, size_t size, struct dwarf2_per_cu_data *per_cu); +/* Converts a dynamic property into a static one. ADDR is the address of + the object currently being evaluated and might be nedded. + Returns 1 if PROP could be converted and the static value is passed back + into VALUE, otherwise returns 0. */ + +int dwarf2_evaluate_property (const struct dynamic_prop *prop, + CORE_ADDR addr, CORE_ADDR *value); + CORE_ADDR dwarf2_read_addr_index (struct dwarf2_per_cu_data *per_cu, unsigned int addr_index); @@ -135,6 +143,26 @@ struct dwarf2_loclist_baton unsigned char from_dwo; }; +/* A dynamic property is either expressed as a single location expression + or a location list. If the property is an indirection, pointing to + another die, keep track of the targeted type in REFERENCED_TYPE. */ + +struct dwarf2_property_baton +{ + /* If the property is an indirection, we need to evaluate the location + LOCEXPR or LOCLIST in the context of the type REFERENCED_TYPE. + If NULL, the location is the actual value of the property. */ + struct type *referenced_type; + union + { + /* Location expression. */ + struct dwarf2_locexpr_baton locexpr; + + /* Location list to be evaluated in the context of REFERENCED_TYPE. */ + struct dwarf2_loclist_baton loclist; + }; +}; + extern const struct symbol_computed_ops dwarf2_locexpr_funcs; extern const struct symbol_computed_ops dwarf2_loclist_funcs; |