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
This commit is contained in:
Simon Marchi
2021-09-30 22:38:29 -04:00
committed by Simon Marchi
parent 8baf3d0756
commit cd3f655cc7
14 changed files with 189 additions and 105 deletions

View File

@@ -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)