]> git.ipfire.org Git - thirdparty/elfutils.git/commitdiff
libdw: Update code to work with current version of elfutils
authorDjordje Todorovic <djordje.todorovic@rt-rk.com>
Tue, 26 Sep 2017 13:23:35 +0000 (15:23 +0200)
committerMark Wielaard <mark@klomp.org>
Fri, 6 Oct 2017 19:38:48 +0000 (21:38 +0200)
Signed-off-by: Djordje Todorovic <djordje.todorovic@rt-rk.com>
libdw/c++/dwarf_output
libdw/c++/known.cc
libdw/dwarf.h
libdw/libdwP.h

index 07799c158e9dc9b72086afe4a7f28d68f266d9d9..90fc2fb78e82eb097a56cb55626e6c88fa2cff0f 100644 (file)
@@ -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);
       }
     };
 
index 6f09e472279e145ddd9681d16ff0d5339c951f20..bd84f52c829febd408b7362b1455e044307eb029 100644 (file)
@@ -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;
index 902d26176255bf5c1f7ac1c9f4e6a2531960bd92..c4e348f7f4a25c6171f89ccc903a9e1eb38d42a1 100644 (file)
@@ -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,
index 78c00132e745c1d978dfe61cfdff84e6a20d758f..673263cfe7461bc33b47a2c0cf1ca55b5c34f0db 100644 (file)
@@ -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.