From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 103788 invoked by alias); 3 Nov 2016 18:32:43 -0000 Mailing-List: contact archer-commits-help@sourceware.org; run by ezmlm Sender: Precedence: bulk List-Post: List-Help: List-Subscribe: Received: (qmail 103762 invoked by uid 9674); 3 Nov 2016 18:32:42 -0000 Date: Thu, 03 Nov 2016 18:32:00 -0000 Message-ID: <20161103183242.103731.qmail@sourceware.org> From: jkratoch@sourceware.org To: archer-commits@sourceware.org Subject: [SCM] users/jkratoch/dwarf5gcc-gdb: . X-Git-Refname: refs/heads/users/jkratoch/dwarf5gcc-gdb X-Git-Reftype: branch X-Git-Oldrev: 3339a3d5dadae7d79ba6a0773debbd8a193e2596 X-Git-Newrev: af98ca37c4e54857543252bf8a81a653bde8bbb1 X-SW-Source: 2016-q4/txt/msg00008.txt.bz2 List-Id: The branch, users/jkratoch/dwarf5gcc-gdb has been updated via af98ca37c4e54857543252bf8a81a653bde8bbb1 (commit) from 3339a3d5dadae7d79ba6a0773debbd8a193e2596 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email. - Log ----------------------------------------------------------------- commit af98ca37c4e54857543252bf8a81a653bde8bbb1 Author: Jan Kratochvil Date: Thu Nov 3 19:32:27 2016 +0100 . ----------------------------------------------------------------------- Summary of changes: gdb/dwarf2loc.c | 67 +++++++++++++++++++++++++++++++++++--- gdb/dwarf2loc.h | 2 + gdb/dwarf2read.c | 95 ++++++++++++++++++++++++++++++++++++++++++++++-------- gdb/symfile.h | 1 + gdb/xcoffread.c | 1 + 5 files changed, 147 insertions(+), 19 deletions(-) First 500 lines of diff: diff --git a/gdb/dwarf2loc.c b/gdb/dwarf2loc.c index 6f25314..d7d784d 100644 --- a/gdb/dwarf2loc.c +++ b/gdb/dwarf2loc.c @@ -141,6 +141,57 @@ decode_debug_loc_addresses (const gdb_byte *loc_ptr, const gdb_byte *buf_end, return DEBUG_LOC_START_END; } +/* Decode the addresses in .debug_loclists entry. + A pointer to the next byte to examine is returned in *NEW_PTR. + The encoded low,high addresses are return in *LOW,*HIGH. + The result indicates the kind of entry found. */ + +static enum debug_loc_kind +decode_debug_loclists_addresses (struct dwarf2_per_cu_data *per_cu, + const gdb_byte *loc_ptr, + const gdb_byte *buf_end, + const gdb_byte **new_ptr, + CORE_ADDR *low, CORE_ADDR *high, + enum bfd_endian byte_order, + unsigned int addr_size, + int signed_addr_p) +{ + uint64_t u64; + + if (loc_ptr == buf_end) + return DEBUG_LOC_BUFFER_OVERFLOW; + + switch (*loc_ptr++) + { + case DW_LLE_end_of_list: + *new_ptr = loc_ptr; + return DEBUG_LOC_END_OF_LIST; + case DW_LLE_base_address: + if (loc_ptr + addr_size > buf_end) + return DEBUG_LOC_BUFFER_OVERFLOW; + if (signed_addr_p) + *high = extract_signed_integer (loc_ptr, addr_size, byte_order); + else + *high = extract_unsigned_integer (loc_ptr, addr_size, byte_order); + loc_ptr += addr_size; + *new_ptr = loc_ptr; + return DEBUG_LOC_BASE_ADDRESS; + case DW_LLE_offset_pair: + loc_ptr = gdb_read_uleb128 (loc_ptr, buf_end, &u64); + if (loc_ptr == NULL) + return DEBUG_LOC_BUFFER_OVERFLOW; + *low = u64; + loc_ptr = gdb_read_uleb128 (loc_ptr, buf_end, &u64); + if (loc_ptr == NULL) + return DEBUG_LOC_BUFFER_OVERFLOW; + *high = u64; + *new_ptr = loc_ptr; + return DEBUG_LOC_START_END; + default: + return DEBUG_LOC_INVALID_ENTRY; + } +} + /* Decode the addresses in .debug_loc.dwo entry. A pointer to the next byte to examine is returned in *NEW_PTR. The encoded low,high addresses are return in *LOW,*HIGH. @@ -161,10 +212,10 @@ decode_debug_loc_dwo_addresses (struct dwarf2_per_cu_data *per_cu, switch (*loc_ptr++) { - case DEBUG_LOC_END_OF_LIST: + case DW_LLE_GNU_end_of_list_entry: *new_ptr = loc_ptr; return DEBUG_LOC_END_OF_LIST; - case DEBUG_LOC_BASE_ADDRESS: + case DW_LLE_GNU_base_address_selection_entry: *low = 0; loc_ptr = gdb_read_uleb128 (loc_ptr, buf_end, &high_index); if (loc_ptr == NULL) @@ -172,7 +223,7 @@ decode_debug_loc_dwo_addresses (struct dwarf2_per_cu_data *per_cu, *high = dwarf2_read_addr_index (per_cu, high_index); *new_ptr = loc_ptr; return DEBUG_LOC_BASE_ADDRESS; - case DEBUG_LOC_START_END: + case DW_LLE_GNU_start_end_entry: loc_ptr = gdb_read_uleb128 (loc_ptr, buf_end, &low_index); if (loc_ptr == NULL) return DEBUG_LOC_BUFFER_OVERFLOW; @@ -183,7 +234,7 @@ decode_debug_loc_dwo_addresses (struct dwarf2_per_cu_data *per_cu, *high = dwarf2_read_addr_index (per_cu, high_index); *new_ptr = loc_ptr; return DEBUG_LOC_START_END; - case DEBUG_LOC_START_LENGTH: + case DW_LLE_GNU_start_length_entry: loc_ptr = gdb_read_uleb128 (loc_ptr, buf_end, &low_index); if (loc_ptr == NULL) return DEBUG_LOC_BUFFER_OVERFLOW; @@ -235,11 +286,17 @@ dwarf2_find_location_expression (struct dwarf2_loclist_baton *baton, kind = decode_debug_loc_dwo_addresses (baton->per_cu, loc_ptr, buf_end, &new_ptr, &low, &high, byte_order); - else + else if (dwarf2_version (baton->per_cu) < 5) kind = decode_debug_loc_addresses (loc_ptr, buf_end, &new_ptr, &low, &high, byte_order, addr_size, signed_addr_p); + else + kind = decode_debug_loclists_addresses (baton->per_cu, + loc_ptr, buf_end, &new_ptr, + &low, &high, byte_order, + addr_size, signed_addr_p); + loc_ptr = new_ptr; switch (kind) { diff --git a/gdb/dwarf2loc.h b/gdb/dwarf2loc.h index fa83459..912d1cd 100644 --- a/gdb/dwarf2loc.h +++ b/gdb/dwarf2loc.h @@ -56,6 +56,8 @@ int dwarf2_per_cu_offset_size (struct dwarf2_per_cu_data *cu); offset in the parent objfile. */ CORE_ADDR dwarf2_per_cu_text_offset (struct dwarf2_per_cu_data *cu); +short dwarf2_version (struct dwarf2_per_cu_data *per_cu); + /* Find a particular location expression from a location list. */ const gdb_byte *dwarf2_find_location_expression (struct dwarf2_loclist_baton *baton, diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c index 4aed261..1fe176b 100644 --- a/gdb/dwarf2read.c +++ b/gdb/dwarf2read.c @@ -225,6 +225,7 @@ struct dwarf2_per_objfile struct dwarf2_section_info macinfo; struct dwarf2_section_info macro; struct dwarf2_section_info str; + struct dwarf2_section_info line_str; struct dwarf2_section_info ranges; struct dwarf2_section_info addr; struct dwarf2_section_info frame; @@ -337,6 +338,7 @@ static const struct dwarf2_debug_sections dwarf2_elf_names = { ".debug_macinfo", ".zdebug_macinfo" }, { ".debug_macro", ".zdebug_macro" }, { ".debug_str", ".zdebug_str" }, + { ".debug_line_str", ".zdebug_line_str" }, { ".debug_ranges", ".zdebug_ranges" }, { ".debug_types", ".zdebug_types" }, { ".debug_addr", ".zdebug_addr" }, @@ -576,6 +578,8 @@ struct dwarf2_per_cu_data sect_offset offset; unsigned int length; + short dwarf_version; + /* Flag indicating this compilation unit will be read in before any of the current compilation units are processed. */ unsigned int queued : 1; @@ -1510,6 +1514,10 @@ static const char *read_indirect_string (bfd *, const gdb_byte *, const struct comp_unit_head *, unsigned int *); +static const char *read_indirect_line_string (bfd *, const gdb_byte *, + const struct comp_unit_head *, + unsigned int *); + static const char *read_indirect_string_from_dwz (struct dwz_file *, LONGEST); static ULONGEST read_unsigned_leb128 (bfd *, const gdb_byte *, unsigned int *); @@ -2227,6 +2235,11 @@ dwarf2_locate_sections (bfd *abfd, asection *sectp, void *vnames) dwarf2_per_objfile->loc.s.section = sectp; dwarf2_per_objfile->loc.size = bfd_get_section_size (sectp); } + else if (section_is_p (sectp->name, &names->loclists)) + { + dwarf2_per_objfile->loclists.s.section = sectp; + dwarf2_per_objfile->loclists.size = bfd_get_section_size (sectp); + } else if (section_is_p (sectp->name, &names->macinfo)) { dwarf2_per_objfile->macinfo.s.section = sectp; @@ -2242,6 +2255,11 @@ dwarf2_locate_sections (bfd *abfd, asection *sectp, void *vnames) dwarf2_per_objfile->str.s.section = sectp; dwarf2_per_objfile->str.size = bfd_get_section_size (sectp); } + else if (section_is_p (sectp->name, &names->line_str)) + { + dwarf2_per_objfile->line_str.s.section = sectp; + dwarf2_per_objfile->line_str.size = bfd_get_section_size (sectp); + } else if (section_is_p (sectp->name, &names->addr)) { dwarf2_per_objfile->addr.s.section = sectp; @@ -5593,6 +5611,8 @@ init_cutu_and_read_dies (struct dwarf2_per_cu_data *this_cu, /* Establish the type offset that can be used to lookup the type. */ sig_type->type_offset_in_section.sect_off = this_cu->offset.sect_off + sig_type->type_offset_in_tu.cu_off; + + this_cu->dwarf_version = cu->header.version; } else { @@ -5602,6 +5622,7 @@ init_cutu_and_read_dies (struct dwarf2_per_cu_data *this_cu, gdb_assert (this_cu->offset.sect_off == cu->header.offset.sect_off); gdb_assert (this_cu->length == get_cu_length (&cu->header)); + this_cu->dwarf_version = cu->header.version; } } @@ -16388,6 +16409,16 @@ read_attribute_value (const struct die_reader_specs *reader, break; } /* FALLTHROUGH */ + case DW_FORM_line_strp: + if (!cu->per_cu->is_dwz) + { + DW_STRING (attr) = read_indirect_line_string (abfd, info_ptr, + cu_header, &bytes_read); + DW_STRING_IS_CANONICAL (attr) = 0; + info_ptr += bytes_read; + break; + } + /* FALLTHROUGH */ case DW_FORM_GNU_strp_alt: { struct dwz_file *dwz = dwarf2_get_dwz_file (); @@ -16801,20 +16832,39 @@ read_direct_string (bfd *abfd, const gdb_byte *buf, } static const char * -read_indirect_string_at_offset (bfd *abfd, LONGEST str_offset) -{ - dwarf2_read_section (dwarf2_per_objfile->objfile, &dwarf2_per_objfile->str); - if (dwarf2_per_objfile->str.buffer == NULL) - error (_("DW_FORM_strp used without .debug_str section [in module %s]"), - bfd_get_filename (abfd)); - if (str_offset >= dwarf2_per_objfile->str.size) - error (_("DW_FORM_strp pointing outside of " - ".debug_str section [in module %s]"), - bfd_get_filename (abfd)); +read_indirect_string_at_offset_from (bfd *abfd, LONGEST str_offset, + struct dwarf2_section_info *sect, + const char *form_name, + const char *sect_name) +{ + dwarf2_read_section (dwarf2_per_objfile->objfile, sect); + if (sect->buffer == NULL) + error (_("%s used without %s section [in module %s]"), + form_name, sect_name, bfd_get_filename (abfd)); + if (str_offset >= sect->size) + error (_("%s pointing outside of %s section [in module %s]"), + form_name, sect_name, bfd_get_filename (abfd)); gdb_assert (HOST_CHAR_BIT == 8); - if (dwarf2_per_objfile->str.buffer[str_offset] == '\0') + if (sect->buffer[str_offset] == '\0') return NULL; - return (const char *) (dwarf2_per_objfile->str.buffer + str_offset); + return (const char *) (sect->buffer + str_offset); +} + +static const char * +read_indirect_string_at_offset (bfd *abfd, LONGEST str_offset) +{ + return read_indirect_string_at_offset_from (abfd, str_offset, + &dwarf2_per_objfile->str, + "DW_FORM_strp", ".debug_str"); +} + +static const char * +read_indirect_line_string_at_offset (bfd *abfd, LONGEST str_offset) +{ + return read_indirect_string_at_offset_from (abfd, str_offset, + &dwarf2_per_objfile->line_str, + "DW_FORM_line_strp", + ".debug_line_str"); } /* Read a string at offset STR_OFFSET in the .debug_str section from @@ -16851,6 +16901,16 @@ read_indirect_string (bfd *abfd, const gdb_byte *buf, return read_indirect_string_at_offset (abfd, str_offset); } +static const char * +read_indirect_line_string (bfd *abfd, const gdb_byte *buf, + const struct comp_unit_head *cu_header, + unsigned int *bytes_read_ptr) +{ + LONGEST str_offset = read_offset (abfd, buf, cu_header, bytes_read_ptr); + + return read_indirect_line_string_at_offset (abfd, str_offset); +} + static ULONGEST read_unsigned_leb128 (bfd *abfd, const gdb_byte *buf, unsigned int *bytes_read_ptr) @@ -17213,8 +17273,8 @@ dwarf2_string_attr (struct die_info *die, unsigned int name, struct dwarf2_cu *c if (attr != NULL) { - if (attr->form == DW_FORM_strp || attr->form == DW_FORM_string - || attr->form == DW_FORM_GNU_strp_alt) + if (attr->form == DW_FORM_strp || attr->form == DW_FORM_line_strp + || attr->form == DW_FORM_string || attr->form == DW_FORM_GNU_strp_alt) str = DW_STRING (attr); else complaint (&symfile_complaints, @@ -19881,6 +19941,7 @@ dump_die_shallow (struct ui_file *f, int indent, struct die_info *die) break; case DW_FORM_string: case DW_FORM_strp: + case DW_FORM_line_strp: case DW_FORM_GNU_str_index: case DW_FORM_GNU_strp_alt: fprintf_unfiltered (f, "string: \"%s\" (%s canonicalized)", @@ -22093,6 +22154,12 @@ dwarf2_per_cu_text_offset (struct dwarf2_per_cu_data *per_cu) return ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile)); } +short +dwarf2_version (struct dwarf2_per_cu_data *per_cu) +{ + return per_cu->dwarf_version; +} + /* Locate the .debug_info compilation unit from CU's objfile which contains the DIE at OFFSET. Raises an error on failure. */ diff --git a/gdb/symfile.h b/gdb/symfile.h index ae7c34b..51362b0 100644 --- a/gdb/symfile.h +++ b/gdb/symfile.h @@ -603,6 +603,7 @@ struct dwarf2_debug_sections { struct dwarf2_section_names macinfo; struct dwarf2_section_names macro; struct dwarf2_section_names str; + struct dwarf2_section_names line_str; struct dwarf2_section_names ranges; struct dwarf2_section_names types; struct dwarf2_section_names addr; diff --git a/gdb/xcoffread.c b/gdb/xcoffread.c index 1ae83aa..3337aba 100644 --- a/gdb/xcoffread.c +++ b/gdb/xcoffread.c @@ -166,6 +166,7 @@ static const struct dwarf2_debug_sections dwarf2_xcoff_names = { { NULL, NULL }, { ".dwmac", NULL }, { ".dwstr", NULL }, + { NULL, NULL }, /* debug_line_str */ { ".dwrnges", NULL }, { ".dwpbtyp", NULL }, { NULL, NULL }, /* debug_addr */ hooks/post-receive -- Repository for Project Archer.