From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from barracuda.ebox.ca (barracuda.ebox.ca [96.127.255.19]) by sourceware.org (Postfix) with ESMTPS id 911693851C06 for ; Tue, 19 May 2020 01:35:39 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 911693851C06 X-ASG-Debug-ID: 1589852138-0c856e314b962f30001-fS2M51 Received: from smtp.ebox.ca (smtp.ebox.ca [96.127.255.82]) by barracuda.ebox.ca with ESMTP id KzxY3UOTQTox6WAB (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Mon, 18 May 2020 21:35:38 -0400 (EDT) X-Barracuda-Envelope-From: simon.marchi@efficios.com X-Barracuda-RBL-Trusted-Forwarder: 96.127.255.82 Received: from smarchi-efficios.lan (unknown [192.222.164.54]) by smtp.ebox.ca (Postfix) with ESMTP id B0000441B21; Mon, 18 May 2020 21:35:38 -0400 (EDT) From: Simon Marchi X-Barracuda-Effective-Source-IP: 192-222-164-54.qc.cable.ebox.net[192.222.164.54] X-Barracuda-Apparent-Source-IP: 192.222.164.54 X-Barracuda-RBL-IP: 192.222.164.54 To: gdb-patches@sourceware.org Cc: Simon Marchi Subject: [PATCH 2/3] gdb: use std::vector to store segments in symfile_segment_data Date: Mon, 18 May 2020 21:35:32 -0400 X-ASG-Orig-Subj: [PATCH 2/3] gdb: use std::vector to store segments in symfile_segment_data Message-Id: <20200519013533.1428830-3-simon.marchi@efficios.com> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20200519013533.1428830-1-simon.marchi@efficios.com> References: <20200519013533.1428830-1-simon.marchi@efficios.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: smtp.ebox.ca[96.127.255.82] X-Barracuda-Start-Time: 1589852138 X-Barracuda-Encrypted: DHE-RSA-AES256-SHA X-Barracuda-URL: https://96.127.255.19:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 8372 X-Virus-Scanned: by bsmtpd at ebox.ca X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using global scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=8.0 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.81946 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- X-Spam-Status: No, score=-25.9 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_NONE, KAM_DMARC_STATUS, RCVD_IN_DNSWL_LOW, SPF_HELO_NONE, SPF_SOFTFAIL, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 19 May 2020 01:35:42 -0000 Instead of maintaining two vectors, I added a small `segment` class which holds both the base address and size of one segment and replaced the two `segment_bases` and `segment_sizes` arrays with a single vector. The rest of the changes are straightforward, no behavior changes are expected. gdb/ChangeLog: * symfile.h (struct symfile_segment_data) : New. : New. : Remove. * symfile.c (default_symfile_segments): Update. * elfread.c (elf_symfile_segments): Update. * remote.c (remote_target::get_offsets): Update. * solib-target.c (solib_target_relocate_section_addresses): Update. --- gdb/elfread.c | 8 +------- gdb/remote.c | 10 +++++----- gdb/solib-target.c | 10 +++++----- gdb/symfile.c | 14 +++++--------- gdb/symfile.h | 32 +++++++++++++++++--------------- 5 files changed, 33 insertions(+), 41 deletions(-) diff --git a/gdb/elfread.c b/gdb/elfread.c index 4804d62074c4..822f443fa8d3 100644 --- a/gdb/elfread.c +++ b/gdb/elfread.c @@ -112,15 +112,9 @@ elf_symfile_segments (bfd *abfd) return NULL; symfile_segment_data_up data (new symfile_segment_data); - data->num_segments = num_segments; - data->segment_bases = XCNEWVEC (CORE_ADDR, num_segments); - data->segment_sizes = XCNEWVEC (CORE_ADDR, num_segments); for (i = 0; i < num_segments; i++) - { - data->segment_bases[i] = segments[i]->p_vaddr; - data->segment_sizes[i] = segments[i]->p_memsz; - } + data->segments.emplace_back (segments[i]->p_vaddr, segments[i]->p_memsz); num_sections = bfd_count_sections (abfd); data->segment_info = XCNEWVEC (int, num_sections); diff --git a/gdb/remote.c b/gdb/remote.c index a28f34d157a9..312a03c8fb42 100644 --- a/gdb/remote.c +++ b/gdb/remote.c @@ -4198,10 +4198,10 @@ remote_target::get_offsets () by assuming that the .text and .data offsets apply to the whole text and data segments. Convert the offsets given in the packet to base addresses for symfile_map_offsets_to_segments. */ - else if (data && data->num_segments == 2) + else if (data != nullptr && data->segments.size () == 2) { - segments[0] = data->segment_bases[0] + text_addr; - segments[1] = data->segment_bases[1] + data_addr; + segments[0] = data->segments[0].base + text_addr; + segments[1] = data->segments[1].base + data_addr; num_segments = 2; } /* If the object file has only one segment, assume that it is text @@ -4209,9 +4209,9 @@ remote_target::get_offsets () but programs with no code are useless. Of course the code might have ended up in the data segment... to detect that we would need the permissions here. */ - else if (data && data->num_segments == 1) + else if (data && data->segments.size () == 1) { - segments[0] = data->segment_bases[0] + text_addr; + segments[0] = data->segments[0].base + text_addr; num_segments = 1; } /* There's no way to relocate by segment. */ diff --git a/gdb/solib-target.c b/gdb/solib-target.c index 35e50a3e00b4..ba056478c061 100644 --- a/gdb/solib-target.c +++ b/gdb/solib-target.c @@ -386,9 +386,9 @@ Could not relocate shared library \"%s\": bad offsets"), so->so_name); "info sharedlibrary". Report any consecutive segments which were relocated as a single unit. */ gdb_assert (li->segment_bases.size () > 0); - orig_delta = li->segment_bases[0] - data->segment_bases[0]; + orig_delta = li->segment_bases[0] - data->segments[0].base; - for (i = 1; i < data->num_segments; i++) + for (i = 1; i < data->segments.size (); i++) { /* If we have run out of offsets, assume all remaining segments have the same offset. */ @@ -397,14 +397,14 @@ Could not relocate shared library \"%s\": bad offsets"), so->so_name); /* If this segment does not have the same offset, do not include it in the library's range. */ - if (li->segment_bases[i] - data->segment_bases[i] + if (li->segment_bases[i] - data->segments[i].base != orig_delta) break; } so->addr_low = li->segment_bases[0]; - so->addr_high = (data->segment_bases[i - 1] - + data->segment_sizes[i - 1] + so->addr_high = (data->segments[i - 1].base + + data->segments[i - 1].size + orig_delta); gdb_assert (so->addr_low <= so->addr_high); } diff --git a/gdb/symfile.c b/gdb/symfile.c index 9d5e2824b2a7..22793e736398 100644 --- a/gdb/symfile.c +++ b/gdb/symfile.c @@ -745,9 +745,6 @@ default_symfile_segments (bfd *abfd) high = low + bfd_section_size (sect); symfile_segment_data_up data (new symfile_segment_data); - data->num_segments = 1; - data->segment_bases = XCNEW (CORE_ADDR); - data->segment_sizes = XCNEW (CORE_ADDR); num_sections = bfd_count_sections (abfd); data->segment_info = XCNEWVEC (int, num_sections); @@ -768,8 +765,7 @@ default_symfile_segments (bfd *abfd) data->segment_info[i] = 1; } - data->segment_bases[0] = low; - data->segment_sizes[0] = high - low; + data->segments.emplace_back (low, high - low); return data; } @@ -3663,13 +3659,13 @@ symfile_map_offsets_to_segments (bfd *abfd, /* If we do not have segment mappings for the object file, we can not relocate it by segments. */ gdb_assert (data != NULL); - gdb_assert (data->num_segments > 0); + gdb_assert (data->segments.size () > 0); for (i = 0, sect = abfd->sections; sect != NULL; i++, sect = sect->next) { int which = data->segment_info[i]; - gdb_assert (0 <= which && which <= data->num_segments); + gdb_assert (0 <= which && which <= data->segments.size ()); /* Don't bother computing offsets for sections that aren't loaded as part of any segment. */ @@ -3681,7 +3677,7 @@ symfile_map_offsets_to_segments (bfd *abfd, if (which > num_segment_bases) which = num_segment_bases; - offsets[i] = segment_bases[which - 1] - data->segment_bases[which - 1]; + offsets[i] = segment_bases[which - 1] - data->segments[which - 1].base; } return 1; @@ -3699,7 +3695,7 @@ symfile_find_segment_sections (struct objfile *objfile) if (data == NULL) return; - if (data->num_segments != 1 && data->num_segments != 2) + if (data->segments.size () != 1 && data->segments.size () != 2) return; for (i = 0, sect = abfd->sections; sect != NULL; i++, sect = sect->next) diff --git a/gdb/symfile.h b/gdb/symfile.h index 2dfa6556d479..1f2395169af9 100644 --- a/gdb/symfile.h +++ b/gdb/symfile.h @@ -80,29 +80,31 @@ typedef std::vector section_addr_info; each BFD section belongs to. */ struct symfile_segment_data { + struct segment + { + segment (CORE_ADDR base, CORE_ADDR size) + : base (base), size (size) + {} + + /* The original base address the segment. */ + CORE_ADDR base; + + /* The memory size of the segment. */ + CORE_ADDR size; + }; + ~symfile_segment_data () { - xfree (this->segment_bases); - xfree (this->segment_sizes); xfree (this->segment_info); } - /* How many segments are present in this file. If there are + /* The segments present in this file. If there are two, the text segment is the first one and the data segment is the second one. */ - int num_segments = 0; - - /* If NUM_SEGMENTS is greater than zero, the original base address - of each segment. */ - CORE_ADDR *segment_bases = nullptr; - - /* If NUM_SEGMENTS is greater than zero, the memory size of each - segment. */ - CORE_ADDR *segment_sizes = nullptr; + std::vector segments; - /* If NUM_SEGMENTS is greater than zero, this is an array of entries - recording which segment contains each BFD section. - SEGMENT_INFO[I] is S+1 if the I'th BFD section belongs to segment + /* This is an array of entries recording which segment contains each BFD + section. SEGMENT_INFO[I] is S+1 if the I'th BFD section belongs to segment S, or zero if it is not in any segment. */ int *segment_info = nullptr; }; -- 2.26.2