diff options
author | Mark Wielaard <mjw@redhat.com> | 2014-10-06 22:00:16 +0200 |
---|---|---|
committer | Mark Wielaard <mjw@redhat.com> | 2014-11-05 14:31:33 +0100 |
commit | 3a36e8a26c32103ec2f8edda8bf212d6883970a2 (patch) | |
tree | 0b76055b98d20af626f04022d4987a4de8b812a3 /libdw/libdw.h | |
parent | 564cfbe20beb077c3441400c4b0c406478043d76 (diff) | |
download | elfutils-3a36e8a26c32103ec2f8edda8bf212d6883970a2.tar.gz |
libdw: Add dwarf_peel_type. Use it in dwarf_aggregate_size.
Add new function dwarf_peel_type. Some type annotations in DWARF are
specified by modifier tag type wrappers instead of attributes.
For type aliases (typedef) and qualifiers (const, volatile, restrict)
tags dwarf_peel_type follows the DW_AT_type attributes till it finds
a base, user-defined, reference or pointer type DIE.
Use this new function in the backends for return type DIEs (replacing
the existing dwarf_peel_type there) and in dwarf_aggregate_size so
it can provide the sizes for qualified types too. Add a new version
and testcase for the new dwarf_aggregate_size functionality.
Signed-off-by: Mark Wielaard <mjw@redhat.com>
Diffstat (limited to 'libdw/libdw.h')
-rw-r--r-- | libdw/libdw.h | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/libdw/libdw.h b/libdw/libdw.h index 196d54ae..30364ba1 100644 --- a/libdw/libdw.h +++ b/libdw/libdw.h @@ -398,6 +398,24 @@ extern int dwarf_child (Dwarf_Die *die, Dwarf_Die *result) extern int dwarf_siblingof (Dwarf_Die *die, Dwarf_Die *result) __nonnull_attribute__ (2); +/* For type aliases and qualifier type DIEs follow the DW_AT_type + attribute (recursively) and return the underlying type Dwarf_Die. + Returns 0 when RESULT contains a Dwarf_Die (possibly equal to the + given DIE) that isn't a type alias or qualifier type. Returns 1 + when RESULT contains a type alias or qualifier Dwarf_Die that + couldn't be peeled further (it doesn't have a DW_TAG_type + attribute). Returns -1 when an error occured. + + The current DWARF specification defines one type alias tag + (DW_TAG_typedef) and three qualifier type tags (DW_TAG_const_type, + DW_TAG_volatile_type, DW_TAG_restrict_type). A future version of + this function might peel other alias or qualifier type tags if a + future DWARF version or GNU extension defines other type aliases or + qualifier type tags that don't modify or change the structural + layout of the underlying type. */ +extern int dwarf_peel_type (Dwarf_Die *die, Dwarf_Die *result) + __nonnull_attribute__ (2); + /* Check whether the DIE has children. */ extern int dwarf_haschildren (Dwarf_Die *die) __nonnull_attribute__ (1); |