2012-06-08 Jakub Jelinek * dwarf.c (read_and_display_attr_value): Handle DW_FORM_GNU_ref_alt and DW_FORM_GNU_strp_alt. (display_debug_macro): Handle DW_MACRO_GNU_define_indirect_alt, DW_MACRO_GNU_undef_indirect_alt and DW_MACRO_GNU_transparent_include_alt. * dwarf2.def (DW_FORM_GNU_ref_alt, DW_FORM_GNU_strp_alt): New forms. * dwarf2.h (enum dwarf_macro_record_type): Add DW_MACRO_GNU_define_indirect_alt, DW_MACRO_GNU_undef_indirect_alt and DW_MACRO_GNU_transparent_include_alt. --- binutils/dwarf.c 17 May 2012 10:00:35 -0000 1.115 +++ binutils/dwarf.c 8 Jun 2012 19:07:33 -0000 1.116 @@ -1284,6 +1284,8 @@ read_and_display_attr_value (unsigned lo case DW_FORM_strp: case DW_FORM_sec_offset: + case DW_FORM_GNU_ref_alt: + case DW_FORM_GNU_strp_alt: uvalue = byte_get (data, offset_size); data += offset_size; break; @@ -1349,6 +1351,11 @@ read_and_display_attr_value (unsigned lo printf (" <0x%s>", dwarf_vmatoa ("x",uvalue)); break; + case DW_FORM_GNU_ref_alt: + if (!do_loc) + printf (" ", dwarf_vmatoa ("x",uvalue)); + break; + case DW_FORM_ref1: case DW_FORM_ref2: case DW_FORM_ref4: @@ -1458,6 +1465,12 @@ read_and_display_attr_value (unsigned lo } break; + case DW_FORM_GNU_strp_alt: + if (!do_loc) + printf (_(" (alt indirect string, offset: 0x%s)"), + dwarf_vmatoa ("x", uvalue)); + break; + case DW_FORM_indirect: /* Handled above. */ break; @@ -1796,7 +1809,8 @@ read_and_display_attr_value (unsigned lo case DW_AT_import: { - if (form == DW_FORM_ref_sig8) + if (form == DW_FORM_ref_sig8 + || form == DW_FORM_GNU_ref_alt) break; if (form == DW_FORM_ref1 @@ -3629,6 +3643,31 @@ display_debug_macro (struct dwarf_sectio (unsigned long) offset); break; + case DW_MACRO_GNU_define_indirect_alt: + lineno = read_leb128 (curr, &bytes_read, 0); + curr += bytes_read; + offset = byte_get (curr, offset_size); + curr += offset_size; + printf (_(" DW_MACRO_GNU_define_indirect_alt - lineno : %d macro offset : 0x%lx\n"), + lineno, (unsigned long) offset); + break; + + case DW_MACRO_GNU_undef_indirect_alt: + lineno = read_leb128 (curr, &bytes_read, 0); + curr += bytes_read; + offset = byte_get (curr, offset_size); + curr += offset_size; + printf (_(" DW_MACRO_GNU_undef_indirect_alt - lineno : %d macro offset : 0x%lx\n"), + lineno, (unsigned long) offset); + break; + + case DW_MACRO_GNU_transparent_include_alt: + offset = byte_get (curr, offset_size); + curr += offset_size; + printf (_(" DW_MACRO_GNU_transparent_include_alt - offset : 0x%lx\n"), + (unsigned long) offset); + break; + default: if (extended_ops == NULL || extended_ops[op] == NULL) { --- include/dwarf2.def 22 May 2012 18:05:30 -0000 1.4 +++ include/dwarf2.def 8 Jun 2012 19:01:23 -0000 1.5 @@ -205,6 +205,10 @@ DW_FORM (DW_FORM_ref_sig8, 0x20) /* Extensions for Fission. See http://gcc.gnu.org/wiki/DebugFission. */ DW_FORM (DW_FORM_GNU_addr_index, 0x1f01) DW_FORM (DW_FORM_GNU_str_index, 0x1f02) +/* Extensions for DWZ multifile. + See http://www.dwarfstd.org/ShowIssue.php?issue=120604.1&type=open . */ +DW_FORM (DW_FORM_GNU_ref_alt, 0x1f20) +DW_FORM (DW_FORM_GNU_strp_alt, 0x1f21) DW_END_FORM DW_FIRST_AT (DW_AT_sibling, 0x01) --- include/dwarf2.h 27 Apr 2012 18:03:18 -0000 1.29 +++ include/dwarf2.h 8 Jun 2012 19:01:23 -0000 1.30 @@ -333,6 +333,11 @@ enum dwarf_macro_record_type DW_MACRO_GNU_define_indirect = 5, DW_MACRO_GNU_undef_indirect = 6, DW_MACRO_GNU_transparent_include = 7, + /* Extensions for DWZ multifile. + See http://www.dwarfstd.org/ShowIssue.php?issue=120604.1&type=open . */ + DW_MACRO_GNU_define_indirect_alt = 8, + DW_MACRO_GNU_undef_indirect_alt = 9, + DW_MACRO_GNU_transparent_include_alt = 10, DW_MACRO_GNU_lo_user = 0xe0, DW_MACRO_GNU_hi_user = 0xff };