remote: remote_arch_state pointers -> remote_arch_state objects

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:
2018-05-22  Pedro Alves  <palves@redhat.com>

	* remote.c (struct packet_reg, struct remote_arch_state):
	Move higher up in the file.
	(remote_state) <m_arch_states>: Store remote_arch_state values
	instead of remote_arch_state pointers.
	(remote_state::get_remote_arch_state): Adjust.
This commit is contained in:
Pedro Alves 2018-05-22 18:22:08 +01:00
parent 9d6eea3132
commit 43c3a0e473
2 changed files with 59 additions and 44 deletions

View File

@ -1,3 +1,11 @@
2018-05-22 Pedro Alves <palves@redhat.com>
* remote.c (struct packet_reg, struct remote_arch_state):
Move higher up in the file.
(remote_state) <m_arch_states>: Store remote_arch_state values
instead of remote_arch_state pointers.
(remote_state::get_remote_arch_state): Adjust.
2018-05-22 Pedro Alves <palves@redhat.com>
* remote.c: Include <unordered_map>.

View File

@ -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<packet_reg[]> 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<struct gdbarch *,
std::unique_ptr<struct remote_arch_state>>
std::unordered_map<struct gdbarch *, remote_arch_state>
m_arch_states;
};
@ -820,44 +857,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<packet_reg[]> 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)
@ -958,10 +957,15 @@ 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 (std::piecewise_construct,
std::forward_as_tuple (gdbarch),
std::forward_as_tuple (gdbarch));
rsa = &p.first->second;
/* Make sure that the packet buffer is plenty big enough for
this architecture. */
@ -971,7 +975,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. */