diff options
author | Djordje Todorovic <djordje.todorovic@rt-rk.com> | 2017-09-26 15:23:35 +0200 |
---|---|---|
committer | Mark Wielaard <mark@klomp.org> | 2017-10-06 21:38:48 +0200 |
commit | 45e1cae277e17521aff888e2a3dc27bd94d0c42f (patch) | |
tree | 4df31e53a031d955ee89731584683f2c443e057e | |
parent | 5a60e309123060d0916015f94c327ef58bb3638e (diff) |
libdw: Update code to work with current version of elfutils
Signed-off-by: Djordje Todorovic <djordje.todorovic@rt-rk.com>
-rw-r--r-- | libdw/c++/dwarf_output | 2 | ||||
-rw-r--r-- | libdw/c++/known.cc | 100 | ||||
-rw-r--r-- | libdw/dwarf.h | 2 | ||||
-rw-r--r-- | libdw/libdwP.h | 47 |
4 files changed, 87 insertions, 64 deletions
diff --git a/libdw/c++/dwarf_output b/libdw/c++/dwarf_output index 07799c15..90fc2fb7 100644 --- a/libdw/c++/dwarf_output +++ b/libdw/c++/dwarf_output @@ -2013,7 +2013,7 @@ namespace elfutils inline unit_copier (copier *c, const typename dw::compile_unit &in) : entry_copier (c, c->enter (in), in) { - populate (in); + this->populate (in); } }; diff --git a/libdw/c++/known.cc b/libdw/c++/known.cc index 6f09e472..bd84f52c 100644 --- a/libdw/c++/known.cc +++ b/libdw/c++/known.cc @@ -40,9 +40,9 @@ dwarf::known_tag (int tag) { switch (tag) { -#define ONE_KNOWN_DW_TAG(name, id) case id: return #id; -#define ONE_KNOWN_DW_TAG_DESC(name, id, desc) ONE_KNOWN_DW_TAG (name, id) - ALL_KNOWN_DW_TAG +#define DWARF_ONE_KNOWN_DW_TAG(name, id) case id: return #id; +#define DWARF_ONE_KNOWN_DW_TAG_DESC(name, id, desc) DWARF_ONE_KNOWN_DW_TAG (name, id) + DWARF_ALL_KNOWN_DW_TAG } return NULL; } @@ -52,9 +52,9 @@ dwarf::known_attribute (int name) { switch (name) { -#define ONE_KNOWN_DW_AT(name, id) case id: return #id; -#define ONE_KNOWN_DW_AT_DESC(name, id, desc) ONE_KNOWN_DW_AT (name, id) - ALL_KNOWN_DW_AT +#define DWARF_ONE_KNOWN_DW_AT(name, id) case id: return #id; +#define DWARF_ONE_KNOWN_DW_AT_DESC(name, id, desc) DWARF_ONE_KNOWN_DW_AT (name, id) + DWARF_ALL_KNOWN_DW_AT } return NULL; } @@ -75,35 +75,35 @@ namespace elfutils return NULL; } -#define ALL_KNOWN_ENUM \ - KNOWN_ENUM (accessibility, ACCESS) \ - KNOWN_ENUM (encoding, ATE) \ - KNOWN_ENUM (calling_convention, CC) \ - KNOWN_ENUM (decimal_sign, DS) \ - KNOWN_ENUM (endianity, END) \ - KNOWN_ENUM (identifier_case, ID) \ - KNOWN_ENUM (inline, INL) \ - KNOWN_ENUM (language, LANG) \ - KNOWN_ENUM (ordering, ORD) \ - KNOWN_ENUM (virtuality, VIRTUALITY) \ - KNOWN_ENUM (visibility, VIS) - -#define ONE_KNOWN_DW_ACCESS(name, id) KNOWN_ENUM_CASE (id) -#define ONE_KNOWN_DW_ATE(name, id) KNOWN_ENUM_CASE (id) -#define ONE_KNOWN_DW_CC(name, id) KNOWN_ENUM_CASE (id) -#define ONE_KNOWN_DW_DS(name, id) KNOWN_ENUM_CASE (id) -#define ONE_KNOWN_DW_END(name, id) KNOWN_ENUM_CASE (id) -#define ONE_KNOWN_DW_ID(name, id) KNOWN_ENUM_CASE (id) -#define ONE_KNOWN_DW_INL(name, id) KNOWN_ENUM_CASE (id) -#define ONE_KNOWN_DW_LANG(name, id) KNOWN_ENUM_CASE (id) -#define ONE_KNOWN_DW_LANG_DESC(name, id, desc) KNOWN_ENUM_CASE (id) -#define ONE_KNOWN_DW_ORD(name, id) KNOWN_ENUM_CASE (id) -#define ONE_KNOWN_DW_INL(name, id) KNOWN_ENUM_CASE (id) -#define ONE_KNOWN_DW_VIRTUALITY(name, id) KNOWN_ENUM_CASE (id) -#define ONE_KNOWN_DW_VIS(name, id) KNOWN_ENUM_CASE (id) +#define DWARF_ALL_KNOWN_ENUM \ + DWARF_KNOWN_ENUM (accessibility, ACCESS) \ + DWARF_KNOWN_ENUM (encoding, ATE) \ + DWARF_KNOWN_ENUM (calling_convention, CC) \ + DWARF_KNOWN_ENUM (decimal_sign, DS) \ + DWARF_KNOWN_ENUM (endianity, END) \ + DWARF_KNOWN_ENUM (identifier_case, ID) \ + DWARF_KNOWN_ENUM (inline, INL) \ + DWARF_KNOWN_ENUM (language, LANG) \ + DWARF_KNOWN_ENUM (ordering, ORD) \ + DWARF_KNOWN_ENUM (virtuality, VIRTUALITY) \ + DWARF_KNOWN_ENUM (visibility, VIS) + +#define DWARF_ONE_KNOWN_DW_ACCESS(name, id) DWARF_KNOWN_ENUM_CASE (id) +#define DWARF_ONE_KNOWN_DW_ATE(name, id) DWARF_KNOWN_ENUM_CASE (id) +#define DWARF_ONE_KNOWN_DW_CC(name, id) DWARF_KNOWN_ENUM_CASE (id) +#define DWARF_ONE_KNOWN_DW_DS(name, id) DWARF_KNOWN_ENUM_CASE (id) +#define DWARF_ONE_KNOWN_DW_END(name, id) DWARF_KNOWN_ENUM_CASE (id) +#define DWARF_ONE_KNOWN_DW_ID(name, id) DWARF_KNOWN_ENUM_CASE (id) +#define DWARF_ONE_KNOWN_DW_INL(name, id) DWARF_KNOWN_ENUM_CASE (id) +#define DWARF_ONE_KNOWN_DW_LANG(name, id) DWARF_KNOWN_ENUM_CASE (id) +#define DWARF_ONE_KNOWN_DW_LANG_DESC(name, id, desc) DWARF_KNOWN_ENUM_CASE (id) +#define DWARF_ONE_KNOWN_DW_ORD(name, id) DWARF_KNOWN_ENUM_CASE (id) +#define DWARF_ONE_KNOWN_DW_INL(name, id) DWARF_KNOWN_ENUM_CASE (id) +#define DWARF_ONE_KNOWN_DW_VIRTUALITY(name, id) DWARF_KNOWN_ENUM_CASE (id) +#define DWARF_ONE_KNOWN_DW_VIS(name, id) DWARF_KNOWN_ENUM_CASE (id) // Stupid C++ doesn't do [x] = y initializers. -#define KNOWN_ENUM(attr, enum) \ +#define DWARF_KNOWN_ENUM(attr, enum) \ template<> \ size_t \ dwarf::known_enum<DW_AT_##attr>::prefix_length () \ @@ -116,23 +116,23 @@ namespace elfutils { \ switch (value) \ { \ - ALL_KNOWN_DW_##enum \ + DWARF_ALL_KNOWN_DW_##enum \ } \ return NULL; \ } -#define KNOWN_ENUM_CASE(id) case id: return #id; +#define DWARF_KNOWN_ENUM_CASE(id) case id: return #id; - ALL_KNOWN_ENUM + DWARF_ALL_KNOWN_ENUM // Not really enum cases, but pretend they are. -#define ONE_KNOWN_DW_FORM(name, id) KNOWN_ENUM_CASE (id) -#define ONE_KNOWN_DW_OP(name, id) KNOWN_ENUM_CASE (id) -#define ONE_KNOWN_DW_OP_DESC(name, id, desc) KNOWN_ENUM_CASE (id) - KNOWN_ENUM (producer, FORM) - KNOWN_ENUM (location, OP) - -#undef KNOWN_ENUM -#undef KNOWN_ENUM_CASE +#define DWARF_ONE_KNOWN_DW_FORM(name, id) DWARF_KNOWN_ENUM_CASE (id) +#define DWARF_ONE_KNOWN_DW_OP(name, id) DWARF_KNOWN_ENUM_CASE (id) +#define DWARF_ONE_KNOWN_DW_OP_DESC(name, id, desc) DWARF_KNOWN_ENUM_CASE (id) + DWARF_KNOWN_ENUM (producer, FORM) + DWARF_KNOWN_ENUM (location, OP) + +#undef DWARF_KNOWN_ENUM +#undef DWARF_KNOWN_ENUM_CASE }; static const char * @@ -140,13 +140,13 @@ known_identifier (unsigned int which, unsigned int value) { switch (which) { -# define KNOWN_ENUM(attr, enum) \ +# define DWARF_KNOWN_ENUM(attr, enum) \ case DW_AT_##attr: \ return dwarf::known_enum<DW_AT_##attr>::identifier (value); - ALL_KNOWN_ENUM + DWARF_ALL_KNOWN_ENUM -# undef KNOWN_ENUM +# undef DWARF_KNOWN_ENUM } return NULL; @@ -157,13 +157,13 @@ known_name (unsigned int which, unsigned int value) { switch (which) { -# define KNOWN_ENUM(attr, enum) \ +# define DWARF_KNOWN_ENUM(attr, enum) \ case DW_AT_##attr: \ return dwarf::known_enum<DW_AT_##attr>::name (value); - ALL_KNOWN_ENUM + DWARF_ALL_KNOWN_ENUM -# undef KNOWN_ENUM +# undef DWARF_KNOWN_ENUM } return NULL; diff --git a/libdw/dwarf.h b/libdw/dwarf.h index 902d2617..c4e348f7 100644 --- a/libdw/dwarf.h +++ b/libdw/dwarf.h @@ -93,7 +93,7 @@ enum DW_TAG_unspecified_type = 0x3b, DW_TAG_partial_unit = 0x3c, DW_TAG_imported_unit = 0x3d, - /* 0x3e reserved. Was DW_TAG_mutable_type. */ + DW_TAG_mutable_type = 0x3e, DW_TAG_condition = 0x3f, DW_TAG_shared_type = 0x40, DW_TAG_type_unit = 0x41, diff --git a/libdw/libdwP.h b/libdw/libdwP.h index 78c00132..673263cf 100644 --- a/libdw/libdwP.h +++ b/libdw/libdwP.h @@ -226,6 +226,7 @@ struct Dwarf_Abbrev /* Files in line information records. */ struct Dwarf_Files_s { + struct Dwarf_CU *cu; unsigned int ndirs; unsigned int nfiles; struct Dwarf_Fileinfo_s @@ -335,16 +336,32 @@ struct Dwarf_CU ((type_unit) ? ((cu_offset) + 4 * (offset_size) - 4 + 3 + 8) \ : ((cu_offset) + 3 * (offset_size) - 4 + 3)) -#define CUDIE(fromcu) \ - ((Dwarf_Die) \ - { \ - .cu = (fromcu), \ +#ifdef __cplusplus +#define CUDIE_INIT(fromcu) \ + { \ + ((char *) fromcu->dbg->sectiondata[cu_sec_idx (fromcu)]->d_buf \ + + DIE_OFFSET_FROM_CU_OFFSET ((fromcu)->start, \ + (fromcu)->offset_size, \ + (fromcu)->type_offset != 0)), \ + (fromcu), \ + NULL, 0l \ + } +#else +#define CUDIE_INIT(fromcu) \ +{ \ + .cu = (fromcu), \ .addr = ((char *) fromcu->dbg->sectiondata[cu_sec_idx (fromcu)]->d_buf \ - + DIE_OFFSET_FROM_CU_OFFSET ((fromcu)->start, \ - (fromcu)->offset_size, \ - (fromcu)->type_offset != 0)) \ - }) \ + + DIE_OFFSET_FROM_CU_OFFSET ((fromcu)->start, \ + (fromcu)->offset_size, \ + (fromcu)->type_offset != 0)) \ +} +#endif +#ifdef __cplusplus +# define CUDIE(name, fromcu) Dwarf_Die name = CUDIE_INIT (fromcu) +#else +# define CUDIE(fromcu) ((Dwarf_Die) CUDIE_INIT (fromcu)) +#endif /* Prototype of a single .debug_macro operator. */ typedef struct @@ -466,8 +483,8 @@ __libdw_dieabbrev (Dwarf_Die *die, const unsigned char **readp) { /* Get the abbreviation code. */ unsigned int code; - const unsigned char *addr = die->addr; - get_uleb128 (code, addr, die->cu->endp); + const unsigned char *addr = (unsigned char *)die->addr; + get_uleb128 (code, addr, (unsigned char *)die->cu->endp); if (readp != NULL) *readp = addr; @@ -484,6 +501,7 @@ extern size_t __libdw_form_val_compute_len (struct Dwarf_CU *cu, const unsigned char *valp) __nonnull_attribute__ (1, 3) internal_function; +#ifndef __cplusplus /* Find the length of a form attribute. */ static inline size_t __nonnull_attribute__ (1, 3) @@ -521,6 +539,7 @@ __libdw_form_val_len (struct Dwarf_CU *cu, unsigned int form, /* Other forms require some computation. */ return __libdw_form_val_compute_len (cu, form, valp); } +#endif /* Helper function for DW_FORM_ref* handling. */ extern int __libdw_formref (Dwarf_Attribute *attr, Dwarf_Off *return_offset) @@ -642,8 +661,10 @@ __libdw_in_section (Dwarf *dbg, int sec_index, Elf_Data *data = __libdw_checked_get_data (dbg, sec_index); if (data == NULL) return false; - if (unlikely (addr < data->d_buf) - || unlikely (data->d_size - (addr - data->d_buf) < size)) + if (unlikely ((const char *) addr < (const char *) data->d_buf) + || unlikely (data->d_size - ((const char *) addr + - (const char *) data->d_buf) + < size)) { __libdw_seterrno (DWARF_E_INVALID_OFFSET); return false; @@ -717,11 +738,13 @@ cu_sec_idx (struct Dwarf_CU *cu) return cu->type_offset == 0 ? IDX_debug_info : IDX_debug_types; } +#ifndef __cplusplus static inline bool is_cudie (Dwarf_Die *cudie) { return CUDIE (cudie->cu).addr == cudie->addr; } +#endif /* Read up begin/end pair and increment read pointer. - If it's normal range record, set up *BEGINP and *ENDP and return 0. |