forked from Imagelibrary/binutils-gdb
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:
committed by
Simon Marchi
parent
8baf3d0756
commit
cd3f655cc7
145
gdb/gdbtypes.h
145
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)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user