From mboxrd@z Thu Jan 1 00:00:00 1970 Content-Type: multipart/mixed; boundary="===============1297637960790125321==" MIME-Version: 1.0 From: Mark Wielaard To: elfutils-devel@lists.fedorahosted.org Subject: [PATCH 2/2] libdw: Add new function dwarf_cu_die. Date: Fri, 15 Aug 2014 16:08:34 +0200 Message-ID: <1408111714-15541-2-git-send-email-mjw@redhat.com> In-Reply-To: 1408111714-15541-1-git-send-email-mjw@redhat.com --===============1297637960790125321== Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Given a Dwarf_Die or Dwarf_Attribute it is often convenient to get at the CU DIE and the CU header information. There is dwarf_diecu but that doesn't provide all information from the header and it doesn't work for attributes. Add a new dwarf_cu_die function that provides all information given a Dwarf_CU, which both Dwarf_Die and Dwarf_Attribute reference. Signed-off-by: Mark Wielaard --- ChangeLog | 4 ++++ NEWS | 2 +- libdw/ChangeLog | 7 ++++++ libdw/Makefile.am | 5 ++-- libdw/dwarf_cu_die.c | 68 ++++++++++++++++++++++++++++++++++++++++++++++++= ++++ libdw/libdw.h | 17 +++++++++++++ libdw/libdw.map | 1 + 7 files changed, 101 insertions(+), 3 deletions(-) create mode 100644 libdw/dwarf_cu_die.c diff --git a/ChangeLog b/ChangeLog index dd92265..d79d269 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,9 @@ 2014-08-15 Mark Wielaard = + * NEWS: Add dwarf_cu_die. + +2014-08-15 Mark Wielaard + * NEWS: Add dwarf_cu_getdwarf. = 2014-07-18 Mark Wielaard diff --git a/NEWS b/NEWS index 3e4e8cc..6ee4967 100644 --- a/NEWS +++ b/NEWS @@ -1,6 +1,6 @@ Version 0.160 = -libdw: New function dwarf_cu_getdwarf. +libdw: New functions dwarf_cu_getdwarf, dwarf_cu_die. = unstrip: New option -F, --force to combining files even if some ELF headers don't seem to match. diff --git a/libdw/ChangeLog b/libdw/ChangeLog index 8dfd11e..5f9b097 100644 --- a/libdw/ChangeLog +++ b/libdw/ChangeLog @@ -1,5 +1,12 @@ 2014-08-15 Mark Wielaard = + * dwarf_cu_die.c: New file. + * Makefile.am (libdw_a_SOURCES): Add dwarf_cu_die.c. + * libdw.h (dwarf_cu_die): New function declaration. + * libdw.map (ELFUTILS_0.160): Add dwarf_cu_die. + +2014-08-15 Mark Wielaard + * dwarf_cu_getdwarf.c: New file. * Makefile.am (libdw_a_SOURCES): Add dwarf_cu_getdwarf.c. * libdw.h (Dwarf_CU): New typedef. diff --git a/libdw/Makefile.am b/libdw/Makefile.am index e39ab9a..2e42a37 100644 --- a/libdw/Makefile.am +++ b/libdw/Makefile.am @@ -1,6 +1,6 @@ ## Process this file with automake to create Makefile.in ## -## Copyright (C) 2002-2010, 2012 Red Hat, Inc. +## Copyright (C) 2002-2010, 2012, 2014 Red Hat, Inc. ## This file is part of elfutils. ## ## This file is free software; you can redistribute it and/or modify @@ -86,7 +86,8 @@ libdw_a_SOURCES =3D dwarf_begin.c dwarf_begin_elf.c dwarf= _end.c dwarf_getelf.c \ dwarf_getcfi.c dwarf_getcfi_elf.c dwarf_cfi_end.c \ dwarf_aggregate_size.c dwarf_getlocation_implicit_pointer.c \ dwarf_getlocation_die.c dwarf_getlocation_attr.c \ - dwarf_getalt.c dwarf_setalt.c dwarf_cu_getdwarf.c + dwarf_getalt.c dwarf_setalt.c dwarf_cu_getdwarf.c \ + dwarf_cu_die.c = if MAINTAINER_MODE BUILT_SOURCES =3D $(srcdir)/known-dwarf.h diff --git a/libdw/dwarf_cu_die.c b/libdw/dwarf_cu_die.c new file mode 100644 index 0000000..48f4176 --- /dev/null +++ b/libdw/dwarf_cu_die.c @@ -0,0 +1,68 @@ +/* Internal definitions for libdwarf. + Copyright (C) 2014 Red Hat, Inc. + This file is part of elfutils. + + This file is free software; you can redistribute it and/or modify + it under the terms of either + + * the GNU Lesser General Public License as published by the Free + Software Foundation; either version 3 of the License, or (at + your option) any later version + + or + + * the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at + your option) any later version + + or both in parallel, as here. + + elfutils is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received copies of the GNU General Public License and + the GNU Lesser General Public License along with this program. If + not, see . */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include "libdwP.h" + + +Dwarf_Die * +dwarf_cu_die (cu, result, versionp, abbrev_offsetp, address_sizep, + offset_sizep, type_signaturep, type_offsetp) + Dwarf_CU *cu; + Dwarf_Die *result; + Dwarf_Half *versionp; + Dwarf_Off *abbrev_offsetp; + uint8_t *address_sizep; + uint8_t *offset_sizep; + uint64_t *type_signaturep; + Dwarf_Off *type_offsetp; +{ + if (cu =3D=3D NULL) + return NULL; + + *result =3D CUDIE (cu); + + if (versionp !=3D NULL) + *versionp =3D cu->version; + if (abbrev_offsetp !=3D NULL) + *abbrev_offsetp =3D cu->orig_abbrev_offset; + if (address_sizep !=3D NULL) + *address_sizep =3D cu->address_size; + if (offset_sizep !=3D NULL) + *offset_sizep =3D cu->offset_size; + if (type_signaturep !=3D NULL) + *type_signaturep =3D cu->type_sig8; + if (type_offsetp !=3D NULL) + *type_offsetp =3D cu->type_offset; + + return result; +} diff --git a/libdw/libdw.h b/libdw/libdw.h index 61d3b38..196d54a 100644 --- a/libdw/libdw.h +++ b/libdw/libdw.h @@ -364,6 +364,23 @@ extern Dwarf_Die *dwarf_diecu (Dwarf_Die *die, Dwarf_D= ie *result, uint8_t *address_sizep, uint8_t *offset_sizep) __nonnull_attribute__ (2); = +/* Return the CU DIE and the header info associated with a Dwarf_Die + or Dwarf_Attribute. A Dwarf_Die or a Dwarf_Attribute is associated + with a particular Dwarf_CU handle. This function returns the CU or + type unit DIE and header information for that Dwarf_CU. The + returned DIE is either a compile_unit, partial_unit or type_unit. + If it is a type_unit, then the type signature and type offset are + also provided, otherwise type_offset will be set to zero. See also + dwarf_diecu and dwarf_next_unit. */ +extern Dwarf_Die *dwarf_cu_die (Dwarf_CU *cu, Dwarf_Die *result, + Dwarf_Half *versionp, + Dwarf_Off *abbrev_offsetp, + uint8_t *address_sizep, + uint8_t *offset_sizep, + uint64_t *type_signaturep, + Dwarf_Off *type_offsetp) + __nonnull_attribute__ (2); + /* Return CU DIE containing given address. */ extern Dwarf_Die *dwarf_addrdie (Dwarf *dbg, Dwarf_Addr addr, Dwarf_Die *result) __nonnull_attribute__ (3); diff --git a/libdw/libdw.map b/libdw/libdw.map index 27e2273..55bc537 100644 --- a/libdw/libdw.map +++ b/libdw/libdw.map @@ -305,4 +305,5 @@ ELFUTILS_0.159 { ELFUTILS_0.160 { global: dwarf_cu_getdwarf; + dwarf_cu_die; } ELFUTILS_0.159; \ No newline at end of file -- = 1.8.3.1 --===============1297637960790125321==--