]> git.ipfire.org Git - thirdparty/elfutils.git/commitdiff
libdw: Add support for DWARF5 DW_FORM_data16.
authorMark Wielaard <mark@klomp.org>
Thu, 28 Dec 2017 16:44:06 +0000 (17:44 +0100)
committerMark Wielaard <mark@klomp.org>
Wed, 21 Feb 2018 16:20:30 +0000 (17:20 +0100)
The DWARF5 spec says DW_FORM_data16 is constant class (128bit value).
But we treat it as if it is block class. So to use a attribute that is
encoded as DW_FORM_data16 use dwarf_formblock, not dwarf_form[us]data.

We cannot use dwarf_form[us]data since they return a Dwarf_Word/Sword,
which are only 64bits.

This does mean we don't try to convert the value but just return it as
a block of 16 raw bytes.

Signed-off-by: Mark Wielaard <mark@klomp.org>
libdw/ChangeLog
libdw/dwarf_formblock.c
src/ChangeLog
src/readelf.c

index 888e50967f268273f4af02a10ae0cf1992672f19..b86fb13fdadb3cb95c91b83be8f4e866c0efce5f 100644 (file)
@@ -1,3 +1,8 @@
+2018-02-09  Mark Wielaard  <mark@klomp.org>
+
+       * dwarf_formblock.c (dwarf_formblock): Handle DW_FORM_data16 as a
+       16 byte block.
+
 2018-02-09  Mark Wielaard  <mark@klomp.org>
 
        * dwarf_child.c (__libdw_find_attr): Handle DW_FORM_implicit_const.
index 13f9e72a2a13c6751c00db2160e63117eb29cbe2..924baf45810c4ccd2343d4473ccfb042772678ec 100644 (file)
@@ -1,5 +1,5 @@
 /* Return block represented by attribute.
-   Copyright (C) 2004-2010, 2014 Red Hat, Inc.
+   Copyright (C) 2004-2010, 2014, 2018 Red Hat, Inc.
    This file is part of elfutils.
    Written by Ulrich Drepper <drepper@redhat.com>, 2004.
 
@@ -75,6 +75,16 @@ dwarf_formblock (Dwarf_Attribute *attr, Dwarf_Block *return_block)
       return_block->data = (unsigned char *) datap;
       break;
 
+    case DW_FORM_data16:
+      /* The DWARFv5 spec calls this constant class, but we interpret
+        it as a block that the user will need to interpret when
+        converting to a value.  */
+      if (unlikely (endp - datap < 16))
+       goto invalid;
+      return_block->length = 16;
+      return_block->data = (unsigned char *) datap;
+      break;
+
     default:
       __libdw_seterrno (DWARF_E_NO_BLOCK);
       return -1;
index 282736636e903c434f9cc3f6793dd2d9dfb22e04..0ae01e9267b9380f2f4061d2eafeb9e6c5b5500a 100644 (file)
@@ -1,3 +1,7 @@
+2018-02-09  Mark Wielaard  <mark@klomp.org>
+
+       * readelf.c (attr_callback): Handle DW_FORM_data16 as Dwarf_Block.
+
 2018-02-09  Mark Wielaard  <mark@klomp.org>
 
        * readelf.c (print_debug_abbrev_section): Print the value of a
index bdeba4b6b01fee167248f2550eb499e677fdac77..2d49af346d67a8ed7460196984f14cd278fa1972 100644 (file)
@@ -6083,7 +6083,7 @@ attr_callback (Dwarf_Attribute *attrp, void *arg)
     case DW_FORM_implicit_const:
     case DW_FORM_udata:
     case DW_FORM_sdata:
-    case DW_FORM_data8:
+    case DW_FORM_data8: /* Note no data16 here, we see that as block. */
     case DW_FORM_data4:
     case DW_FORM_data2:
     case DW_FORM_data1:;
@@ -6276,6 +6276,7 @@ attr_callback (Dwarf_Attribute *attrp, void *arg)
     case DW_FORM_block2:
     case DW_FORM_block1:
     case DW_FORM_block:
+    case DW_FORM_data16: /* DWARF5 calls this a constant class.  */
       if (cbargs->silent)
        break;
       Dwarf_Block block;