bfd: Handle DW_FORM_data16 for .debug_line tables containing MD5
authorMark Wielaard <mark@klomp.org>
Mon, 24 Aug 2020 14:52:53 +0000 (15:52 +0100)
committerNick Clifton <nickc@redhat.com>
Mon, 24 Aug 2020 14:52:53 +0000 (15:52 +0100)
* dwarf2.c (read_attribute_value): Handle DW_FORM_data16.
(read_formatted_entries): Likewise. And skip zero entry.

bfd/ChangeLog
bfd/dwarf2.c

index 490aec6d9de0d61c8c49d2a3622bf82c756c108e..b068c3891aba0379bad1f15418b024f58ed90d9e 100644 (file)
@@ -1,3 +1,8 @@
+2020-08-24  Mark Wielaard  <mark@klomp.org>
+
+       * dwarf2.c (read_attribute_value): Handle DW_FORM_data16.
+       (read_formatted_entries): Likewise. And skip zero entry.
+
 2020-08-24  Cooper Qu  <cooper.qu@linux.alibaba.com>
 
        * bfd-in2.h (bfd_mach_ck860): New.
index 9ed4a4a2871f03bc88c3c132a25453fe8423ba79..d89a64b7fbaa9f0568aff2d664e67f8e1729bb75 100644 (file)
@@ -1329,6 +1329,17 @@ read_attribute_value (struct attribute *  attr,
       attr->form = DW_FORM_sdata;
       attr->u.sval = implicit_const;
       break;
+    case DW_FORM_data16:
+      /* This is really a "constant", but there is no way to store that
+         so pretend it is a 16 byte block instead.  */
+      amt = sizeof (struct dwarf_block);
+      blk = (struct dwarf_block *) bfd_alloc (abfd, amt);
+      if (blk == NULL)
+       return NULL;
+      blk->size = 16;
+      info_ptr = read_n_bytes (info_ptr, info_ptr_end, blk);
+      attr->u.blk = blk;
+      break;
     default:
       _bfd_error_handler (_("DWARF error: invalid or unhandled FORM value: %#x"),
                          form);
@@ -2069,11 +2080,17 @@ read_formatted_entries (struct comp_unit *unit, bfd_byte **bufp,
            case DW_FORM_udata:
              *uintp = attr.u.val;
              break;
+
+           case DW_FORM_data16:
+             /* MD5 data is in the attr.blk, but we are ignoring those.  */
+             break;
            }
        }
 
-      if (!callback (table, fe.name, fe.dir, fe.time, fe.size))
-       return FALSE;
+      /* Skip the first "zero entry", which is the compilation dir/file.  */
+      if (datai != 0)
+       if (!callback (table, fe.name, fe.dir, fe.time, fe.size))
+         return FALSE;
     }
 
   *bufp = buf;