X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=binutils%2Fdwarf.c;h=8127ee3d7a99d37f6cfbcde58c9ef346160ce40a;hb=ce82b126ecd04d0a335b2d10db91c87f100a34d5;hp=ebd1ece3c8ddd04e544bec672987b80cafb22579;hpb=4723351a020971562868ce3d500be1824e820a51;p=deliverable%2Fbinutils-gdb.git diff --git a/binutils/dwarf.c b/binutils/dwarf.c index ebd1ece3c8..8127ee3d7a 100644 --- a/binutils/dwarf.c +++ b/binutils/dwarf.c @@ -28,6 +28,7 @@ #include "elf/common.h" #include "dwarf2.h" #include "dwarf.h" +#include "gdb/gdb-index.h" static const char *regname (unsigned int regno, int row); @@ -61,6 +62,8 @@ int do_gdb_index; int do_trace_info; int do_trace_abbrevs; int do_trace_aranges; +int do_debug_addr; +int do_debug_cu_index; int do_wide; int dwarf_cutoff_level = -1; @@ -646,19 +649,21 @@ process_abbrev_section (unsigned char *start, unsigned char *end) form = read_leb128 (start, & bytes_read, 0); start += bytes_read; - if (attribute != 0) - add_abbrev_attr (attribute, form); + add_abbrev_attr (attribute, form); } while (attribute != 0); } + /* Report the missing single zero which ends the section. */ + error (_(".debug_abbrev section not zero terminated\n")); + return NULL; } static const char * get_TAG_name (unsigned long tag) { - const char *name = get_DW_TAG_name (tag); + const char *name = get_DW_TAG_name ((unsigned int)tag); if (name == NULL) { @@ -674,8 +679,12 @@ get_TAG_name (unsigned long tag) static const char * get_FORM_name (unsigned long form) { - const char *name = get_DW_FORM_name (form); + const char *name; + + if (form == 0) + return "DW_FORM value: 0"; + name = get_DW_FORM_name (form); if (name == NULL) { static char buffer[100]; @@ -1185,6 +1194,11 @@ decode_location_expression (unsigned char * data, data += bytes_read; printf ("DW_OP_GNU_addr_index <0x%s>", dwarf_vmatoa ("x", uvalue)); break; + case DW_OP_GNU_const_index: + uvalue = read_leb128 (data, &bytes_read, 0); + data += bytes_read; + printf ("DW_OP_GNU_const_index <0x%s>", dwarf_vmatoa ("x", uvalue)); + break; /* HP extensions. */ case DW_OP_HP_is_value: @@ -1284,6 +1298,8 @@ read_and_display_attr_value (unsigned long attribute, 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 +1365,11 @@ read_and_display_attr_value (unsigned long attribute, 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 +1479,12 @@ read_and_display_attr_value (unsigned long attribute, } 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 +1823,8 @@ read_and_display_attr_value (unsigned long attribute, 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 @@ -1845,6 +1873,9 @@ get_AT_name (unsigned long attribute) { const char *name; + if (attribute == 0) + return "DW_AT value: 0"; + /* One value is shared by the MIPS and HP extensions: */ if (attribute == DW_AT_MIPS_fde) return "DW_AT_MIPS_fde or DW_AT_HP_unmodifiable"; @@ -2061,8 +2092,8 @@ process_debug_info (struct dwarf_section *section, dwarf_vmatoa ("x", compunit.cu_length), offset_size == 8 ? "64-bit" : "32-bit"); printf (_(" Version: %d\n"), compunit.cu_version); - printf (_(" Abbrev Offset: %s\n"), - dwarf_vmatoa ("d", compunit.cu_abbrev_offset)); + printf (_(" Abbrev Offset: 0x%s\n"), + dwarf_vmatoa ("x", compunit.cu_abbrev_offset)); printf (_(" Pointer Size: %d\n"), compunit.cu_pointer_size); if (do_types) { @@ -2146,6 +2177,10 @@ process_debug_info (struct dwarf_section *section, break; } + if (!do_loc && die_offset >= dwarf_start_die) + printf (_(" <%d><%lx>: Abbrev Number: 0\n"), + level, die_offset); + --level; if (level < 0) { @@ -2223,7 +2258,9 @@ process_debug_info (struct dwarf_section *section, break; } - for (attr = entry->first_attr; attr; attr = attr->next) + for (attr = entry->first_attr; + attr && attr->attribute; + attr = attr->next) { debug_info *arg; @@ -2278,7 +2315,7 @@ load_debug_info (void * file) warned_about_missing_comp_units = FALSE; /* If we have already tried and failed to load the .debug_info - section then do not bother to repear the task. */ + section then do not bother to repeat the task. */ if (num_debug_info_entries == DEBUG_INFO_UNAVAILABLE) return 0; @@ -3629,6 +3666,31 @@ display_debug_macro (struct dwarf_section *section, (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) { @@ -3681,14 +3743,17 @@ display_debug_abbrev (struct dwarf_section *section, do { + unsigned char *last; + free_abbrevs (); + last = start; start = process_abbrev_section (start, end); if (first_abbrev == NULL) continue; - printf (_(" Number TAG\n")); + printf (_(" Number TAG (0x%lx)\n"), (long) (last - section->start)); for (entry = first_abbrev; entry; entry = entry->next) { @@ -4419,6 +4484,7 @@ display_debug_ranges (struct dwarf_section *section, void *file ATTRIBUTE_UNUSED) { unsigned char *start = section->start; + unsigned char *last_start = start; unsigned long bytes; unsigned char *section_begin = start; unsigned int num_range_list, i; @@ -4502,11 +4568,16 @@ display_debug_ranges (struct dwarf_section *section, (unsigned long) (start - section_begin), (unsigned long) (next - section_begin), section->name); else if (start > next) - warn (_("There is an overlap [0x%lx - 0x%lx] in %s section.\n"), - (unsigned long) (start - section_begin), - (unsigned long) (next - section_begin), section->name); + { + if (next == last_start) + continue; + warn (_("There is an overlap [0x%lx - 0x%lx] in %s section.\n"), + (unsigned long) (start - section_begin), + (unsigned long) (next - section_begin), section->name); + } } start = next; + last_start = next; while (1) { @@ -5628,23 +5699,19 @@ display_gdb_index (struct dwarf_section *section, /* Prior versions are obsolete, and future versions may not be backwards compatible. */ - switch (version) + if (version < 3 || version > 7) { - case 3: - warn (_("The address table data in version 3 may be wrong.\n")); - break; - case 4: - warn (_("Version 4 does not support case insensitive lookups.\n")); - break; - case 5: - warn (_("Version 5 does not include inlined functions.\n")); - break; - case 6: - break; - default: warn (_("Unsupported version %lu.\n"), (unsigned long) version); return 0; } + if (version < 4) + warn (_("The address table data in version 3 may be wrong.\n")); + if (version < 5) + warn (_("Version 4 does not support case insensitive lookups.\n")); + if (version < 6) + warn (_("Version 5 does not include inlined functions.\n")); + if (version < 7) + warn (_("Version 6 does not include symbol attributes.\n")); cu_list_offset = byte_get_little_endian (start + 4, 4); tu_list_offset = byte_get_little_endian (start + 8, 4); @@ -5724,22 +5791,261 @@ display_gdb_index (struct dwarf_section *section, printf ("[%3u] %s:", i, constant_pool + name_offset); num_cus = byte_get_little_endian (constant_pool + cu_vector_offset, 4); + if (num_cus > 1) + printf ("\n"); for (j = 0; j < num_cus; ++j) { + int is_static; + gdb_index_symbol_kind kind; + cu = byte_get_little_endian (constant_pool + cu_vector_offset + 4 + j * 4, 4); + is_static = GDB_INDEX_SYMBOL_STATIC_VALUE (cu); + kind = GDB_INDEX_SYMBOL_KIND_VALUE (cu); + cu = GDB_INDEX_CU_VALUE (cu); /* Convert to TU number if it's for a type unit. */ if (cu >= cu_list_elements / 2) - printf (" T%lu", (unsigned long) (cu - cu_list_elements / 2)); + printf ("%cT%lu", num_cus > 1 ? '\t' : ' ', + (unsigned long) (cu - cu_list_elements / 2)); + else + printf ("%c%lu", num_cus > 1 ? '\t' : ' ', (unsigned long) cu); + + switch (kind) + { + case GDB_INDEX_SYMBOL_KIND_NONE: + printf (_(" [no symbol information]")); + break; + case GDB_INDEX_SYMBOL_KIND_TYPE: + printf (is_static + ? _(" [static type]") + : _(" [global type]")); + break; + case GDB_INDEX_SYMBOL_KIND_VARIABLE: + printf (is_static + ? _(" [static variable]") + : _(" [global variable]")); + break; + case GDB_INDEX_SYMBOL_KIND_FUNCTION: + printf (is_static + ? _(" [static function]") + : _(" [global function]")); + break; + case GDB_INDEX_SYMBOL_KIND_OTHER: + printf (is_static + ? _(" [static other]") + : _(" [global other]")); + break; + default: + printf (is_static + ? _(" [static unknown: %d]") + : _(" [global unknown: %d]"), + kind); + break; + } + if (num_cus > 1) + printf ("\n"); + } + if (num_cus <= 1) + printf ("\n"); + } + } + + return 1; +} + +/* Collection of CU/TU section sets from .debug_cu_index and .debug_tu_index + sections. Each set is stored in SHNDX_POOL as a zero-terminated list of + section indexes comprising one set of debug sections from a .dwo file. */ + +int cu_tu_indexes_read = 0; +unsigned int *shndx_pool = NULL; +unsigned int shndx_pool_size = 0; +unsigned int shndx_pool_used = 0; + +/* Pre-allocate enough space for the CU/TU sets needed. */ + +static void +prealloc_cu_tu_list (unsigned int nshndx) +{ + if (shndx_pool == NULL) + { + shndx_pool_size = nshndx; + shndx_pool_used = 0; + shndx_pool = (unsigned int *) xcmalloc (shndx_pool_size, + sizeof (unsigned int)); + } + else + { + shndx_pool_size = shndx_pool_used + nshndx; + shndx_pool = (unsigned int *) xcrealloc (shndx_pool, shndx_pool_size, + sizeof (unsigned int)); + } +} + +static void +add_shndx_to_cu_tu_entry (unsigned int shndx) +{ + if (shndx_pool_used >= shndx_pool_size) + { + error (_("Internal error: out of space in the shndx pool.\n")); + return; + } + shndx_pool [shndx_pool_used++] = shndx; +} + +static void +end_cu_tu_entry (void) +{ + if (shndx_pool_used >= shndx_pool_size) + { + error (_("Internal error: out of space in the shndx pool.\n")); + return; + } + shndx_pool [shndx_pool_used++] = 0; +} + +/* Process a CU or TU index. If DO_DISPLAY is true, print the contents. */ + +static int +process_cu_tu_index (struct dwarf_section *section, int do_display) +{ + unsigned char *phdr = section->start; + unsigned char *limit = phdr + section->size; + unsigned char *phash; + unsigned char *pindex; + unsigned char *ppool; + unsigned int version; + unsigned int nused; + unsigned int nslots; + unsigned int i; + + version = byte_get (phdr, 4); + nused = byte_get (phdr + 8, 4); + nslots = byte_get (phdr + 12, 4); + phash = phdr + 16; + pindex = phash + nslots * 8; + ppool = pindex + nslots * 4; + + if (!do_display) + prealloc_cu_tu_list((limit - ppool) / 4); + + if (do_display) + { + printf (_("Contents of the %s section:\n\n"), section->name); + printf (_(" Version: %d\n"), version); + printf (_(" Number of used entries: %d\n"), nused); + printf (_(" Number of slots: %d\n\n"), nslots); + } + + if (ppool > limit) + { + warn (_("Section %s too small for %d hash table entries\n"), + section->name, nslots); + return 0; + } + + for (i = 0; i < nslots; i++) + { + dwarf_vma signature_high; + dwarf_vma signature_low; + unsigned int j; + unsigned char *shndx_list; + unsigned int shndx; + char buf[64]; + + byte_get_64 (phash, &signature_high, &signature_low); + if (signature_high != 0 || signature_low != 0) + { + j = byte_get (pindex, 4); + shndx_list = ppool + j * 4; + if (do_display) + printf (_(" [%3d] Signature: 0x%s Sections: "), + i, dwarf_vmatoa64 (signature_high, signature_low, + buf, sizeof (buf))); + for (;;) + { + if (shndx_list >= limit) + { + warn (_("Section %s too small for shndx pool\n"), + section->name); + return 0; + } + shndx = byte_get (shndx_list, 4); + if (shndx == 0) + break; + if (do_display) + printf (" %d", shndx); else - printf (" %lu", (unsigned long) cu); + add_shndx_to_cu_tu_entry (shndx); + shndx_list += 4; } - printf ("\n"); + if (do_display) + printf ("\n"); + else + end_cu_tu_entry (); } + phash += 8; + pindex += 4; } + if (do_display) + printf ("\n"); + return 1; } +/* Load the CU and TU indexes if present. This will build a list of + section sets that we can use to associate a .debug_info.dwo section + with its associated .debug_abbrev.dwo section in a .dwp file. */ + +static void +load_cu_tu_indexes (void *file) +{ + /* If we have already loaded (or tried to load) the CU and TU indexes + then do not bother to repeat the task. */ + if (cu_tu_indexes_read) + return; + + if (load_debug_section (dwp_cu_index, file)) + process_cu_tu_index (&debug_displays [dwp_cu_index].section, 0); + + if (load_debug_section (dwp_tu_index, file)) + process_cu_tu_index (&debug_displays [dwp_tu_index].section, 0); + + cu_tu_indexes_read = 1; +} + +/* Find the set of sections that includes section SHNDX. */ + +unsigned int * +find_cu_tu_set (void *file, unsigned int shndx) +{ + unsigned int i; + + load_cu_tu_indexes (file); + + /* Find SHNDX in the shndx pool. */ + for (i = 0; i < shndx_pool_used; i++) + if (shndx_pool [i] == shndx) + break; + + if (i >= shndx_pool_used) + return NULL; + + /* Now backup to find the first entry in the set. */ + while (i > 0 && shndx_pool [i - 1] != 0) + i--; + + return shndx_pool + i; +} + +/* Display a .debug_cu_index or .debug_tu_index section. */ + +static int +display_cu_index (struct dwarf_section *section, void *file ATTRIBUTE_UNUSED) +{ + return process_cu_tu_index (section, 1); +} + static int display_debug_not_supported (struct dwarf_section *section, void *file ATTRIBUTE_UNUSED) @@ -5828,13 +6134,16 @@ dwarf_select_sections_by_names (const char *names) /* Please keep this table alpha- sorted. */ { "Ranges", & do_debug_ranges, 1 }, { "abbrev", & do_debug_abbrevs, 1 }, + { "addr", & do_debug_addr, 1 }, { "aranges", & do_debug_aranges, 1 }, + { "cu_index", & do_debug_cu_index, 1 }, + { "decodedline", & do_debug_lines, FLAG_DEBUG_LINES_DECODED }, { "frames", & do_debug_frames, 1 }, { "frames-interp", & do_debug_frames_interp, 1 }, + /* The special .gdb_index section. */ + { "gdb_index", & do_gdb_index, 1 }, { "info", & do_debug_info, 1 }, { "line", & do_debug_lines, FLAG_DEBUG_LINES_RAW }, /* For backwards compatibility. */ - { "rawline", & do_debug_lines, FLAG_DEBUG_LINES_RAW }, - { "decodedline", & do_debug_lines, FLAG_DEBUG_LINES_DECODED }, { "loc", & do_debug_loc, 1 }, { "macro", & do_debug_macinfo, 1 }, { "pubnames", & do_debug_pubnames, 1 }, @@ -5842,9 +6151,8 @@ dwarf_select_sections_by_names (const char *names) /* This entry is for compatability with earlier versions of readelf. */ { "ranges", & do_debug_aranges, 1 }, + { "rawline", & do_debug_lines, FLAG_DEBUG_LINES_RAW }, { "str", & do_debug_str, 1 }, - /* The special .gdb_index section. */ - { "gdb_index", & do_gdb_index, 1 }, /* These trace_* sections are used by Itanium VMS. */ { "trace_abbrev", & do_trace_abbrevs, 1 }, { "trace_aranges", & do_trace_aranges, 1 }, @@ -5973,73 +6281,78 @@ dwarf_select_sections_all (void) do_trace_info = 1; do_trace_abbrevs = 1; do_trace_aranges = 1; + do_debug_addr = 1; + do_debug_cu_index = 1; } struct dwarf_section_display debug_displays[] = { - { { ".debug_abbrev", ".zdebug_abbrev", NULL, NULL, 0, 0, abbrev }, + { { ".debug_abbrev", ".zdebug_abbrev", NULL, NULL, 0, 0, 0 }, display_debug_abbrev, &do_debug_abbrevs, 0 }, - { { ".debug_aranges", ".zdebug_aranges", NULL, NULL, 0, 0, abbrev }, + { { ".debug_aranges", ".zdebug_aranges", NULL, NULL, 0, 0, 0 }, display_debug_aranges, &do_debug_aranges, 1 }, - { { ".debug_frame", ".zdebug_frame", NULL, NULL, 0, 0, abbrev }, + { { ".debug_frame", ".zdebug_frame", NULL, NULL, 0, 0, 0 }, display_debug_frames, &do_debug_frames, 1 }, { { ".debug_info", ".zdebug_info", NULL, NULL, 0, 0, abbrev }, display_debug_info, &do_debug_info, 1 }, - { { ".debug_line", ".zdebug_line", NULL, NULL, 0, 0, abbrev }, + { { ".debug_line", ".zdebug_line", NULL, NULL, 0, 0, 0 }, display_debug_lines, &do_debug_lines, 1 }, - { { ".debug_pubnames", ".zdebug_pubnames", NULL, NULL, 0, 0, abbrev }, + { { ".debug_pubnames", ".zdebug_pubnames", NULL, NULL, 0, 0, 0 }, display_debug_pubnames, &do_debug_pubnames, 0 }, - { { ".eh_frame", "", NULL, NULL, 0, 0, abbrev }, + { { ".eh_frame", "", NULL, NULL, 0, 0, 0 }, display_debug_frames, &do_debug_frames, 1 }, - { { ".debug_macinfo", ".zdebug_macinfo", NULL, NULL, 0, 0, abbrev }, + { { ".debug_macinfo", ".zdebug_macinfo", NULL, NULL, 0, 0, 0 }, display_debug_macinfo, &do_debug_macinfo, 0 }, - { { ".debug_macro", ".zdebug_macro", NULL, NULL, 0, 0, abbrev }, + { { ".debug_macro", ".zdebug_macro", NULL, NULL, 0, 0, 0 }, display_debug_macro, &do_debug_macinfo, 1 }, - { { ".debug_str", ".zdebug_str", NULL, NULL, 0, 0, abbrev }, + { { ".debug_str", ".zdebug_str", NULL, NULL, 0, 0, 0 }, display_debug_str, &do_debug_str, 0 }, - { { ".debug_loc", ".zdebug_loc", NULL, NULL, 0, 0, abbrev }, + { { ".debug_loc", ".zdebug_loc", NULL, NULL, 0, 0, 0 }, display_debug_loc, &do_debug_loc, 1 }, - { { ".debug_pubtypes", ".zdebug_pubtypes", NULL, NULL, 0, 0, abbrev }, + { { ".debug_pubtypes", ".zdebug_pubtypes", NULL, NULL, 0, 0, 0 }, display_debug_pubnames, &do_debug_pubtypes, 0 }, - { { ".debug_ranges", ".zdebug_ranges", NULL, NULL, 0, 0, abbrev }, + { { ".debug_ranges", ".zdebug_ranges", NULL, NULL, 0, 0, 0 }, display_debug_ranges, &do_debug_ranges, 1 }, - { { ".debug_static_func", ".zdebug_static_func", NULL, NULL, 0, 0, abbrev }, + { { ".debug_static_func", ".zdebug_static_func", NULL, NULL, 0, 0, 0 }, display_debug_not_supported, NULL, 0 }, - { { ".debug_static_vars", ".zdebug_static_vars", NULL, NULL, 0, 0, abbrev }, + { { ".debug_static_vars", ".zdebug_static_vars", NULL, NULL, 0, 0, 0 }, display_debug_not_supported, NULL, 0 }, { { ".debug_types", ".zdebug_types", NULL, NULL, 0, 0, abbrev }, display_debug_types, &do_debug_info, 1 }, - { { ".debug_weaknames", ".zdebug_weaknames", NULL, NULL, 0, 0, abbrev }, + { { ".debug_weaknames", ".zdebug_weaknames", NULL, NULL, 0, 0, 0 }, display_debug_not_supported, NULL, 0 }, - { { ".gdb_index", "", NULL, NULL, 0, 0, abbrev }, - display_gdb_index, &do_gdb_index, 0 }, + { { ".gdb_index", "", NULL, NULL, 0, 0, 0 }, + display_gdb_index, &do_gdb_index, 0 }, { { ".trace_info", "", NULL, NULL, 0, 0, trace_abbrev }, - display_trace_info, &do_trace_info, 1 }, - { { ".trace_abbrev", "", NULL, NULL, 0, 0, abbrev }, - display_debug_abbrev, &do_trace_abbrevs, 0 }, - { { ".trace_aranges", "", NULL, NULL, 0, 0, abbrev }, - display_debug_aranges, &do_trace_aranges, 0 }, + display_trace_info, &do_trace_info, 1 }, + { { ".trace_abbrev", "", NULL, NULL, 0, 0, 0 }, + display_debug_abbrev, &do_trace_abbrevs, 0 }, + { { ".trace_aranges", "", NULL, NULL, 0, 0, 0 }, + display_debug_aranges, &do_trace_aranges, 0 }, { { ".debug_info.dwo", ".zdebug_info.dwo", NULL, NULL, 0, 0, abbrev_dwo }, - display_debug_info, &do_debug_info, 1 }, - { { ".debug_abbrev.dwo", ".zdebug_abbrev.dwo", NULL, NULL, 0, 0, abbrev_dwo }, - display_debug_abbrev, &do_debug_abbrevs, 0 }, + display_debug_info, &do_debug_info, 1 }, + { { ".debug_abbrev.dwo", ".zdebug_abbrev.dwo", NULL, NULL, 0, 0, 0 }, + display_debug_abbrev, &do_debug_abbrevs, 0 }, { { ".debug_types.dwo", ".zdebug_types.dwo", NULL, NULL, 0, 0, abbrev_dwo }, - display_debug_types, &do_debug_info, 1 }, - { { ".debug_line.dwo", ".zdebug_line.dwo", NULL, NULL, 0, 0, abbrev_dwo }, - display_debug_lines, &do_debug_lines, 1 }, - { { ".debug_loc.dwo", ".zdebug_loc.dwo", NULL, NULL, 0, 0, abbrev_dwo }, + display_debug_types, &do_debug_info, 1 }, + { { ".debug_line.dwo", ".zdebug_line.dwo", NULL, NULL, 0, 0, 0 }, + display_debug_lines, &do_debug_lines, 1 }, + { { ".debug_loc.dwo", ".zdebug_loc.dwo", NULL, NULL, 0, 0, 0 }, display_debug_loc, &do_debug_loc, 1 }, - { { ".debug_macro.dwo", ".zdebug_macro.dwo",NULL, NULL, 0, 0, abbrev }, + { { ".debug_macro.dwo", ".zdebug_macro.dwo", NULL, NULL, 0, 0, 0 }, display_debug_macro, &do_debug_macinfo, 1 }, - { { ".debug_macinfo.dwo", ".zdebug_macinfo.dwo",NULL, NULL, 0, 0, abbrev }, + { { ".debug_macinfo.dwo", ".zdebug_macinfo.dwo", NULL, NULL, 0, 0, 0 }, display_debug_macinfo, &do_debug_macinfo, 0 }, - { { ".debug_str.dwo", ".zdebug_str.dwo", NULL, NULL, 0, 0, str_dwo }, - display_debug_str, &do_debug_str, 1 }, - { { ".debug_str_offsets",".zdebug_str_offsets", NULL, NULL, 0, 0, abbrev }, + { { ".debug_str.dwo", ".zdebug_str.dwo", NULL, NULL, 0, 0, 0 }, + display_debug_str, &do_debug_str, 1 }, + { { ".debug_str_offsets", ".zdebug_str_offsets", NULL, NULL, 0, 0, 0 }, display_debug_str_offsets, NULL, 0 }, - { { ".debug_str_offsets.dwo",".zdebug_str_offsets.dwo", NULL, NULL, 0, 0, - abbrev }, + { { ".debug_str_offsets.dwo", ".zdebug_str_offsets.dwo", NULL, NULL, 0, 0, 0 }, display_debug_str_offsets, NULL, 0 }, - { { ".debug_addr",".zdebug_addr", NULL, NULL, 0, 0, debug_addr }, - display_debug_addr, NULL, 1 }, + { { ".debug_addr", ".zdebug_addr", NULL, NULL, 0, 0, 0 }, + display_debug_addr, &do_debug_addr, 1 }, + { { ".debug_cu_index", "", NULL, NULL, 0, 0, 0 }, + display_cu_index, &do_debug_cu_index, 0 }, + { { ".debug_tu_index", "", NULL, NULL, 0, 0, 0 }, + display_cu_index, &do_debug_cu_index, 0 }, };