This is the mail archive of the
gdb@sources.redhat.com
mailing list for the GDB project.
read_register_byte can't work with pseudo-reg model
- From: Richard Earnshaw <rearnsha at arm dot com>
- To: gdb at sources dot redhat dot com
- Cc: Richard dot Earnshaw at arm dot com
- Date: Wed, 15 May 2002 17:52:36 +0100
- Subject: read_register_byte can't work with pseudo-reg model
- Organization: ARM Ltd.
- Reply-to: Richard dot Earnshaw at arm dot com
Given the following code in read_register_byte:
reg_start = REGISTER_BYTE (regnum);
reg_len = REGISTER_RAW_SIZE (regnum);
reg_end = reg_start + reg_len;
if (reg_end <= in_start || in_end <= reg_start)
/* The range the user wants to read doesn't overlap with regnum. */
continue;
if (REGISTER_NAME (regnum) != NULL && *REGISTER_NAME (regnum) !=
'\0')
/* Force the cache to fetch the entire register. */
read_register_gen (regnum, reg_buf);
else
/* Legacy note: even though this register is ``invalid'' we
still need to return something. It would appear that some
code relies on apparent gaps in the register array also
being returned. */
/* FIXME: cagney/2001-08-18: This is just silly. It defeats
the entire register read/write flow of control. Must
resist temptation to return 0xdeadbeef. */
memcpy (reg_buf, registers + reg_start, reg_len);
Then the new model of having all named registers be pseudos will never
re-read the registers, because all registers with an entry in registers[]
will not have a name.
Shouldn't the "REGISTER_NAME" check be a direct check for
register_cached(regno) == 0
That would mean that we could change the above to be something like
reg_start = REGISTER_BYTE (regnum);
reg_len = REGISTER_RAW_SIZE (regnum);
reg_end = reg_start + reg_len;
if (reg_end <= in_start || in_end <= reg_start)
/* The range the user wants to read doesn't overlap with regnum. */
continue;
if (register_cached (regnum) == 0)
/* Force the cache to fetch the entire register. */
legacy_read_register_gen (regnum, reg_buf);
else
/* Legacy note: even though this register is ``invalid'' we
still need to return something. It would appear that some
code relies on apparent gaps in the register array also
being returned. */
/* FIXME: cagney/2001-08-18: This is just silly. It defeats
the entire register read/write flow of control. Must
resist temptation to return 0xdeadbeef. */
memcpy (reg_buf, registers + reg_start, reg_len);
Though I'm still not sure what we should do for a pseudo with no entry in
the cache.
R.