From patchwork Wed May 16 14:18:25 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pedro Alves X-Patchwork-Id: 27287 Received: (qmail 9805 invoked by alias); 16 May 2018 14:18:43 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 9744 invoked by uid 89); 16 May 2018 14:18:43 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-24.5 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_LAZY_DOMAIN_SECURITY, SPF_HELO_PASS autolearn=ham version=3.3.2 spammy=longest X-HELO: mx1.redhat.com Received: from mx3-rdu2.redhat.com (HELO mx1.redhat.com) (66.187.233.73) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Wed, 16 May 2018 14:18:36 +0000 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.rdu2.redhat.com [10.11.54.3]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id E38247D858 for ; Wed, 16 May 2018 14:18:34 +0000 (UTC) Received: from localhost.localdomain (ovpn04.gateway.prod.ext.ams2.redhat.com [10.39.146.4]) by smtp.corp.redhat.com (Postfix) with ESMTP id 939AD1002948 for ; Wed, 16 May 2018 14:18:34 +0000 (UTC) From: Pedro Alves To: gdb-patches@sourceware.org Subject: [PATCH 05/10] remote: remote_arch_state pointers -> remote_arch_state objects Date: Wed, 16 May 2018 15:18:25 +0100 Message-Id: <20180516141830.16859-6-palves@redhat.com> In-Reply-To: <20180516141830.16859-1-palves@redhat.com> References: <20180516141830.16859-1-palves@redhat.com> The previous patch made the map store pointers to remote_arch_state instead of objects directly, simply because struct remote_arch_state is still incomplete where struct remote_state is declared. This patch thus moves the remote_arch_state declaration higher up in the file, and makes the map store remote_arch_state objects directly instead of pointers to objects. gdb/ChangeLog: yyyy-mm-dd Pedro Alves * remote.c (struct packet_reg, struct remote_arch_state): Move higher up in the file. (remote_state) : Store remote_arch_state values instead of remote_arch_state pointers. (remote_state::get_remote_arch_state): Adjust. --- gdb/remote.c | 93 ++++++++++++++++++++++++++++++++---------------------------- 1 file changed, 49 insertions(+), 44 deletions(-) diff --git a/gdb/remote.c b/gdb/remote.c index 7903cb6344..8e1baf0856 100644 --- a/gdb/remote.c +++ b/gdb/remote.c @@ -603,6 +603,44 @@ struct readahead_cache ULONGEST miss_count = 0; }; +/* Description of the remote protocol for a given architecture. */ + +struct packet_reg +{ + long offset; /* Offset into G packet. */ + long regnum; /* GDB's internal register number. */ + LONGEST pnum; /* Remote protocol register number. */ + int in_g_packet; /* Always part of G packet. */ + /* long size in bytes; == register_size (target_gdbarch (), regnum); + at present. */ + /* char *name; == gdbarch_register_name (target_gdbarch (), regnum); + at present. */ +}; + +struct remote_arch_state +{ + explicit remote_arch_state (struct gdbarch *gdbarch); + + /* Description of the remote protocol registers. */ + long sizeof_g_packet; + + /* Description of the remote protocol registers indexed by REGNUM + (making an array gdbarch_num_regs in size). */ + std::unique_ptr regs; + + /* This is the size (in chars) of the first response to the ``g'' + packet. It is used as a heuristic when determining the maximum + size of memory-read and memory-write packets. A target will + typically only reserve a buffer large enough to hold the ``g'' + packet. The size does not include packet overhead (headers and + trailers). */ + long actual_register_packet_size; + + /* This is the maximum size (in chars) of a non read/write packet. + It is also used as a cap on the size of read/write packets. */ + long remote_packet_size; +}; + /* Description of the remote protocol state for the currently connected target. This is per-target state, and independent of the selected architecture. */ @@ -749,8 +787,7 @@ private: /* Mapping of remote protocol data for each gdbarch. Usually there is only one entry here, though we may see more with stubs that support multi-process. */ - std::unordered_map> + std::unordered_map m_arch_states; }; @@ -817,44 +854,6 @@ get_remote_state_raw (void) return remote_state; } -/* Description of the remote protocol for a given architecture. */ - -struct packet_reg -{ - long offset; /* Offset into G packet. */ - long regnum; /* GDB's internal register number. */ - LONGEST pnum; /* Remote protocol register number. */ - int in_g_packet; /* Always part of G packet. */ - /* long size in bytes; == register_size (target_gdbarch (), regnum); - at present. */ - /* char *name; == gdbarch_register_name (target_gdbarch (), regnum); - at present. */ -}; - -struct remote_arch_state -{ - explicit remote_arch_state (struct gdbarch *gdbarch); - - /* Description of the remote protocol registers. */ - long sizeof_g_packet; - - /* Description of the remote protocol registers indexed by REGNUM - (making an array gdbarch_num_regs in size). */ - std::unique_ptr regs; - - /* This is the size (in chars) of the first response to the ``g'' - packet. It is used as a heuristic when determining the maximum - size of memory-read and memory-write packets. A target will - typically only reserve a buffer large enough to hold the ``g'' - packet. The size does not include packet overhead (headers and - trailers). */ - long actual_register_packet_size; - - /* This is the maximum size (in chars) of a non read/write packet. - It is also used as a cap on the size of read/write packets. */ - long remote_packet_size; -}; - /* Utility: generate error from an incoming stub packet. */ static void trace_error (char *buf) @@ -955,10 +954,13 @@ remote_get_noisy_reply () struct remote_arch_state * remote_state::get_remote_arch_state (struct gdbarch *gdbarch) { - auto &rsa = this->m_arch_states[gdbarch]; - if (rsa == nullptr) + remote_arch_state *rsa; + + auto it = this->m_arch_states.find (gdbarch); + if (it == this->m_arch_states.end ()) { - rsa.reset (new remote_arch_state (gdbarch)); + auto p = this->m_arch_states.emplace (gdbarch, gdbarch); + rsa = &p.first->second; /* Make sure that the packet buffer is plenty big enough for this architecture. */ @@ -968,7 +970,10 @@ remote_state::get_remote_arch_state (struct gdbarch *gdbarch) this->buf = (char *) xrealloc (this->buf, this->buf_size); } } - return rsa.get (); + else + rsa = &it->second; + + return rsa; } /* Fetch the global remote target state. */