aboutsummaryrefslogtreecommitdiff
path: root/gdb/dwarfread.c
diff options
context:
space:
mode:
authorFred Fish <fnf@specifix.com>1992-08-09 06:14:59 +0000
committerFred Fish <fnf@specifix.com>1992-08-09 06:14:59 +0000
commit50055e94a1d558f9f8edce1c07e90560d7161b76 (patch)
tree85444eb80f5c8f30fd0c6def8c791f369f251065 /gdb/dwarfread.c
parent1815e42cc3cbf95cd12055515a85a707ba7dc764 (diff)
downloadgdb-50055e94a1d558f9f8edce1c07e90560d7161b76.zip
gdb-50055e94a1d558f9f8edce1c07e90560d7161b76.tar.gz
gdb-50055e94a1d558f9f8edce1c07e90560d7161b76.tar.bz2
* dwarfread.c (struct dieinfo): Add has_at_byte_size.
* dwarfread.c (struct_type): In absence of AT_byte_size for bitfield, use size of object of member's type for the size of the anonymous object containing the bit field. * dwarfread.c (completedieinfo): Set has_at_byte_size when an AT_byte_size attribute is seen. * mipsread.c (psymtab_to_symtab_1): Fix misspelled cast to union aux_ext (was aux_ent). * i386-pinsn.c (print_insn): Cast 2'nd arg to read_memory from unsigned char* to char*, for Lucid compiler. * i386-tdep.c (codestream_fill): Fix cast of 2'nd arg to read_memory to be correct type (from unsigned char* to char*). * valprint.c (type_print_derivation_info): Minor tweak to placement of commas in derived class printing. * xcoffread.c (builtin_type): Fix misspelling in fatal message.
Diffstat (limited to 'gdb/dwarfread.c')
-rw-r--r--gdb/dwarfread.c29
1 files changed, 24 insertions, 5 deletions
diff --git a/gdb/dwarfread.c b/gdb/dwarfread.c
index fde32e6..82ee416 100644
--- a/gdb/dwarfread.c
+++ b/gdb/dwarfread.c
@@ -204,6 +204,7 @@ struct dieinfo {
char * at_prototyped;
unsigned int has_at_low_pc:1;
unsigned int has_at_stmt_list:1;
+ unsigned int has_at_byte_size:1;
unsigned int short_element_list:1;
};
@@ -807,6 +808,7 @@ struct_type (dip, thisdie, enddie, objfile)
char *tpart1;
struct dieinfo mbr;
char *nextdie;
+ int anonymous_size;
if ((type = lookup_utype (dip -> die_ref)) == NULL)
{
@@ -841,10 +843,12 @@ struct_type (dip, thisdie, enddie, objfile)
TYPE_NAME (type) = obconcat (&objfile -> type_obstack,
tpart1, " ", dip -> at_name);
}
- if (dip -> at_byte_size != 0)
- {
- TYPE_LENGTH (type) = dip -> at_byte_size;
- }
+ /* Use whatever size is known. Zero is a valid size. We might however
+ wish to check has_at_byte_size to make sure that some byte size was
+ given explicitly, but DWARF doesn't specify that explicit sizes of
+ zero have to present, so complaining about missing sizes should
+ probably not be the default. */
+ TYPE_LENGTH (type) = dip -> at_byte_size;
thisdie += dip -> die_length;
while (thisdie < enddie)
{
@@ -892,8 +896,22 @@ struct_type (dip, thisdie, enddie, objfile)
itself. The result is the bit offset of the LSB of the field. */
if (mbr.at_bit_size > 0)
{
+ if (mbr.has_at_byte_size)
+ {
+ /* The size of the anonymous object containing the bit field
+ is explicit, so use the indicated size (in bytes). */
+ anonymous_size = mbr.at_byte_size;
+ }
+ else
+ {
+ /* The size of the anonymous object containing the bit field
+ matches the size of an object of the bit field's type.
+ DWARF allows at_byte_size to be left out in such cases,
+ as a debug information size optimization. */
+ anonymous_size = TYPE_LENGTH (list -> field.type);
+ }
list -> field.bitpos +=
- mbr.at_byte_size * 8 - mbr.at_bit_offset - mbr.at_bit_size;
+ anonymous_size * 8 - mbr.at_bit_offset - mbr.at_bit_size;
}
#endif
nfields++;
@@ -3224,6 +3242,7 @@ completedieinfo (dip, objfile)
case AT_byte_size:
dip -> at_byte_size = target_to_host (diep, nbytes, GET_UNSIGNED,
objfile);
+ dip -> has_at_byte_size = 1;
break;
case AT_bit_size:
dip -> at_bit_size = target_to_host (diep, nbytes, GET_UNSIGNED,