diff options
author | Simon Marchi <simon.marchi@polymtl.ca> | 2021-09-30 22:38:29 -0400 |
---|---|---|
committer | Simon Marchi <simon.marchi@efficios.com> | 2021-10-07 11:03:54 -0400 |
commit | cd3f655cc7a55437a05aa8e7b1fcc9051b5fe404 (patch) | |
tree | 6ac5ac49884488ff6e8856d8d1ae7964a47866fe /gdb/gdbtypes.h | |
parent | 8baf3d07567f886be683aa26e3fc92346b604a93 (diff) | |
download | fsf-binutils-gdb-cd3f655cc7a55437a05aa8e7b1fcc9051b5fe404.zip fsf-binutils-gdb-cd3f655cc7a55437a05aa8e7b1fcc9051b5fe404.tar.gz fsf-binutils-gdb-cd3f655cc7a55437a05aa8e7b1fcc9051b5fe404.tar.bz2 |
gdb: add accessors for field (and call site) location
Add accessors for the various location values in struct field. This
lets us assert that when we get a location value of a certain kind (say,
bitpos), the field's location indeed contains a value of that kind.
Remove the SET_FIELD_* macros, instead use the new setters directly.
Update the FIELD_* macros used to access field locations to go through
the getters. They will be removed in a subsequent patch.
There are places where the FIELD_* macros are used on call_site_target
structures, because it contains members of the same name (loc_kind and
loc). For now, I have replicated the getters/setters in
call_site_target. But we could perhaps eventually factor them in a
"location" structure that can be used at both places.
Note that the field structure, being zero-initialized, defaults to a
bitpos location with value 0. While writing this patch, I tried to make
it default to an "unset" location, to catch places where we would miss
setting a field's location. However, I found that some places relied on
the default being "bitpos 0", so I left it as-is. This change could
always be done as follow-up work, making these places explicitly set the
"bitpos 0" location.
I found two issues to fix:
- I got some failures in the gdb.base/infcall-nested-structs-c++.exp
test. They were caused by two functions in amd64-tdep.c using
TYPE_FIELD_BITPOS before checking if the location is of the bitpos
kind, which they do indirectly through `field_is_static`. Simply
move getting the bitpos below the field_is_static call.
- I got a failure in gdb.xml/tdesc-regs.exp. It turns out that in
make_gdb_type_enum, we set enum field values using SET_FIELD_BITPOS,
and later access them through FIELD_ENUMVAL. Fix that by using
set_loc_enumval to set the value.
Change-Id: I53d3734916c46457576ba11dd77df4049d2fc1e8
Diffstat (limited to 'gdb/gdbtypes.h')
-rw-r--r-- | gdb/gdbtypes.h | 145 |
1 files changed, 118 insertions, 27 deletions
diff --git a/gdb/gdbtypes.h b/gdb/gdbtypes.h index 4e5b2f1..dc575c4 100644 --- a/gdb/gdbtypes.h +++ b/gdb/gdbtypes.h @@ -664,7 +664,74 @@ struct field m_name = name; } - union field_location loc; + /* Location getters / setters. */ + + field_loc_kind loc_kind () const + { + return m_loc_kind; + } + + LONGEST loc_bitpos () const + { + gdb_assert (m_loc_kind == FIELD_LOC_KIND_BITPOS); + return m_loc.bitpos; + } + + void set_loc_bitpos (LONGEST bitpos) + { + m_loc_kind = FIELD_LOC_KIND_BITPOS; + m_loc.bitpos = bitpos; + } + + LONGEST loc_enumval () const + { + gdb_assert (m_loc_kind == FIELD_LOC_KIND_ENUMVAL); + return m_loc.enumval; + } + + void set_loc_enumval (LONGEST enumval) + { + m_loc_kind = FIELD_LOC_KIND_ENUMVAL; + m_loc.enumval = enumval; + } + + CORE_ADDR loc_physaddr () const + { + gdb_assert (m_loc_kind == FIELD_LOC_KIND_PHYSADDR); + return m_loc.physaddr; + } + + void set_loc_physaddr (CORE_ADDR physaddr) + { + m_loc_kind = FIELD_LOC_KIND_PHYSADDR; + m_loc.physaddr = physaddr; + } + + const char *loc_physname () const + { + gdb_assert (m_loc_kind == FIELD_LOC_KIND_PHYSNAME); + return m_loc.physname; + } + + void set_loc_physname (const char *physname) + { + m_loc_kind = FIELD_LOC_KIND_PHYSNAME; + m_loc.physname = physname; + } + + dwarf2_locexpr_baton *loc_dwarf_block () const + { + gdb_assert (m_loc_kind == FIELD_LOC_KIND_DWARF_BLOCK); + return m_loc.dwarf_block; + } + + void set_loc_dwarf_block (dwarf2_locexpr_baton *dwarf_block) + { + m_loc_kind = FIELD_LOC_KIND_DWARF_BLOCK; + m_loc.dwarf_block = dwarf_block; + } + + union field_location m_loc; /* * For a function or member type, this is 1 if the argument is marked artificial. Artificial arguments should not be shown @@ -675,7 +742,7 @@ struct field /* * Discriminant for union field_location. */ - ENUM_BITFIELD(field_loc_kind) loc_kind : 3; + ENUM_BITFIELD(field_loc_kind) m_loc_kind : 3; /* * Size of this field, in bits, or zero if not packed. If non-zero in an array type, indicates the element size in @@ -1742,11 +1809,52 @@ enum call_site_parameter_kind struct call_site_target { - union field_location loc; + field_loc_kind loc_kind () const + { + return m_loc_kind; + } + + CORE_ADDR loc_physaddr () const + { + gdb_assert (m_loc_kind == FIELD_LOC_KIND_PHYSADDR); + return m_loc.physaddr; + } + + void set_loc_physaddr (CORE_ADDR physaddr) + { + m_loc_kind = FIELD_LOC_KIND_PHYSADDR; + m_loc.physaddr = physaddr; + } + + const char *loc_physname () const + { + gdb_assert (m_loc_kind == FIELD_LOC_KIND_PHYSNAME); + return m_loc.physname; + } + + void set_loc_physname (const char *physname) + { + m_loc_kind = FIELD_LOC_KIND_PHYSNAME; + m_loc.physname = physname; + } + + dwarf2_locexpr_baton *loc_dwarf_block () const + { + gdb_assert (m_loc_kind == FIELD_LOC_KIND_DWARF_BLOCK); + return m_loc.dwarf_block; + } + + void set_loc_dwarf_block (dwarf2_locexpr_baton *dwarf_block) + { + m_loc_kind = FIELD_LOC_KIND_DWARF_BLOCK; + m_loc.dwarf_block = dwarf_block; + } + + union field_location m_loc; /* * Discriminant for union field_location. */ - ENUM_BITFIELD(field_loc_kind) loc_kind : 3; + ENUM_BITFIELD(field_loc_kind) m_loc_kind : 3; }; union call_site_parameter_u @@ -2016,29 +2124,12 @@ extern void set_type_vptr_basetype (struct type *, struct type *); (TYPE_CPLUS_SPECIFIC(thistype)->virtual_field_bits == NULL ? 0 \ : B_TST(TYPE_CPLUS_SPECIFIC(thistype)->virtual_field_bits, (index))) -#define FIELD_LOC_KIND(thisfld) ((thisfld).loc_kind) -#define FIELD_BITPOS_LVAL(thisfld) ((thisfld).loc.bitpos) -#define FIELD_BITPOS(thisfld) (FIELD_BITPOS_LVAL (thisfld) + 0) -#define FIELD_ENUMVAL_LVAL(thisfld) ((thisfld).loc.enumval) -#define FIELD_ENUMVAL(thisfld) (FIELD_ENUMVAL_LVAL (thisfld) + 0) -#define FIELD_STATIC_PHYSNAME(thisfld) ((thisfld).loc.physname) -#define FIELD_STATIC_PHYSADDR(thisfld) ((thisfld).loc.physaddr) -#define FIELD_DWARF_BLOCK(thisfld) ((thisfld).loc.dwarf_block) -#define SET_FIELD_BITPOS(thisfld, bitpos) \ - (FIELD_LOC_KIND (thisfld) = FIELD_LOC_KIND_BITPOS, \ - FIELD_BITPOS_LVAL (thisfld) = (bitpos)) -#define SET_FIELD_ENUMVAL(thisfld, enumval) \ - (FIELD_LOC_KIND (thisfld) = FIELD_LOC_KIND_ENUMVAL, \ - FIELD_ENUMVAL_LVAL (thisfld) = (enumval)) -#define SET_FIELD_PHYSNAME(thisfld, name) \ - (FIELD_LOC_KIND (thisfld) = FIELD_LOC_KIND_PHYSNAME, \ - FIELD_STATIC_PHYSNAME (thisfld) = (name)) -#define SET_FIELD_PHYSADDR(thisfld, addr) \ - (FIELD_LOC_KIND (thisfld) = FIELD_LOC_KIND_PHYSADDR, \ - FIELD_STATIC_PHYSADDR (thisfld) = (addr)) -#define SET_FIELD_DWARF_BLOCK(thisfld, addr) \ - (FIELD_LOC_KIND (thisfld) = FIELD_LOC_KIND_DWARF_BLOCK, \ - FIELD_DWARF_BLOCK (thisfld) = (addr)) +#define FIELD_LOC_KIND(thisfld) ((thisfld).loc_kind ()) +#define FIELD_BITPOS(thisfld) ((thisfld).loc_bitpos ()) +#define FIELD_ENUMVAL(thisfld) ((thisfld).loc_enumval ()) +#define FIELD_STATIC_PHYSNAME(thisfld) ((thisfld).loc_physname ()) +#define FIELD_STATIC_PHYSADDR(thisfld) ((thisfld).loc_physaddr ()) +#define FIELD_DWARF_BLOCK(thisfld) ((thisfld).loc_dwarf_block ()) #define FIELD_ARTIFICIAL(thisfld) ((thisfld).artificial) #define FIELD_BITSIZE(thisfld) ((thisfld).bitsize) |