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

@ -7503,7 +7503,7 @@ ada_template_to_fixed_record_type_1 (struct type *type,
{ {
off = align_up (off, field_alignment (type, f)) off = align_up (off, field_alignment (type, f))
+ TYPE_FIELD_BITPOS (type, f); + TYPE_FIELD_BITPOS (type, f);
SET_FIELD_BITPOS (rtype->field (f), off); rtype->field (f).set_loc_bitpos (off);
TYPE_FIELD_BITSIZE (rtype, f) = 0; TYPE_FIELD_BITSIZE (rtype, f) = 0;
if (ada_is_variant_part (type, f)) if (ada_is_variant_part (type, f))

View file

@ -553,7 +553,6 @@ amd64_has_unaligned_fields (struct type *type)
for (int i = 0; i < type->num_fields (); i++) for (int i = 0; i < type->num_fields (); i++)
{ {
struct type *subtype = check_typedef (type->field (i).type ()); struct type *subtype = check_typedef (type->field (i).type ());
int bitpos = TYPE_FIELD_BITPOS (type, i);
/* Ignore static fields, empty fields (for example nested /* Ignore static fields, empty fields (for example nested
empty structures), and bitfields (these are handled by empty structures), and bitfields (these are handled by
@ -564,6 +563,8 @@ amd64_has_unaligned_fields (struct type *type)
|| TYPE_FIELD_PACKED (type, i)) || TYPE_FIELD_PACKED (type, i))
continue; continue;
int bitpos = TYPE_FIELD_BITPOS (type, i);
if (bitpos % 8 != 0) if (bitpos % 8 != 0)
return true; return true;
@ -592,21 +593,21 @@ amd64_classify_aggregate_field (struct type *type, int i,
unsigned int bitoffset) unsigned int bitoffset)
{ {
struct type *subtype = check_typedef (type->field (i).type ()); struct type *subtype = check_typedef (type->field (i).type ());
int bitpos = bitoffset + TYPE_FIELD_BITPOS (type, i);
int pos = bitpos / 64;
enum amd64_reg_class subclass[2]; enum amd64_reg_class subclass[2];
int bitsize = TYPE_FIELD_BITSIZE (type, i); int bitsize = TYPE_FIELD_BITSIZE (type, i);
int endpos;
if (bitsize == 0) if (bitsize == 0)
bitsize = TYPE_LENGTH (subtype) * 8; bitsize = TYPE_LENGTH (subtype) * 8;
endpos = (bitpos + bitsize - 1) / 64;
/* Ignore static fields, or empty fields, for example nested /* Ignore static fields, or empty fields, for example nested
empty structures.*/ empty structures.*/
if (field_is_static (&type->field (i)) || bitsize == 0) if (field_is_static (&type->field (i)) || bitsize == 0)
return; return;
int bitpos = bitoffset + TYPE_FIELD_BITPOS (type, i);
int pos = bitpos / 64;
int endpos = (bitpos + bitsize - 1) / 64;
if (subtype->code () == TYPE_CODE_STRUCT if (subtype->code () == TYPE_CODE_STRUCT
|| subtype->code () == TYPE_CODE_UNION) || subtype->code () == TYPE_CODE_UNION)
{ {

View file

@ -2012,7 +2012,7 @@ coff_read_struct_type (int index, int length, int lastsym,
name)); name));
list->field.set_type (decode_type (ms, ms->c_type, &sub_aux, list->field.set_type (decode_type (ms, ms->c_type, &sub_aux,
objfile)); objfile));
SET_FIELD_BITPOS (list->field, 8 * ms->c_value); list->field.set_loc_bitpos (8 * ms->c_value);
FIELD_BITSIZE (list->field) = 0; FIELD_BITSIZE (list->field) = 0;
nfields++; nfields++;
break; break;
@ -2029,7 +2029,7 @@ coff_read_struct_type (int index, int length, int lastsym,
name)); name));
list->field.set_type (decode_type (ms, ms->c_type, &sub_aux, list->field.set_type (decode_type (ms, ms->c_type, &sub_aux,
objfile)); objfile));
SET_FIELD_BITPOS (list->field, ms->c_value); list->field.set_loc_bitpos (ms->c_value);
FIELD_BITSIZE (list->field) = sub_aux.x_sym.x_misc.x_lnsz.x_size; FIELD_BITSIZE (list->field) = sub_aux.x_sym.x_misc.x_lnsz.x_size;
nfields++; nfields++;
break; break;
@ -2145,7 +2145,7 @@ coff_read_enum_type (int index, int length, int lastsym,
SYMBOL_TYPE (xsym) = type; SYMBOL_TYPE (xsym) = type;
type->field (n).set_name (xsym->linkage_name ()); type->field (n).set_name (xsym->linkage_name ());
SET_FIELD_ENUMVAL (type->field (n), SYMBOL_VALUE (xsym)); type->field (n).set_loc_enumval (SYMBOL_VALUE (xsym));
if (SYMBOL_VALUE (xsym) < 0) if (SYMBOL_VALUE (xsym) < 0)
unsigned_enum = 0; unsigned_enum = 0;
TYPE_FIELD_BITSIZE (type, n) = 0; TYPE_FIELD_BITSIZE (type, n) = 0;

View file

@ -735,13 +735,13 @@ test_print_fields (gdbarch *arch)
if (gdbarch_byte_order (arch) == BFD_ENDIAN_LITTLE) if (gdbarch_byte_order (arch) == BFD_ENDIAN_LITTLE)
{ {
f = append_composite_type_field_raw (the_struct, "A", bool_type); f = append_composite_type_field_raw (the_struct, "A", bool_type);
SET_FIELD_BITPOS (*f, 1); f->set_loc_bitpos (1);
FIELD_BITSIZE (*f) = 1; FIELD_BITSIZE (*f) = 1;
f = append_composite_type_field_raw (the_struct, "B", uint8_type); f = append_composite_type_field_raw (the_struct, "B", uint8_type);
SET_FIELD_BITPOS (*f, 3); f->set_loc_bitpos (3);
FIELD_BITSIZE (*f) = 3; FIELD_BITSIZE (*f) = 3;
f = append_composite_type_field_raw (the_struct, "C", bool_type); f = append_composite_type_field_raw (the_struct, "C", bool_type);
SET_FIELD_BITPOS (*f, 7); f->set_loc_bitpos (7);
FIELD_BITSIZE (*f) = 1; FIELD_BITSIZE (*f) = 1;
} }
/* According to the logic commented in "make_gdb_type_struct ()" of /* According to the logic commented in "make_gdb_type_struct ()" of
@ -750,13 +750,13 @@ test_print_fields (gdbarch *arch)
else else
{ {
f = append_composite_type_field_raw (the_struct, "A", bool_type); f = append_composite_type_field_raw (the_struct, "A", bool_type);
SET_FIELD_BITPOS (*f, 30); f->set_loc_bitpos (30);
FIELD_BITSIZE (*f) = 1; FIELD_BITSIZE (*f) = 1;
f = append_composite_type_field_raw (the_struct, "B", uint8_type); f = append_composite_type_field_raw (the_struct, "B", uint8_type);
SET_FIELD_BITPOS (*f, 26); f->set_loc_bitpos (26);
FIELD_BITSIZE (*f) = 3; FIELD_BITSIZE (*f) = 3;
f = append_composite_type_field_raw (the_struct, "C", bool_type); f = append_composite_type_field_raw (the_struct, "C", bool_type);
SET_FIELD_BITPOS (*f, 24); f->set_loc_bitpos (24);
FIELD_BITSIZE (*f) = 1; FIELD_BITSIZE (*f) = 1;
} }

View file

@ -418,7 +418,7 @@ ctf_add_member_cb (const char *name,
process_struct_members (ccp, tid, t); process_struct_members (ccp, tid, t);
fp->set_type (t); fp->set_type (t);
SET_FIELD_BITPOS (*fp, offset / TARGET_CHAR_BIT); fp->set_loc_bitpos (offset / TARGET_CHAR_BIT);
FIELD_BITSIZE (*fp) = get_bitsize (ccp->fp, tid, kind); FIELD_BITSIZE (*fp) = get_bitsize (ccp->fp, tid, kind);
fip->fields.emplace_back (new_field); fip->fields.emplace_back (new_field);
@ -440,7 +440,7 @@ ctf_add_enum_member_cb (const char *name, int enum_value, void *arg)
fp = &new_field.field; fp = &new_field.field;
fp->set_name (name); fp->set_name (name);
fp->set_type (nullptr); fp->set_type (nullptr);
SET_FIELD_ENUMVAL (*fp, enum_value); fp->set_loc_enumval (enum_value);
FIELD_BITSIZE (*fp) = 0; FIELD_BITSIZE (*fp) = 0;
if (name != nullptr) if (name != nullptr)

View file

@ -9093,7 +9093,7 @@ quirk_rust_enum (struct type *type, struct objfile *objfile)
type->field (0).set_type (field_type); type->field (0).set_type (field_type);
TYPE_FIELD_ARTIFICIAL (type, 0) = 1; TYPE_FIELD_ARTIFICIAL (type, 0) = 1;
type->field (0).set_name ("<<discriminant>>"); type->field (0).set_name ("<<discriminant>>");
SET_FIELD_BITPOS (type->field (0), bit_offset); type->field (0).set_loc_bitpos (bit_offset);
/* The order of fields doesn't really matter, so put the real /* The order of fields doesn't really matter, so put the real
field at index 1 and the data-less field at index 2. */ field at index 1 and the data-less field at index 2. */
@ -9113,7 +9113,7 @@ quirk_rust_enum (struct type *type, struct objfile *objfile)
/* NAME points into the original discriminant name, which /* NAME points into the original discriminant name, which
already has the correct lifetime. */ already has the correct lifetime. */
type->field (2).set_name (name); type->field (2).set_name (name);
SET_FIELD_BITPOS (type->field (2), 0); type->field (2).set_loc_bitpos (0);
/* Indicate that this is a variant type. */ /* Indicate that this is a variant type. */
static discriminant_range ranges[1] = { { 0, 0 } }; static discriminant_range ranges[1] = { { 0, 0 } };
@ -13469,7 +13469,8 @@ read_call_site_scope (struct die_info *die, struct dwarf2_cu *cu)
/* This was a pre-DWARF-5 GNU extension alias for DW_AT_call_origin. */ /* This was a pre-DWARF-5 GNU extension alias for DW_AT_call_origin. */
attr = dwarf2_attr (die, DW_AT_abstract_origin, cu); attr = dwarf2_attr (die, DW_AT_abstract_origin, cu);
} }
SET_FIELD_DWARF_BLOCK (call_site->target, NULL);
call_site->target.set_loc_dwarf_block (nullptr);
if (!attr || (attr->form_is_block () && attr->as_block ()->size == 0)) if (!attr || (attr->form_is_block () && attr->as_block ()->size == 0))
/* Keep NULL DWARF_BLOCK. */; /* Keep NULL DWARF_BLOCK. */;
else if (attr->form_is_block ()) else if (attr->form_is_block ())
@ -13483,7 +13484,7 @@ read_call_site_scope (struct die_info *die, struct dwarf2_cu *cu)
dlbaton->per_objfile = per_objfile; dlbaton->per_objfile = per_objfile;
dlbaton->per_cu = cu->per_cu; dlbaton->per_cu = cu->per_cu;
SET_FIELD_DWARF_BLOCK (call_site->target, dlbaton); call_site->target.set_loc_dwarf_block (dlbaton);
} }
else if (attr->form_is_ref ()) else if (attr->form_is_ref ())
{ {
@ -13505,7 +13506,7 @@ read_call_site_scope (struct die_info *die, struct dwarf2_cu *cu)
"physname, for referencing DIE %s [in module %s]"), "physname, for referencing DIE %s [in module %s]"),
sect_offset_str (die->sect_off), objfile_name (objfile)); sect_offset_str (die->sect_off), objfile_name (objfile));
else else
SET_FIELD_PHYSNAME (call_site->target, target_physname); call_site->target.set_loc_physname (target_physname);
} }
else else
{ {
@ -13521,7 +13522,7 @@ read_call_site_scope (struct die_info *die, struct dwarf2_cu *cu)
{ {
lowpc = (gdbarch_adjust_dwarf2_addr (gdbarch, lowpc + baseaddr) lowpc = (gdbarch_adjust_dwarf2_addr (gdbarch, lowpc + baseaddr)
- baseaddr); - baseaddr);
SET_FIELD_PHYSADDR (call_site->target, lowpc); call_site->target.set_loc_physaddr (lowpc);
} }
} }
} }
@ -14483,7 +14484,7 @@ handle_member_location (struct die_info *die, struct dwarf2_cu *cu,
if (attr->form_is_constant ()) if (attr->form_is_constant ())
{ {
LONGEST offset = attr->constant_value (0); LONGEST offset = attr->constant_value (0);
SET_FIELD_BITPOS (*field, offset * bits_per_byte); field->set_loc_bitpos (offset * bits_per_byte);
} }
else if (attr->form_is_section_offset ()) else if (attr->form_is_section_offset ())
dwarf2_complex_location_expr_complaint (); dwarf2_complex_location_expr_complaint ();
@ -14492,7 +14493,7 @@ handle_member_location (struct die_info *die, struct dwarf2_cu *cu,
bool handled; bool handled;
CORE_ADDR offset = decode_locdesc (attr->as_block (), cu, &handled); CORE_ADDR offset = decode_locdesc (attr->as_block (), cu, &handled);
if (handled) if (handled)
SET_FIELD_BITPOS (*field, offset * bits_per_byte); field->set_loc_bitpos (offset * bits_per_byte);
else else
{ {
dwarf2_per_objfile *per_objfile = cu->per_objfile; dwarf2_per_objfile *per_objfile = cu->per_objfile;
@ -14509,7 +14510,7 @@ handle_member_location (struct die_info *die, struct dwarf2_cu *cu,
dlbaton->per_objfile = per_objfile; dlbaton->per_objfile = per_objfile;
dlbaton->per_cu = cu->per_cu; dlbaton->per_cu = cu->per_cu;
SET_FIELD_DWARF_BLOCK (*field, dlbaton); field->set_loc_dwarf_block (dlbaton);
} }
} }
else else
@ -14519,7 +14520,7 @@ handle_member_location (struct die_info *die, struct dwarf2_cu *cu,
{ {
attr = dwarf2_attr (die, DW_AT_data_bit_offset, cu); attr = dwarf2_attr (die, DW_AT_data_bit_offset, cu);
if (attr != nullptr) if (attr != nullptr)
SET_FIELD_BITPOS (*field, attr->constant_value (0)); field->set_loc_bitpos (attr->constant_value (0));
} }
} }
@ -14568,7 +14569,7 @@ dwarf2_add_field (struct field_info *fip, struct die_info *die,
/* Get type of field. */ /* Get type of field. */
fp->set_type (die_type (die, cu)); fp->set_type (die_type (die, cu));
SET_FIELD_BITPOS (*fp, 0); fp->set_loc_bitpos (0);
/* Get bit size of field (zero if none). */ /* Get bit size of field (zero if none). */
attr = dwarf2_attr (die, DW_AT_bit_size, cu); attr = dwarf2_attr (die, DW_AT_bit_size, cu);
@ -14593,8 +14594,7 @@ dwarf2_add_field (struct field_info *fip, struct die_info *die,
anonymous object to the MSB of the field. We don't anonymous object to the MSB of the field. We don't
have to do anything special since we don't need to have to do anything special since we don't need to
know the size of the anonymous object. */ know the size of the anonymous object. */
SET_FIELD_BITPOS (*fp, (FIELD_BITPOS (*fp) fp->set_loc_bitpos ((FIELD_BITPOS (*fp) + attr->constant_value (0)));
+ attr->constant_value (0)));
} }
else else
{ {
@ -14623,10 +14623,9 @@ dwarf2_add_field (struct field_info *fip, struct die_info *die,
bit field. */ bit field. */
anonymous_size = TYPE_LENGTH (fp->type ()); anonymous_size = TYPE_LENGTH (fp->type ());
} }
SET_FIELD_BITPOS (*fp, fp->set_loc_bitpos (FIELD_BITPOS (*fp)
(FIELD_BITPOS (*fp) + anonymous_size * bits_per_byte
+ anonymous_size * bits_per_byte - bit_offset - FIELD_BITSIZE (*fp));
- bit_offset - FIELD_BITSIZE (*fp)));
} }
} }
@ -14682,7 +14681,7 @@ dwarf2_add_field (struct field_info *fip, struct die_info *die,
/* The name is already allocated along with this objfile, so we don't /* The name is already allocated along with this objfile, so we don't
need to duplicate it for the type. */ need to duplicate it for the type. */
SET_FIELD_PHYSNAME (*fp, physname ? physname : ""); fp->set_loc_physname (physname ? physname : "");
fp->set_type (die_type (die, cu)); fp->set_type (die_type (die, cu));
fp->set_name (fieldname); fp->set_name (fieldname);
} }
@ -16142,7 +16141,7 @@ update_enumeration_type_from_children (struct die_info *die,
fields.emplace_back (); fields.emplace_back ();
struct field &field = fields.back (); struct field &field = fields.back ();
field.set_name (dwarf2_physname (name, child_die, cu)); field.set_name (dwarf2_physname (name, child_die, cu));
SET_FIELD_ENUMVAL (field, value); field.set_loc_enumval (value);
} }
if (!fields.empty ()) if (!fields.empty ())
@ -16416,7 +16415,7 @@ recognize_bound_expression (struct die_info *die, enum dwarf_attribute name,
else else
return false; return false;
SET_FIELD_BITPOS (*field, 8 * offset); field->set_loc_bitpos (8 * offset);
if (size != TYPE_LENGTH (field->type ())) if (size != TYPE_LENGTH (field->type ()))
FIELD_BITSIZE (*field) = 8 * size; FIELD_BITSIZE (*field) = 8 * size;
@ -16564,7 +16563,7 @@ quirk_ada_thick_pointer (struct die_info *die, struct dwarf2_cu *cu,
result->field (1).set_name ("P_BOUNDS"); result->field (1).set_name ("P_BOUNDS");
result->field (1).set_type (lookup_pointer_type (bounds)); result->field (1).set_type (lookup_pointer_type (bounds));
SET_FIELD_BITPOS (result->field (1), 8 * bounds_offset); result->field (1).set_loc_bitpos (8 * bounds_offset);
result->set_name (type->name ()); result->set_name (type->name ());
TYPE_LENGTH (result) = (TYPE_LENGTH (result->field (0).type ()) TYPE_LENGTH (result) = (TYPE_LENGTH (result->field (0).type ())

View file

@ -2599,8 +2599,8 @@ resolve_dynamic_struct (struct type *type,
CORE_ADDR addr; CORE_ADDR addr;
if (dwarf2_evaluate_property (&prop, nullptr, addr_stack, &addr, if (dwarf2_evaluate_property (&prop, nullptr, addr_stack, &addr,
true)) true))
SET_FIELD_BITPOS (resolved_type->field (i), resolved_type->field (i).set_loc_bitpos
TARGET_CHAR_BIT * (addr - addr_stack->addr)); (TARGET_CHAR_BIT * (addr - addr_stack->addr));
} }
/* As we know this field is not a static field, the field's /* As we know this field is not a static field, the field's
@ -5561,25 +5561,22 @@ copy_type_recursive (struct objfile *objfile,
switch (TYPE_FIELD_LOC_KIND (type, i)) switch (TYPE_FIELD_LOC_KIND (type, i))
{ {
case FIELD_LOC_KIND_BITPOS: case FIELD_LOC_KIND_BITPOS:
SET_FIELD_BITPOS (new_type->field (i), new_type->field (i).set_loc_bitpos (TYPE_FIELD_BITPOS (type, i));
TYPE_FIELD_BITPOS (type, i));
break; break;
case FIELD_LOC_KIND_ENUMVAL: case FIELD_LOC_KIND_ENUMVAL:
SET_FIELD_ENUMVAL (new_type->field (i), new_type->field (i).set_loc_enumval (TYPE_FIELD_ENUMVAL (type, i));
TYPE_FIELD_ENUMVAL (type, i));
break; break;
case FIELD_LOC_KIND_PHYSADDR: case FIELD_LOC_KIND_PHYSADDR:
SET_FIELD_PHYSADDR (new_type->field (i), new_type->field (i).set_loc_physaddr
TYPE_FIELD_STATIC_PHYSADDR (type, i)); (TYPE_FIELD_STATIC_PHYSADDR (type, i));
break; break;
case FIELD_LOC_KIND_PHYSNAME: case FIELD_LOC_KIND_PHYSNAME:
SET_FIELD_PHYSNAME (new_type->field (i), new_type->field (i).set_loc_physname
xstrdup (TYPE_FIELD_STATIC_PHYSNAME (type, (xstrdup (TYPE_FIELD_STATIC_PHYSNAME (type, i)));
i)));
break; break;
case FIELD_LOC_KIND_DWARF_BLOCK: case FIELD_LOC_KIND_DWARF_BLOCK:
SET_FIELD_DWARF_BLOCK (new_type->field (i), new_type->field (i).set_loc_dwarf_block
TYPE_FIELD_DWARF_BLOCK (type, i)); (TYPE_FIELD_DWARF_BLOCK (type, i));
break; break;
default: default:
internal_error (__FILE__, __LINE__, internal_error (__FILE__, __LINE__,
@ -5846,7 +5843,7 @@ append_flags_type_field (struct type *type, int start_bitpos, int nr_bits,
type->field (field_nr).set_name (xstrdup (name)); type->field (field_nr).set_name (xstrdup (name));
type->field (field_nr).set_type (field_type); type->field (field_nr).set_type (field_type);
SET_FIELD_BITPOS (type->field (field_nr), start_bitpos); type->field (field_nr).set_loc_bitpos (start_bitpos);
TYPE_FIELD_BITSIZE (type, field_nr) = nr_bits; TYPE_FIELD_BITSIZE (type, field_nr) = nr_bits;
type->set_num_fields (type->num_fields () + 1); type->set_num_fields (type->num_fields () + 1);
} }
@ -5918,10 +5915,8 @@ append_composite_type_field_aligned (struct type *t, const char *name,
TYPE_LENGTH (t) = TYPE_LENGTH (t) + TYPE_LENGTH (field); TYPE_LENGTH (t) = TYPE_LENGTH (t) + TYPE_LENGTH (field);
if (t->num_fields () > 1) if (t->num_fields () > 1)
{ {
SET_FIELD_BITPOS (f[0], f->set_loc_bitpos
(FIELD_BITPOS (f[-1]) ((FIELD_BITPOS (f[-1]) + (TYPE_LENGTH (f[-1].type ()) * TARGET_CHAR_BIT)));
+ (TYPE_LENGTH (f[-1].type ())
* TARGET_CHAR_BIT)));
if (alignment) if (alignment)
{ {
@ -5932,7 +5927,7 @@ append_composite_type_field_aligned (struct type *t, const char *name,
if (left) if (left)
{ {
SET_FIELD_BITPOS (f[0], FIELD_BITPOS (f[0]) + (alignment - left)); f->set_loc_bitpos (FIELD_BITPOS (f[0]) + (alignment - left));
TYPE_LENGTH (t) += (alignment - left) / TARGET_CHAR_BIT; TYPE_LENGTH (t) += (alignment - left) / TARGET_CHAR_BIT;
} }
} }

View file

@ -664,7 +664,74 @@ struct field
m_name = name; 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 /* * For a function or member type, this is 1 if the argument is
marked artificial. Artificial arguments should not be shown marked artificial. Artificial arguments should not be shown
@ -675,7 +742,7 @@ struct field
/* * Discriminant for union field_location. */ /* * 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. /* * Size of this field, in bits, or zero if not packed.
If non-zero in an array type, indicates the element size in 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 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. */ /* * 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 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 \ (TYPE_CPLUS_SPECIFIC(thistype)->virtual_field_bits == NULL ? 0 \
: B_TST(TYPE_CPLUS_SPECIFIC(thistype)->virtual_field_bits, (index))) : B_TST(TYPE_CPLUS_SPECIFIC(thistype)->virtual_field_bits, (index)))
#define FIELD_LOC_KIND(thisfld) ((thisfld).loc_kind) #define FIELD_LOC_KIND(thisfld) ((thisfld).loc_kind ())
#define FIELD_BITPOS_LVAL(thisfld) ((thisfld).loc.bitpos) #define FIELD_BITPOS(thisfld) ((thisfld).loc_bitpos ())
#define FIELD_BITPOS(thisfld) (FIELD_BITPOS_LVAL (thisfld) + 0) #define FIELD_ENUMVAL(thisfld) ((thisfld).loc_enumval ())
#define FIELD_ENUMVAL_LVAL(thisfld) ((thisfld).loc.enumval) #define FIELD_STATIC_PHYSNAME(thisfld) ((thisfld).loc_physname ())
#define FIELD_ENUMVAL(thisfld) (FIELD_ENUMVAL_LVAL (thisfld) + 0) #define FIELD_STATIC_PHYSADDR(thisfld) ((thisfld).loc_physaddr ())
#define FIELD_STATIC_PHYSNAME(thisfld) ((thisfld).loc.physname) #define FIELD_DWARF_BLOCK(thisfld) ((thisfld).loc_dwarf_block ())
#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_ARTIFICIAL(thisfld) ((thisfld).artificial) #define FIELD_ARTIFICIAL(thisfld) ((thisfld).artificial)
#define FIELD_BITSIZE(thisfld) ((thisfld).bitsize) #define FIELD_BITSIZE(thisfld) ((thisfld).bitsize)

View file

@ -137,28 +137,28 @@ build_gdb_vtable_type (struct gdbarch *arch)
/* ptrdiff_t vcall_and_vbase_offsets[0]; */ /* ptrdiff_t vcall_and_vbase_offsets[0]; */
field->set_name ("vcall_and_vbase_offsets"); field->set_name ("vcall_and_vbase_offsets");
field->set_type (lookup_array_range_type (ptrdiff_type, 0, -1)); field->set_type (lookup_array_range_type (ptrdiff_type, 0, -1));
SET_FIELD_BITPOS (*field, offset * TARGET_CHAR_BIT); field->set_loc_bitpos (offset * TARGET_CHAR_BIT);
offset += TYPE_LENGTH (field->type ()); offset += TYPE_LENGTH (field->type ());
field++; field++;
/* ptrdiff_t offset_to_top; */ /* ptrdiff_t offset_to_top; */
field->set_name ("offset_to_top"); field->set_name ("offset_to_top");
field->set_type (ptrdiff_type); field->set_type (ptrdiff_type);
SET_FIELD_BITPOS (*field, offset * TARGET_CHAR_BIT); field->set_loc_bitpos (offset * TARGET_CHAR_BIT);
offset += TYPE_LENGTH (field->type ()); offset += TYPE_LENGTH (field->type ());
field++; field++;
/* void *type_info; */ /* void *type_info; */
field->set_name ("type_info"); field->set_name ("type_info");
field->set_type (void_ptr_type); field->set_type (void_ptr_type);
SET_FIELD_BITPOS (*field, offset * TARGET_CHAR_BIT); field->set_loc_bitpos (offset * TARGET_CHAR_BIT);
offset += TYPE_LENGTH (field->type ()); offset += TYPE_LENGTH (field->type ());
field++; field++;
/* void (*virtual_functions[0]) (); */ /* void (*virtual_functions[0]) (); */
field->set_name ("virtual_functions"); field->set_name ("virtual_functions");
field->set_type (lookup_array_range_type (ptr_to_void_fn_type, 0, -1)); field->set_type (lookup_array_range_type (ptr_to_void_fn_type, 0, -1));
SET_FIELD_BITPOS (*field, offset * TARGET_CHAR_BIT); field->set_loc_bitpos (offset * TARGET_CHAR_BIT);
offset += TYPE_LENGTH (field->type ()); offset += TYPE_LENGTH (field->type ());
field++; field++;
@ -1035,14 +1035,14 @@ build_std_type_info_type (struct gdbarch *arch)
/* The vtable. */ /* The vtable. */
field->set_name ("_vptr.type_info"); field->set_name ("_vptr.type_info");
field->set_type (void_ptr_type); field->set_type (void_ptr_type);
SET_FIELD_BITPOS (*field, offset * TARGET_CHAR_BIT); field->set_loc_bitpos (offset * TARGET_CHAR_BIT);
offset += TYPE_LENGTH (field->type ()); offset += TYPE_LENGTH (field->type ());
field++; field++;
/* The name. */ /* The name. */
field->set_name ("__name"); field->set_name ("__name");
field->set_type (char_ptr_type); field->set_type (char_ptr_type);
SET_FIELD_BITPOS (*field, offset * TARGET_CHAR_BIT); field->set_loc_bitpos (offset * TARGET_CHAR_BIT);
offset += TYPE_LENGTH (field->type ()); offset += TYPE_LENGTH (field->type ());
field++; field++;

View file

@ -1056,7 +1056,7 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend,
if (tsym.st != stMember) if (tsym.st != stMember)
break; break;
SET_FIELD_ENUMVAL (*f, tsym.value); f->set_loc_enumval (tsym.value);
f->set_type (t); f->set_type (t);
f->set_name (debug_info->ss + cur_fdr->issBase + tsym.iss); f->set_name (debug_info->ss + cur_fdr->issBase + tsym.iss);
FIELD_BITSIZE (*f) = 0; FIELD_BITSIZE (*f) = 0;
@ -1242,7 +1242,7 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend,
struct field *f = &top_stack->cur_type->field (top_stack->cur_field); struct field *f = &top_stack->cur_type->field (top_stack->cur_field);
top_stack->cur_field++; top_stack->cur_field++;
f->set_name (name); f->set_name (name);
SET_FIELD_BITPOS (*f, sh->value); f->set_loc_bitpos (sh->value);
bitsize = 0; bitsize = 0;
f->set_type (parse_type (cur_fd, ax, sh->index, &bitsize, bigend, f->set_type (parse_type (cur_fd, ax, sh->index, &bitsize, bigend,
name)); name));

View file

@ -912,7 +912,7 @@ rust_composite_type (struct type *original,
{ {
struct field *field = &result->field (i); struct field *field = &result->field (i);
SET_FIELD_BITPOS (*field, bitpos); field->set_loc_bitpos (bitpos);
bitpos += TYPE_LENGTH (type1) * TARGET_CHAR_BIT; bitpos += TYPE_LENGTH (type1) * TARGET_CHAR_BIT;
field->set_name (field1); field->set_name (field1);
@ -933,7 +933,7 @@ rust_composite_type (struct type *original,
if (delta != 0) if (delta != 0)
bitpos += align - delta; bitpos += align - delta;
} }
SET_FIELD_BITPOS (*field, bitpos); field->set_loc_bitpos (bitpos);
field->set_name (field2); field->set_name (field2);
field->set_type (type2); field->set_type (type2);

View file

@ -2755,8 +2755,7 @@ read_cpp_abbrev (struct stab_field_info *fip, const char **pp,
{ {
int nbits; int nbits;
SET_FIELD_BITPOS (fip->list->field, fip->list->field.set_loc_bitpos (read_huge_number (pp, ';', &nbits, 0));
read_huge_number (pp, ';', &nbits, 0));
if (nbits != 0) if (nbits != 0)
return 0; return 0;
} }
@ -2817,7 +2816,7 @@ read_one_struct_field (struct stab_field_info *fip, const char **pp,
p++; p++;
} }
/* Static class member. */ /* Static class member. */
SET_FIELD_PHYSNAME (fip->list->field, savestring (*pp, p - *pp)); fip->list->field.set_loc_physname (savestring (*pp, p - *pp));
*pp = p + 1; *pp = p + 1;
return; return;
} }
@ -2833,8 +2832,7 @@ read_one_struct_field (struct stab_field_info *fip, const char **pp,
{ {
int nbits; int nbits;
SET_FIELD_BITPOS (fip->list->field, fip->list->field.set_loc_bitpos (read_huge_number (pp, ',', &nbits, 0));
read_huge_number (pp, ',', &nbits, 0));
if (nbits != 0) if (nbits != 0)
{ {
stabs_general_complaint ("bad structure-type format"); stabs_general_complaint ("bad structure-type format");
@ -3110,7 +3108,7 @@ read_baseclasses (struct stab_field_info *fip, const char **pp,
corresponding to this baseclass. Always zero in the absence of corresponding to this baseclass. Always zero in the absence of
multiple inheritance. */ multiple inheritance. */
SET_FIELD_BITPOS (newobj->field, read_huge_number (pp, ',', &nbits, 0)); newobj->field.set_loc_bitpos (read_huge_number (pp, ',', &nbits, 0));
if (nbits != 0) if (nbits != 0)
return 0; return 0;
} }
@ -3639,7 +3637,7 @@ read_enum_type (const char **pp, struct type *type,
SYMBOL_TYPE (xsym) = type; SYMBOL_TYPE (xsym) = type;
type->field (n).set_name (xsym->linkage_name ()); type->field (n).set_name (xsym->linkage_name ());
SET_FIELD_ENUMVAL (type->field (n), SYMBOL_VALUE (xsym)); type->field (n).set_loc_enumval (SYMBOL_VALUE (xsym));
TYPE_FIELD_BITSIZE (type, n) = 0; TYPE_FIELD_BITSIZE (type, n) = 0;
} }
if (syms == osyms) if (syms == osyms)

View file

@ -230,9 +230,9 @@ make_gdb_type (struct gdbarch *gdbarch, struct tdesc_type *ttype)
bitsize = f.end - f.start + 1; bitsize = f.end - f.start + 1;
total_size = e->size * TARGET_CHAR_BIT; total_size = e->size * TARGET_CHAR_BIT;
if (gdbarch_byte_order (m_gdbarch) == BFD_ENDIAN_BIG) if (gdbarch_byte_order (m_gdbarch) == BFD_ENDIAN_BIG)
SET_FIELD_BITPOS (fld[0], total_size - f.start - bitsize); fld->set_loc_bitpos (total_size - f.start - bitsize);
else else
SET_FIELD_BITPOS (fld[0], f.start); fld->set_loc_bitpos (f.start);
FIELD_BITSIZE (fld[0]) = bitsize; FIELD_BITSIZE (fld[0]) = bitsize;
} }
else else
@ -298,7 +298,7 @@ make_gdb_type (struct gdbarch *gdbarch, struct tdesc_type *ttype)
xstrdup (f.name.c_str ()), xstrdup (f.name.c_str ()),
NULL); NULL);
SET_FIELD_BITPOS (fld[0], f.start); fld->set_loc_enumval (f.start);
} }
} }

View file

@ -762,7 +762,7 @@ create_enum (struct gdbarch *gdbarch, int bit, const char *name,
for (i = 0; i < count; i++) for (i = 0; i < count; i++)
{ {
type->field (i).set_name (values[i].name); type->field (i).set_name (values[i].name);
SET_FIELD_ENUMVAL (type->field (i), values[i].value); type->field (i).set_loc_enumval (values[i].value);
} }
return type; return type;