The following patch is needed to recognize the new DW_LANG constants
that GCC 5 might emit as implemented by this GCC patch:
https://gcc.gnu.org/ml/gcc-patches/2014-11/msg02852.html

Also added to https://fedorahosted.org/elfutils/wiki/DwarfExtensions

GCC 5 can emit these new DWARFv5 draft language constants. Handle them in
dwarf_aggregate_size and dwarf_getfuncs. Also handle DW_LANG_Go in
dwarf_aggregate_size (lower bound for array is zero for Go).

Signed-off-by: Mark Wielaard <m...@redhat.com>
---
 libdw/ChangeLog              | 11 +++++++++++
 libdw/dwarf.h                |  4 ++++
 libdw/dwarf_aggregate_size.c |  4 ++++
 libdw/dwarf_getfuncs.c       |  3 ++-
 4 files changed, 21 insertions(+), 1 deletion(-)

diff --git a/libdw/ChangeLog b/libdw/ChangeLog
index 58736a6..ea9dca1 100644
--- a/libdw/ChangeLog
+++ b/libdw/ChangeLog
@@ -1,3 +1,14 @@
+2014-11-24  Mark Wielaard  <m...@redhat.com>
+
+       * dwarf.h (DW_LANG_C_plus_plus_11): Added.
+       (DW_LANG_C11): Likewise.
+       (DW_LANG_C_plus_plus_14): Likewise.
+       * dwarf_aggregate_size.c (array_size): Handle DW_LANG_C11,
+       DW_LANG_C_plus_plus_11, DW_LANG_C_plus_plus_14 and DW_LANG_Go
+       lower bound.
+       * dwarf_getfuncs.c (dwarf_getfuncs): Set c_cu to true for
+       DW_LANG_C11.
+
 2014-11-11  Mark Wielaard  <m...@redhat.com>
 
        * dwarf_getsrclines.c (read_srclines): Do address_size comparison
diff --git a/libdw/dwarf.h b/libdw/dwarf.h
index d03cf5c..3a97ccb 100644
--- a/libdw/dwarf.h
+++ b/libdw/dwarf.h
@@ -583,6 +583,10 @@ enum
     DW_LANG_D = 0x0013,                     /* D */
     DW_LANG_Python = 0x0014,        /* Python */
     DW_LANG_Go = 0x0016,            /* Go */
+    DW_LANG_C_plus_plus_11 = 0x001a, /* ISO C++:2011 */
+    DW_LANG_C11 = 0x001d,           /* ISO C:2011 */
+    DW_LANG_C_plus_plus_14 = 0x0021, /* ISO C++:2014 */
+
 
     DW_LANG_lo_user = 0x8000,
     DW_LANG_Mips_Assembler = 0x8001, /* Assembler */
diff --git a/libdw/dwarf_aggregate_size.c b/libdw/dwarf_aggregate_size.c
index 1666e24..667c274 100644
--- a/libdw/dwarf_aggregate_size.c
+++ b/libdw/dwarf_aggregate_size.c
@@ -103,12 +103,16 @@ array_size (Dwarf_Die *die, Dwarf_Word *size,
                    case DW_LANG_C:
                    case DW_LANG_C89:
                    case DW_LANG_C99:
+                   case DW_LANG_C11:
                    case DW_LANG_C_plus_plus:
+                   case DW_LANG_C_plus_plus_11:
+                   case DW_LANG_C_plus_plus_14:
                    case DW_LANG_ObjC:
                    case DW_LANG_ObjC_plus_plus:
                    case DW_LANG_Java:
                    case DW_LANG_D:
                    case DW_LANG_UPC:
+                   case DW_LANG_Go:
                      lower = 0;
                      break;
 
diff --git a/libdw/dwarf_getfuncs.c b/libdw/dwarf_getfuncs.c
index 82894c9..f79b0a7 100644
--- a/libdw/dwarf_getfuncs.c
+++ b/libdw/dwarf_getfuncs.c
@@ -103,7 +103,8 @@ dwarf_getfuncs (Dwarf_Die *cudie, int (*callback) 
(Dwarf_Die *, void *),
   int lang = INTUSE(dwarf_srclang) (cudie);
   bool c_cu = (lang == DW_LANG_C89
               || lang == DW_LANG_C
-              || lang == DW_LANG_C99);
+              || lang == DW_LANG_C99
+              || lang == DW_LANG_C11);
 
   struct visitor_info v = { callback, arg, (void *) offset, NULL, c_cu };
   struct Dwarf_Die_Chain chain = { .die = CUDIE (cudie->cu),
-- 
1.9.3

Reply via email to