* mdebugread.c (parse_symbol): Handle sh.value of zero for enums.

Determine signedness of enum type from enumerators.
	(parse_type):  Handle btIndirect types, handle fBitfield for
	some non-member types.
	(upgrade_type):  Use TYPE_FLAG_TARGET_STUB for arrays with
	unknown length.
	(cross_ref):  Handle stIndirect forward reference to btTypedef.

	* stabsread.c (read_enum_type):  Determine signedness of enum
	type from enumerators.

	* top.c (execute_command):  Remove trailing whitespace from
	command arguments, except for `set' and `complete' commands.
	(validate_comname):  Allow underscores in user defined command
	names.

	* values.c (modify_field):  Change `Value does not fit in %d bits'
	error to a warning. Exclude sign extension bits of negative field
	values from fit check.
This commit is contained in:
Peter Schauer 1995-08-26 07:35:13 +00:00
parent 13ba8b6927
commit 080868b466
5 changed files with 142 additions and 17 deletions

View File

@ -1,3 +1,25 @@
Sat Aug 26 00:26:11 1995 Peter Schauer (pes@regent.e-technik.tu-muenchen.de)
* mdebugread.c (parse_symbol): Handle sh.value of zero for enums.
Determine signedness of enum type from enumerators.
(parse_type): Handle btIndirect types, handle fBitfield for
some non-member types.
(upgrade_type): Use TYPE_FLAG_TARGET_STUB for arrays with
unknown length.
(cross_ref): Handle stIndirect forward reference to btTypedef.
* stabsread.c (read_enum_type): Determine signedness of enum
type from enumerators.
* top.c (execute_command): Remove trailing whitespace from
command arguments, except for `set' and `complete' commands.
(validate_comname): Allow underscores in user defined command
names.
* values.c (modify_field): Change `Value does not fit in %d bits'
error to a warning. Exclude sign extension bits of negative field
values from fit check.
Fri Aug 25 11:31:29 1995 Michael Meissner <meissner@tiktok.cygnus.com>
* configure.in (powerpc*-*-eabisim*): Only link in the simulator

View File

@ -202,6 +202,9 @@ static struct complaint unexpected_type_code_complaint =
static struct complaint unable_to_cross_ref_complaint =
{"unable to cross ref btTypedef for %s", 0, 0};
static struct complaint bad_indirect_xref_complaint =
{"unable to cross ref btIndirect for %s", 0, 0};
static struct complaint illegal_forward_tq0_complaint =
{"illegal tq0 in forward typedef for %s", 0, 0};
@ -1060,6 +1063,8 @@ parse_symbol (sh, ax, ext_sh, bigend, section_offsets)
if (type_code == TYPE_CODE_ENUM)
{
int unsigned_enum = 1;
/* This is a non-empty enum. */
/* DEC c89 has the number of enumerators in the sh.value field,
@ -1067,8 +1072,11 @@ parse_symbol (sh, ax, ext_sh, bigend, section_offsets)
incompatibility quirk.
This might do the wrong thing for an enum with one or two
enumerators and gcc -gcoff -fshort-enums, but these cases
are hopefully rare enough. */
if (TYPE_LENGTH (t) == TYPE_NFIELDS (t))
are hopefully rare enough.
Alpha cc -migrate has a sh.value field of zero, we adjust
that too. */
if (TYPE_LENGTH (t) == TYPE_NFIELDS (t)
|| TYPE_LENGTH (t) == 0)
TYPE_LENGTH (t) = TARGET_INT_BIT / HOST_CHAR_BIT;
for (ext_tsym = ext_sh + external_sym_size;
;
@ -1096,12 +1104,16 @@ parse_symbol (sh, ax, ext_sh, bigend, section_offsets)
SYMBOL_TYPE (enum_sym) = t;
SYMBOL_NAMESPACE (enum_sym) = VAR_NAMESPACE;
SYMBOL_VALUE (enum_sym) = tsym.value;
if (SYMBOL_VALUE (enum_sym) < 0)
unsigned_enum = 0;
add_symbol (enum_sym, top_stack->cur_block);
/* Skip the stMembers that we've handled. */
count++;
f++;
}
if (unsigned_enum)
TYPE_FLAGS (t) |= TYPE_FLAG_UNSIGNED;
}
/* make this the current type */
top_stack->cur_type = t;
@ -1481,6 +1493,11 @@ parse_type (fd, ax, aux_index, bs, bigend, sym_name)
case btSet:
type_code = TYPE_CODE_SET;
break;
case btIndirect:
/* alpha cc -migrate uses this for typedefs. The true type will
be obtained by crossreferencing below. */
type_code = TYPE_CODE_ERROR;
break;
case btTypedef:
/* alpha cc uses this for typedefs. The true type will be
obtained by crossreferencing below. */
@ -1497,15 +1514,57 @@ parse_type (fd, ax, aux_index, bs, bigend, sym_name)
if (t->fBitfield)
{
int width = AUX_GET_WIDTH (bigend, ax);
/* Inhibit core dumps with some cfront generated objects that
corrupt the TIR. */
if (bs == (int *)NULL)
{
complain (&bad_fbitfield_complaint, sym_name);
/* Alpha cc -migrate encodes char and unsigned char types
as short and unsigned short types with a field width of 8.
Enum types also have a field width which we ignore for now. */
if (t->bt == btShort && width == 8)
tp = mdebug_type_char;
else if (t->bt == btUShort && width == 8)
tp = mdebug_type_unsigned_char;
else if (t->bt == btEnum)
;
else
complain (&bad_fbitfield_complaint, sym_name);
}
else
*bs = width;
ax++;
}
/* A btIndirect entry cross references to an aux entry containing
the type. */
if (t->bt == btIndirect)
{
RNDXR rn[1];
int rf;
FDR *xref_fh;
int xref_fd;
(*debug_swap->swap_rndx_in) (bigend, &ax->a_rndx, rn);
ax++;
if (rn->rfd == 0xfff)
{
rf = AUX_GET_ISYM (bigend, ax);
ax++;
}
else
rf = rn->rfd;
if (rf == -1)
{
complain (&bad_indirect_xref_complaint, sym_name);
return mdebug_type_int;
}
*bs = AUX_GET_WIDTH (bigend, ax);
ax++;
xref_fh = get_rfd (fd, rf);
xref_fd = xref_fh - debug_info->fdr;
tp = parse_type (xref_fd, debug_info->external_aux + xref_fh->iauxBase,
rn->index, (int *) NULL, xref_fh->fBigendian, sym_name);
}
/* All these types really point to some (common) MIPS type
@ -1575,10 +1634,8 @@ parse_type (fd, ax, aux_index, bs, bigend, sym_name)
/* All these types really point to some (common) MIPS type
definition, and only the type-qualifiers fully identify
them. We'll make the same effort at sharing.
FIXME: btIndirect cannot happen here as it is handled by the
switch t->bt above. And we are not doing any guessing on range types. */
if (t->bt == btIndirect ||
t->bt == btRange)
FIXME: We are not doing any guessing on range types. */
if (t->bt == btRange)
{
char *name;
@ -1763,6 +1820,13 @@ upgrade_type (fd, tpp, tq, ax, bigend, sym_name)
ignore the erroneous bitsize from the auxiliary entry safely.
dbx seems to ignore it too. */
/* TYPE_FLAG_TARGET_STUB now takes care of the zero TYPE_LENGTH
problem. */
if (TYPE_LENGTH (*tpp) == 0)
{
TYPE_FLAGS (t) |= TYPE_FLAG_TARGET_STUB;
}
*tpp = t;
return 4 + off;
@ -3537,9 +3601,9 @@ cross_ref (fd, ax, tpp, type_code, pname, bigend, sym_name)
For these the type will be void. This is a bad design decision
as cross referencing across compilation units is impossible
due to the missing name.
b) forward declarations of structs/unions/enums which are defined
later in this file or in another file in the same compilation
unit. Irix5 cc uses a stIndirect symbol for this.
b) forward declarations of structs/unions/enums/typedefs which
are defined later in this file or in another file in the same
compilation unit. Irix5 cc uses a stIndirect symbol for this.
Simply cross reference those again to get the true type.
The forward references are not entered in the pending list and
in the symbol table. */
@ -3568,6 +3632,23 @@ cross_ref (fd, ax, tpp, type_code, pname, bigend, sym_name)
fh->fBigendian, sym_name);
break;
case btTypedef:
/* Follow a forward typedef. This might recursively
call cross_ref till we get a non typedef'ed type.
FIXME: This is not correct behaviour, but gdb currently
cannot handle typedefs without type copying. Type
copying is impossible as we might have mutual forward
references between two files and the copied type would not
get filled in when we later parse its definition. */
*tpp = parse_type (xref_fd,
debug_info->external_aux + fh->iauxBase,
sh.index,
(int *)NULL,
fh->fBigendian,
debug_info->ss + fh->issBase + sh.iss);
add_pending (fh, esh, *tpp);
break;
default:
complain (&illegal_forward_bt_complaint, tir.bt, sym_name);
*tpp = init_type (type_code, 0, 0, (char *) NULL,

View File

@ -3050,6 +3050,7 @@ read_enum_type (pp, type, objfile)
struct pending *osyms, *syms;
int o_nsyms;
int nbits;
int unsigned_enum = 1;
#if 0
/* FIXME! The stabs produced by Sun CC merrily define things that ought
@ -3107,6 +3108,8 @@ read_enum_type (pp, type, objfile)
SYMBOL_CLASS (sym) = LOC_CONST;
SYMBOL_NAMESPACE (sym) = VAR_NAMESPACE;
SYMBOL_VALUE (sym) = n;
if (n < 0)
unsigned_enum = 0;
add_symbol_to_list (sym, symlist);
nsyms++;
}
@ -3119,6 +3122,8 @@ read_enum_type (pp, type, objfile)
TYPE_LENGTH (type) = TARGET_INT_BIT / HOST_CHAR_BIT;
TYPE_CODE (type) = TYPE_CODE_ENUM;
TYPE_FLAGS (type) &= ~TYPE_FLAG_STUB;
if (unsigned_enum)
TYPE_FLAGS (type) |= TYPE_FLAG_UNSIGNED;
TYPE_NFIELDS (type) = nsyms;
TYPE_FIELDS (type) = (struct field *)
TYPE_ALLOC (type, sizeof (struct field) * nsyms);

View File

@ -1152,6 +1152,15 @@ execute_command (p, from_tty)
/* Pass null arg rather than an empty one. */
arg = *p ? p : 0;
/* Clear off trailing whitespace, except for set and complete command. */
if (arg && c->type != set_cmd && c->function.cfunc != complete_command)
{
p = arg + strlen (arg) - 1;
while (p >= arg && (*p == ' ' || *p == '\t'))
p--;
*(p + 1) = '\0';
}
/* If this command has been hooked, run the hook first. */
if (c->hook)
execute_user_command (c->hook, (char *)0);
@ -2574,7 +2583,7 @@ validate_comname (comname)
p = comname;
while (*p)
{
if (!isalnum(*p) && *p != '-')
if (!isalnum(*p) && *p != '-' && *p != '_')
error ("Junk in argument list: \"%s\"", p);
p++;
}

View File

@ -1,5 +1,5 @@
/* Low level packing and unpacking of values for GDB, the GNU Debugger.
Copyright 1986, 1987, 1989, 1991, 1993, 1994
Copyright 1986, 1987, 1989, 1991, 1993, 1994, 1995
Free Software Foundation, Inc.
This file is part of GDB.
@ -1288,14 +1288,22 @@ modify_field (addr, fieldval, bitpos, bitsize)
{
LONGEST oword;
/* Reject values too big to fit in the field in question,
otherwise adjoining fields may be corrupted. */
/* If a negative fieldval fits in the field in question, chop
off the sign extension bits. */
if (bitsize < (8 * sizeof (fieldval))
&& (~fieldval & ~((1 << (bitsize - 1)) - 1)) == 0)
fieldval = fieldval & ((1 << bitsize) - 1);
/* Warn if value is too big to fit in the field in question. */
if (bitsize < (8 * sizeof (fieldval))
&& 0 != (fieldval & ~((1<<bitsize)-1)))
{
/* FIXME: would like to include fieldval in the message, but
we don't have a sprintf_longest. */
error ("Value does not fit in %d bits.", bitsize);
warning ("Value does not fit in %d bits.", bitsize);
/* Truncate it, otherwise adjoining fields may be corrupted. */
fieldval = fieldval & ((1 << bitsize) - 1);
}
oword = extract_signed_integer (addr, sizeof oword);