[RFC 00/15] Remove regcache::m_readonly_p

Yao Qi
2017-12-01T10:48:42Z

regcache is used in many places in gdb in different ways, so regcache
becomes a flat and fat object. That exposes some unnecessary APIs to
different part, and some APIs are misused or abused:

1) gdbarch methods pseudo_register_read and pseudo_register_read_value
have a parameter 'regcache *', but these two gdbarch methods only need
raw_read* and cooked_read* methods. So it is better to pass a class
which only has raw_read* and cooked_read* methods, and other regcache
methods are invisible to each gdbarch implementation.

2) target_ops methods to_fetch_registers and to_store_registers have a
parameter 'regcache *', but these two target_ops methods only need
raw_supply and raw_collect methods, because raw registers are from target
layer, pseudo registers are "composed" or "created" by gdbarch.

3) jit.c uses regcache in an odd way, and record-full.c should use
a simple version regcache instead of an array (see patch 11)

Beside these api issues, one issue in regcache is that there is no
type or class for readonly regcache. We use a flag field m_readonly_p
to indicate the regcache is readonly or not, so some regcache apis have
assert that this regcache is or is not readonly. The better way to do
this is to create a new class for readonly regcache which doesn't have
write methods at all.

This patch series fixes all of the problems above except 2) (I had a
patch to fix 2 in my tree, but still need more time to polish it.) by
designing a class hierarchy about regcache, like this,

reg_buffer
^
|
------+-----
^
|
regcache_read
^
|
------+------
^ ^
| |
reg_buffer_rw regcache_readonly
^
|
regcache

Class reg_buffer is a simple class, having register contents and status
(in patch 7). regcache_read is an abstract class only having raw_read*
and cooked_read* methods (in patch 8). reg_buffer_rw is a class which
has read and write methods, but it disconnects from target, IOW, the
write doesn't go through. Class regcache_readonly is the readonly
regcache, created from regcache::save method.

This patch series is tested on {x86_64, aarch64, ppc64}-linux. It is
an RFC, want to get comments. I write them in at least seven different
ways, and this one is satisfying. I don't push them in until 8.1 is
branched.

*** BLURB HERE ***

Yao Qi (15):
Call cooked_read in ppu2spu_prev_register
Don't call gdbarch_pseudo_register_read_value in jit.c
Remove mt port
Replace regcache_raw_read with regcache->raw_read
regcache_cooked_read -> regcache->cooked_read
regcache::cooked_write test
Class reg_buffer
class regcache_read and Pass regcache_read to gdbarch methods
Remove regcache_save and regcache_cpy
Class regcache_readonly
Class reg_buffer_rw
Replace regcache::dump with class register_dump
No longer create readonly regcache
Remove regcache::m_readonly_p
Move register_dump to regcache-dump.c

gdb/Makefile.in | 3 +-
gdb/aarch64-tdep.c | 12 +-
gdb/amd64-tdep.c | 11 +-
gdb/arm-tdep.c | 12 +-
gdb/avr-tdep.c | 4 +-
gdb/bfin-tdep.c | 4 +-
gdb/configure.tgt | 6 +-
gdb/dummy-frame.c | 6 +-
gdb/frame.c | 15 +-
gdb/frame.h | 3 +-
gdb/frv-tdep.c | 8 +-
gdb/gdbarch.c | 4 +-
gdb/gdbarch.h | 8 +-
gdb/gdbarch.sh | 4 +-
gdb/h8300-tdep.c | 8 +-
gdb/hppa-tdep.c | 4 +-
gdb/i386-tdep.c | 72 ++-
gdb/i386-tdep.h | 2 +-
gdb/ia64-tdep.c | 32 +-
gdb/infcmd.c | 6 +-
gdb/inferior.h | 2 +-
gdb/infrun.c | 8 +-
gdb/jit.c | 26 +-
gdb/linux-fork.c | 20 +-
gdb/m32c-tdep.c | 54 +--
gdb/m68hc11-tdep.c | 6 +-
gdb/mep-tdep.c | 12 +-
gdb/mi/mi-main.c | 12 +-
gdb/mips-tdep.c | 8 +-
gdb/msp430-tdep.c | 4 +-
gdb/mt-tdep.c | 1218 -------------------------------------------------
gdb/nds32-tdep.c | 4 +-
gdb/ppc-linux-tdep.c | 15 +-
gdb/record-full.c | 21 +-
gdb/regcache-dump.c | 335 ++++++++++++++
gdb/regcache.c | 586 ++++++++++--------------
gdb/regcache.h | 242 ++++++----
gdb/rl78-tdep.c | 29 +-
gdb/rs6000-tdep.c | 88 ++--
gdb/s390-linux-tdep.c | 17 +-
gdb/sh-tdep.c | 8 +-
gdb/sh64-tdep.c | 12 +-
gdb/sparc-tdep.c | 6 +-
gdb/sparc64-tdep.c | 22 +-
gdb/spu-tdep.c | 16 +-
gdb/xtensa-tdep.c | 15 +-
46 files changed, 1024 insertions(+), 1986 deletions(-)
delete mode 100644 gdb/mt-tdep.c
create mode 100644 gdb/regcache-dump.c

--
1.9.1