[PATCH v2 1/3] Extract register_reader and register_readwriter interfaces from regcache
Simon Marchi
simon.marchi@polymtl.ca
Sat Feb 9 05:24:00 GMT 2019
On 2019-02-08 11:46, John Baldwin wrote:
> On 10/23/18 6:43 PM, Simon Marchi wrote:
>> From: Simon Marchi <simon.marchi@ericsson.com>
>>
>> In the following patch, we make gdbarch pseudo-registers hooks read
>> and
>> write required registers from a frame instead of from the current
>> regcache. To avoid having to change the implementation of all
>> architectures to use a different interface, we can re-use the regcache
>> interface.
>>
>> This patch extracts two interfaces, register_reader and
>> register_readwriter, and make respectively readable_regcache and
>> regcache inherit from them. register_reader is "something from which
>> you can read register values from". It can of course be a regcache,
>> but
>> it will also be (in the following patch) something that unwinds
>> registers for a particular frame. As you would expect,
>> register_readwriter is "something you can read and write registers
>> from/to".
>>
>> Some notes about the implementation. This results in diamond
>> inheritance: regcache inherits from both readable_regcache and
>> register_readwriter, which both inherit from register_reader. It is
>> therefore necessary to use virtual inheritance (use "public virtual"),
>> otherwises we end up with errors like:
>>
>> /home/emaisin/src/binutils-gdb/gdb/regcache.c:210:20: error: request
>> for member âcooked_readâ is ambiguous
>>
>> Also, the raw_read method in readable_regcache hides the raw_read
>> template method in register_reader. So it's necessary to use "using
>> register_reader::raw_read" so that clients of readable_regcache are
>> able
>> to call register_reader's raw_read. Same thing for some cooked_read,
>> raw_write and cooked_write.
>>
>> All corresponding gdbarch hooks are updated to use register_reader or
>> register_readwriter instead of readable_regcache and regcache, but
>> otherwise they are not changed.
>>
>> With this patch, no behavior change is expected.
>>
>> @@ -539,20 +541,19 @@ regcache_raw_read_signed (struct regcache
>> *regcache, int regnum, LONGEST *val)
>>
>> template<typename T, typename>
>> enum register_status
>> -readable_regcache::raw_read (int regnum, T *val)
>> +register_reader::raw_read (int regnum, T *val)
>> {
>> - gdb_byte *buf;
>> - enum register_status status;
>> + gdbarch *arch = this->arch ();
>> + int reg_size = register_size (arch, regnum);
>> + gdb_byte buf[reg_size];
>> +
>> + register_status status = raw_read (regnum, buf);
>>
>> - assert_regnum (regnum);
>> - buf = (gdb_byte *) alloca (m_descr->sizeof_register[regnum]);
>> - status = raw_read (regnum, buf);
>
> This "loses" the assert_regnum(). Is that replaced for regcache's by
> the
> gdb_assert() you added in readable_regcache::raw_read()? Did you
> consider
> moving that assertion to here instead so it would also be enforced in
> the
> frame version of register_reader? (Or does the frame version also add
> its
> own assertion in the following patches?)
Good point. I don't recall exactly, but the idea was probably to have
the assert in a single place on the code path, to avoid asserting the
same thing multiple times in a row, if possible. I don't think that the
frame version adds a similar assert, I'll look into adding it there.
> Similar question about register_readwriter::raw_write,
> register_reader::cooked_read, and register_readerwriter::cooked_write.
>
> The only other general comment is that while I appreciate that this
> doesn't
> require changing the tdep files very much (which is a good thing), it
> does
> have the odd result that the variable names in the gdbarch methods are
> still
> named 'regcache' even though they aren't regcache's anymore. It's
> perhaps
> not worth it, but it might be nice to do a followup pass eventually to
> rename 'register_reader *regcache' to 'reader' and something similar
> for
> the writer case? It seems tedious though, and I don't think it should
> be a
> requirement/blocker, just a suggestion for the future perhaps.
I agree. I'll look into doing this as a follow-up pass (it would just
add noise to this patch).
Thanks,
Simon
More information about the Gdb-patches
mailing list