aboutsummaryrefslogtreecommitdiff
path: root/gdb/dwarf2loc.h
diff options
context:
space:
mode:
authorSanimir Agovic <sanimir.agovic@intel.com>2013-10-09 15:28:22 +0100
committerSanimir Agovic <sanimir.agovic@intel.com>2014-04-11 13:43:48 +0100
commit37c1ab67a35025d37d42c449deab5f254f9f59da (patch)
tree58b22b4d781f80685e330c47d41571991a082fa2 /gdb/dwarf2loc.h
parent729efb13174d6522fba4aa7ab273e7f25a253c47 (diff)
downloadgdb-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.h28
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;