diff options
author | Andrew Burgess <aburgess@redhat.com> | 2022-08-28 21:19:50 +0100 |
---|---|---|
committer | Andrew Burgess <aburgess@redhat.com> | 2022-10-02 14:21:24 +0100 |
commit | 89e601ac3a2e29da46275a3dcb83855e662fb0c9 (patch) | |
tree | 4dca0b4e426cb28ca0ed6e81e8d5c0cee45da347 | |
parent | bd93abe8d5513ceecc10a91452a85c803cac895b (diff) | |
download | binutils-89e601ac3a2e29da46275a3dcb83855e662fb0c9.zip binutils-89e601ac3a2e29da46275a3dcb83855e662fb0c9.tar.gz binutils-89e601ac3a2e29da46275a3dcb83855e662fb0c9.tar.bz2 |
gdb/gdbarch: add a comment to gdbarch_register_name
After the previous commit, this commit sets out to formalise the API
for gdbarch_register_name. Not every architecture is actually in
compliance with the API I set out here, but I believe that most are.
I think architectures that don't comply with the API laid out here
will fail the gdb.base/completion.exp test.
The claims in the comment are I feel, best demonstrated with the
asserts in this code:
const char *
gdbarch_register_name (struct gdbarch *gdbarch, int regnr)
{
gdb_assert (regnr >= 0);
gdb_assert (regnr < gdbarch_num_cooked_regs (gdbarch));
const char *name = gdbarch->register_name (gdbarch, regnr);
gdb_assert (name != nullptr);
return name;
}
Like I said, I don't believe every architecture follows these rules
right now, which is why I'm not actually adding any asserts. Instead,
this commit adds a comment to gdbarch_register_name, this comment is
where I'd like to get to, rather than where we are right now.
Subsequent commits will fix all targets to be in compliance with this
comment, and will even add the asserts shown above to
gdbarch_register_name.
-rw-r--r-- | gdb/gdbarch-components.py | 7 | ||||
-rw-r--r-- | gdb/gdbarch-gen.h | 6 |
2 files changed, 13 insertions, 0 deletions
diff --git a/gdb/gdbarch-components.py b/gdb/gdbarch-components.py index 6374240..9e0a3e9 100644 --- a/gdb/gdbarch-components.py +++ b/gdb/gdbarch-components.py @@ -558,6 +558,13 @@ Return -1 for bad REGNUM. Note: Several targets get this wrong. ) Method( + comment=""" +Return the name of register REGNR for the specified architecture. +REGNR can be any value greater than, or equal to zero, and less than +'gdbarch_num_cooked_regs (GDBARCH)'. If REGNR is not supported for +GDBARCH, then this function will return an empty string, this function +should never return nullptr. +""", type="const char *", name="register_name", params=[("int", "regnr")], diff --git a/gdb/gdbarch-gen.h b/gdb/gdbarch-gen.h index 706dbb3..383d84f 100644 --- a/gdb/gdbarch-gen.h +++ b/gdb/gdbarch-gen.h @@ -288,6 +288,12 @@ typedef int (gdbarch_dwarf2_reg_to_regnum_ftype) (struct gdbarch *gdbarch, int d extern int gdbarch_dwarf2_reg_to_regnum (struct gdbarch *gdbarch, int dwarf2_regnr); extern void set_gdbarch_dwarf2_reg_to_regnum (struct gdbarch *gdbarch, gdbarch_dwarf2_reg_to_regnum_ftype *dwarf2_reg_to_regnum); +/* Return the name of register REGNR for the specified architecture. + REGNR can be any value greater than, or equal to zero, and less than + 'gdbarch_num_cooked_regs (GDBARCH)'. If REGNR is not supported for + GDBARCH, then this function will return an empty string, this function + should never return nullptr. */ + typedef const char * (gdbarch_register_name_ftype) (struct gdbarch *gdbarch, int regnr); extern const char * gdbarch_register_name (struct gdbarch *gdbarch, int regnr); extern void set_gdbarch_register_name (struct gdbarch *gdbarch, gdbarch_register_name_ftype *register_name); |