summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDjordje Todorovic <djordje.todorovic@rt-rk.com>2017-09-26 15:23:35 +0200
committerMark Wielaard <mark@klomp.org>2017-10-06 21:38:48 +0200
commit45e1cae277e17521aff888e2a3dc27bd94d0c42f (patch)
tree4df31e53a031d955ee89731584683f2c443e057e
parent5a60e309123060d0916015f94c327ef58bb3638e (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_output2
-rw-r--r--libdw/c++/known.cc100
-rw-r--r--libdw/dwarf.h2
-rw-r--r--libdw/libdwP.h47
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.