{
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;
}
{
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;
}
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 () \
{ \
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 *
{
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;
{
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;
/* Files in line information records. */
struct Dwarf_Files_s
{
+ struct Dwarf_CU *cu;
unsigned int ndirs;
unsigned int nfiles;
struct Dwarf_Fileinfo_s
((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
{
/* 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;
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)
/* 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)
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;
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.