[binutils] Handle DW_UT_skeleton/split_compile in process_debug_info
authorTom de Vries <tdevries@suse.de>
Tue, 9 Feb 2021 13:27:28 +0000 (14:27 +0100)
committerTom de Vries <tdevries@suse.de>
Tue, 9 Feb 2021 13:27:28 +0000 (14:27 +0100)
With this exec:
...
$ gcc -gsplit-dwarf hello.c -gdwarf-5
...
we run into:
...
$ readelf -w a.out > READELF
readelf: Warning: CU at offset c7 contains corrupt or unsupported unit type: 4.
readelf: Warning: CU at offset c7 contains corrupt or unsupported unit type: 4.
...

Fix this by handling DW_UT_skeleton and DW_UT_split_compile in
process_debug_info.

Note that this just adds the parsing of DWO_id, but not yet any printing of
it.

Tested on x86_64-linux.

binutils/ChangeLog:

2021-02-09  Tom de Vries  <tdevries@suse.de>

PR binutils/27386
* dwarf.c (process_debug_info): Handling DW_UT_skeleton and
DW_UT_split_compile.

binutils/ChangeLog
binutils/dwarf.c

index 4da4636e9618c17443aef790535c13088c842a3c..0f07cd42eaf7093bdb92a4081a638badcd2871c2 100644 (file)
@@ -1,3 +1,9 @@
+2021-02-09  Tom de Vries  <tdevries@suse.de>
+
+       PR binutils/27386
+       * dwarf.c (process_debug_info): Handling DW_UT_skeleton and
+       DW_UT_split_compile.
+
 2021-02-09  Alan Modra  <amodra@gmail.com>
 
        * testsuite/lib/binutils-common.exp (supports_gnu_osabi): Remove
index 19475e6cec3b097f05471b5f8e3b9f9242e5da68..6797dd158d64f56e1c5f9073da8f981f46454408 100644 (file)
@@ -3581,6 +3581,13 @@ process_debug_info (struct dwarf_section *           section,
 
       SAFE_BYTE_GET_AND_INC (compunit.cu_abbrev_offset, hdrptr, offset_size, end);
 
+      if (compunit.cu_unit_type == DW_UT_split_compile
+         || compunit.cu_unit_type == DW_UT_skeleton)
+       {
+         uint64_t dwo_id;
+         SAFE_BYTE_GET_AND_INC (dwo_id, hdrptr, 8, end);
+       }
+
       if (this_set == NULL)
        {
          abbrev_base = 0;
@@ -3684,6 +3691,13 @@ process_debug_info (struct dwarf_section *           section,
       if (compunit.cu_version < 5)
        SAFE_BYTE_GET_AND_INC (compunit.cu_pointer_size, hdrptr, 1, end);
 
+      if (compunit.cu_unit_type == DW_UT_split_compile
+         || compunit.cu_unit_type == DW_UT_skeleton)
+       {
+         uint64_t dwo_id;
+         SAFE_BYTE_GET_AND_INC (dwo_id, hdrptr, 8, end);
+       }
+
       /* PR 17512: file: 001-108546-0.001:0.1.  */
       if (compunit.cu_pointer_size < 2 || compunit.cu_pointer_size > 8)
        {
@@ -3800,7 +3814,9 @@ process_debug_info (struct dwarf_section *           section,
 
       if (compunit.cu_unit_type != DW_UT_compile
          && compunit.cu_unit_type != DW_UT_partial
-         && compunit.cu_unit_type != DW_UT_type)
+         && compunit.cu_unit_type != DW_UT_type
+         && compunit.cu_unit_type != DW_UT_split_compile
+         && compunit.cu_unit_type != DW_UT_skeleton)
        {
          warn (_("CU at offset %s contains corrupt or "
                  "unsupported unit type: %d.\n"),