Based on a previous patch form Michal Ludvig:

* gdbtypes.c (append_flags_type_flag, init_flags_type): New
functions.
(is_integral_type, rank_one_type, recursive_dump_type): Add
support for TYPE_CODE_FLAGS.
* gdbtypes.h (enum type_code): Add TYPE_CODE_FLAGS.
(append_flags_type_field, init_flags_type): New prototypes.
* ada-valprint.c (ada_val_print_1): Add support for
TYPE_CODE_FLAGS.
* c-valprint.c (c_val_print): Likewise.
* f-valprint.c (f_val_print): Likewise.
* p-valprint.c (pascal_val_print): Likewise.
* valprint.c (val_print_type_code_flags): New function.
* valprint.h (val_print_type_code_flags): New prototype.
* value.c (unpack_long, value_from_longest): Add support for
TYPE_CODE_FLAGS.
This commit is contained in:
Mark Kettenis
2006-01-18 21:24:19 +00:00
parent 67a4f2b710
commit 4f2aea11c7
10 changed files with 134 additions and 11 deletions

View File

@ -1,3 +1,22 @@
2006-01-18 Mark Kettenis <kettenis@gnu.org>
Based on a previous patch form Michal Ludvig:
* gdbtypes.c (append_flags_type_flag, init_flags_type): New
functions.
(is_integral_type, rank_one_type, recursive_dump_type): Add
support for TYPE_CODE_FLAGS.
* gdbtypes.h (enum type_code): Add TYPE_CODE_FLAGS.
(append_flags_type_field, init_flags_type): New prototypes.
* ada-valprint.c (ada_val_print_1): Add support for
TYPE_CODE_FLAGS.
* c-valprint.c (c_val_print): Likewise.
* f-valprint.c (f_val_print): Likewise.
* p-valprint.c (pascal_val_print): Likewise.
* valprint.c (val_print_type_code_flags): New function.
* valprint.h (val_print_type_code_flags): New prototype.
* value.c (unpack_long, value_from_longest): Add support for
TYPE_CODE_FLAGS.
2006-01-17 Christopher Faylor <cgf@timesys.com> 2006-01-17 Christopher Faylor <cgf@timesys.com>
* MAINTAINERS: Very belatedly remove myself from from the list of * MAINTAINERS: Very belatedly remove myself from from the list of

View File

@ -1,7 +1,7 @@
/* Support for printing Ada values for GDB, the GNU debugger. /* Support for printing Ada values for GDB, the GNU debugger.
Copyright (C) 1986, 1988, 1989, 1991, 1992, 1993, 1994, 1997, 2001, Copyright (C) 1986, 1988, 1989, 1991, 1992, 1993, 1994, 1997, 2001,
2002, 2003, 2004, 2005 Free Software Foundation, Inc. 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
This file is part of GDB. This file is part of GDB.
@ -774,6 +774,13 @@ ada_val_print_1 (struct type *type, const gdb_byte *valaddr0,
} }
break; break;
case TYPE_CODE_FLAGS:
if (format)
print_scalar_formatted (valaddr, type, format, 0, stream);
else
val_print_type_code_flags (type, valaddr, stream);
break;
case TYPE_CODE_FLT: case TYPE_CODE_FLT:
if (format) if (format)
return c_val_print (type, valaddr0, embedded_offset, address, stream, return c_val_print (type, valaddr0, embedded_offset, address, stream,

View File

@ -1,8 +1,8 @@
/* Support for printing C values for GDB, the GNU debugger. /* Support for printing C values for GDB, the GNU debugger.
Copyright (C) 1986, 1988, 1989, 1991, 1992, 1993, 1994, 1995, 1996, Copyright (C) 1986, 1988, 1989, 1991, 1992, 1993, 1994, 1995, 1996,
1997, 1998, 1999, 2000, 2001, 2003, 2005 Free Software Foundation, 1997, 1998, 1999, 2000, 2001, 2003, 2005, 2006
Inc. Free Software Foundation, Inc.
This file is part of GDB. This file is part of GDB.
@ -343,6 +343,13 @@ c_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset,
} }
break; break;
case TYPE_CODE_FLAGS:
if (format)
print_scalar_formatted (valaddr + embedded_offset, type, format, 0, stream);
else
val_print_type_code_flags (type, valaddr + embedded_offset, stream);
break;
case TYPE_CODE_FUNC: case TYPE_CODE_FUNC:
if (format) if (format)
{ {

View File

@ -1,7 +1,7 @@
/* Support for printing Fortran values for GDB, the GNU debugger. /* Support for printing Fortran values for GDB, the GNU debugger.
Copyright (C) 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2003, 2005 Free Copyright (C) 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2003, 2005, 2006
Software Foundation, Inc. Free Software Foundation, Inc.
Contributed by Motorola. Adapted from the C definitions by Farooq Butt Contributed by Motorola. Adapted from the C definitions by Farooq Butt
(fmbutt@engage.sps.mot.com), additionally worked over by Stan Shebs. (fmbutt@engage.sps.mot.com), additionally worked over by Stan Shebs.
@ -483,6 +483,13 @@ f_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset,
} }
break; break;
case TYPE_CODE_FLAGS:
if (format)
print_scalar_formatted (valaddr, type, format, 0, stream);
else
val_print_type_code_flags (type, valaddr, stream);
break;
case TYPE_CODE_FLT: case TYPE_CODE_FLT:
if (format) if (format)
print_scalar_formatted (valaddr, type, format, 0, stream); print_scalar_formatted (valaddr, type, format, 0, stream);

View File

@ -1,6 +1,8 @@
/* Support routines for manipulating internal types for GDB. /* Support routines for manipulating internal types for GDB.
Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002, 2003,
2004 Free Software Foundation, Inc. Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002,
2003, 2004, 2006 Free Software Foundation, Inc.
Contributed by Cygnus Support, using pieces from other GDB modules. Contributed by Cygnus Support, using pieces from other GDB modules.
This file is part of GDB. This file is part of GDB.
@ -847,6 +849,39 @@ create_set_type (struct type *result_type, struct type *domain_type)
return (result_type); return (result_type);
} }
void
append_flags_type_flag (struct type *type, int bitpos, char *name)
{
gdb_assert (TYPE_CODE (type) == TYPE_CODE_FLAGS);
gdb_assert (bitpos < TYPE_NFIELDS (type));
gdb_assert (bitpos >= 0);
if (name)
{
TYPE_FIELD_NAME (type, bitpos) = xstrdup (name);
TYPE_FIELD_BITPOS (type, bitpos) = bitpos;
}
else
{
/* Don't show this field to the user. */
TYPE_FIELD_BITPOS (type, bitpos) = -1;
}
}
struct type *
init_flags_type (char *name, int length)
{
int nfields = length * TARGET_CHAR_BIT;
struct type *type;
type = init_type (TYPE_CODE_FLAGS, length, TYPE_FLAG_UNSIGNED, name, NULL);
TYPE_NFIELDS (type) = nfields;
TYPE_FIELDS (type) = TYPE_ALLOC (type, nfields * sizeof (struct field));
memset (TYPE_FIELDS (type), 0, sizeof (struct field));
return type;
}
/* Construct and return a type of the form: /* Construct and return a type of the form:
struct NAME { ELT_TYPE ELT_NAME[N]; } struct NAME { ELT_TYPE ELT_NAME[N]; }
We use these types for SIMD registers. For example, the type of We use these types for SIMD registers. For example, the type of
@ -1822,6 +1857,7 @@ is_integral_type (struct type *t)
((t != NULL) ((t != NULL)
&& ((TYPE_CODE (t) == TYPE_CODE_INT) && ((TYPE_CODE (t) == TYPE_CODE_INT)
|| (TYPE_CODE (t) == TYPE_CODE_ENUM) || (TYPE_CODE (t) == TYPE_CODE_ENUM)
|| (TYPE_CODE (t) == TYPE_CODE_FLAGS)
|| (TYPE_CODE (t) == TYPE_CODE_CHAR) || (TYPE_CODE (t) == TYPE_CODE_CHAR)
|| (TYPE_CODE (t) == TYPE_CODE_RANGE) || (TYPE_CODE (t) == TYPE_CODE_RANGE)
|| (TYPE_CODE (t) == TYPE_CODE_BOOL))); || (TYPE_CODE (t) == TYPE_CODE_BOOL)));
@ -2374,6 +2410,7 @@ rank_one_type (struct type *parm, struct type *arg)
return rank_one_type (TYPE_TARGET_TYPE (parm), arg); return rank_one_type (TYPE_TARGET_TYPE (parm), arg);
case TYPE_CODE_INT: case TYPE_CODE_INT:
case TYPE_CODE_ENUM: case TYPE_CODE_ENUM:
case TYPE_CODE_FLAGS:
case TYPE_CODE_CHAR: case TYPE_CODE_CHAR:
case TYPE_CODE_RANGE: case TYPE_CODE_RANGE:
case TYPE_CODE_BOOL: case TYPE_CODE_BOOL:
@ -2454,6 +2491,7 @@ rank_one_type (struct type *parm, struct type *arg)
else else
return INTEGER_CONVERSION_BADNESS; return INTEGER_CONVERSION_BADNESS;
case TYPE_CODE_ENUM: case TYPE_CODE_ENUM:
case TYPE_CODE_FLAGS:
case TYPE_CODE_CHAR: case TYPE_CODE_CHAR:
case TYPE_CODE_RANGE: case TYPE_CODE_RANGE:
case TYPE_CODE_BOOL: case TYPE_CODE_BOOL:
@ -2888,6 +2926,9 @@ recursive_dump_type (struct type *type, int spaces)
case TYPE_CODE_ENUM: case TYPE_CODE_ENUM:
printf_filtered ("(TYPE_CODE_ENUM)"); printf_filtered ("(TYPE_CODE_ENUM)");
break; break;
case TYPE_CODE_FLAGS:
printf_filtered ("(TYPE_CODE_FLAGS)");
break;
case TYPE_CODE_FUNC: case TYPE_CODE_FUNC:
printf_filtered ("(TYPE_CODE_FUNC)"); printf_filtered ("(TYPE_CODE_FUNC)");
break; break;

View File

@ -1,7 +1,7 @@
/* Internal type definitions for GDB. /* Internal type definitions for GDB.
Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
2001, 2002, 2003, 2004 Free Software Foundation, Inc. 2001, 2002, 2003, 2004, 2006 Free Software Foundation, Inc.
Contributed by Cygnus Support, using pieces from other GDB modules. Contributed by Cygnus Support, using pieces from other GDB modules.
@ -106,6 +106,7 @@ enum type_code
TYPE_CODE_STRUCT, /* C struct or Pascal record */ TYPE_CODE_STRUCT, /* C struct or Pascal record */
TYPE_CODE_UNION, /* C union or Pascal variant part */ TYPE_CODE_UNION, /* C union or Pascal variant part */
TYPE_CODE_ENUM, /* Enumeration type */ TYPE_CODE_ENUM, /* Enumeration type */
TYPE_CODE_FLAGS, /* Bit flags type */
TYPE_CODE_FUNC, /* Function type */ TYPE_CODE_FUNC, /* Function type */
TYPE_CODE_INT, /* Integer type */ TYPE_CODE_INT, /* Integer type */
@ -1190,6 +1191,12 @@ extern struct type *init_composite_type (char *name, enum type_code code);
extern void append_composite_type_field (struct type *t, char *name, extern void append_composite_type_field (struct type *t, char *name,
struct type *field); struct type *field);
/* Helper functions to construct a bit flags type. An initially empty
type is created using init_flag_type(). Flags are then added using
append_flag_type_flag(). */
extern struct type *init_flags_type (char *name, int length);
extern void append_flags_type_flag (struct type *type, int bitpos, char *name);
extern struct type *lookup_reference_type (struct type *); extern struct type *lookup_reference_type (struct type *);
extern struct type *make_reference_type (struct type *, struct type **); extern struct type *make_reference_type (struct type *, struct type **);

View File

@ -1,6 +1,7 @@
/* Support for printing Pascal values for GDB, the GNU debugger. /* Support for printing Pascal values for GDB, the GNU debugger.
Copyright (C) 2000, 2001, 2003, 2005 Free Software Foundation, Inc. Copyright (C) 2000, 2001, 2003, 2005, 2006
Free Software Foundation, Inc.
This file is part of GDB. This file is part of GDB.
@ -359,6 +360,13 @@ pascal_val_print (struct type *type, const gdb_byte *valaddr,
} }
break; break;
case TYPE_CODE_FLAGS:
if (format)
print_scalar_formatted (valaddr + embedded_offset, type, format, 0, stream);
else
val_print_type_code_flags (type, valaddr + embedded_offset, stream);
break;
case TYPE_CODE_FUNC: case TYPE_CODE_FUNC:
if (format) if (format)
{ {

View File

@ -326,6 +326,27 @@ val_print_type_code_int (struct type *type, const gdb_byte *valaddr,
} }
} }
void
val_print_type_code_flags (struct type *type, const gdb_byte *valaddr,
struct ui_file *stream)
{
LONGEST val = unpack_long (type, valaddr);
int bitpos, nfields = TYPE_NFIELDS (type);
fputs_filtered ("[ ", stream);
for (bitpos = 0; bitpos < nfields; bitpos++)
{
if (TYPE_FIELD_BITPOS (type, bitpos) != -1 && (val & (1 << bitpos)))
{
if (TYPE_FIELD_NAME (type, bitpos))
fprintf_filtered (stream, "%s ", TYPE_FIELD_NAME (type, bitpos));
else
fprintf_filtered (stream, "#%d ", bitpos);
}
}
fputs_filtered ("]", stream);
}
/* Print a number according to FORMAT which is one of d,u,x,o,b,h,w,g. /* Print a number according to FORMAT which is one of d,u,x,o,b,h,w,g.
The raison d'etre of this function is to consolidate printing of The raison d'etre of this function is to consolidate printing of
LONG_LONG's into this one function. The format chars b,h,w,g are LONG_LONG's into this one function. The format chars b,h,w,g are

View File

@ -66,6 +66,10 @@ extern void val_print_array_elements (struct type *, const gdb_byte *,
extern void val_print_type_code_int (struct type *, const gdb_byte *, extern void val_print_type_code_int (struct type *, const gdb_byte *,
struct ui_file *); struct ui_file *);
extern void val_print_type_code_flags (struct type *type,
const gdb_byte *valaddr,
struct ui_file *stream);
extern void print_binary_chars (struct ui_file *, const gdb_byte *, extern void print_binary_chars (struct ui_file *, const gdb_byte *,
unsigned int); unsigned int);

View File

@ -1,8 +1,8 @@
/* Low level packing and unpacking of values for GDB, the GNU Debugger. /* Low level packing and unpacking of values for GDB, the GNU Debugger.
Copyright (C) 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, Copyright (C) 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994,
1995, 1996, 1997, 1998, 1999, 2000, 2002, 2003, 2004, 2005 Free 1995, 1996, 1997, 1998, 1999, 2000, 2002, 2003, 2004, 2005, 2006
Software Foundation, Inc. Free Software Foundation, Inc.
This file is part of GDB. This file is part of GDB.
@ -1044,6 +1044,7 @@ unpack_long (struct type *type, const gdb_byte *valaddr)
case TYPE_CODE_TYPEDEF: case TYPE_CODE_TYPEDEF:
return unpack_long (check_typedef (type), valaddr); return unpack_long (check_typedef (type), valaddr);
case TYPE_CODE_ENUM: case TYPE_CODE_ENUM:
case TYPE_CODE_FLAGS:
case TYPE_CODE_BOOL: case TYPE_CODE_BOOL:
case TYPE_CODE_INT: case TYPE_CODE_INT:
case TYPE_CODE_CHAR: case TYPE_CODE_CHAR:
@ -1492,6 +1493,7 @@ retry:
case TYPE_CODE_INT: case TYPE_CODE_INT:
case TYPE_CODE_CHAR: case TYPE_CODE_CHAR:
case TYPE_CODE_ENUM: case TYPE_CODE_ENUM:
case TYPE_CODE_FLAGS:
case TYPE_CODE_BOOL: case TYPE_CODE_BOOL:
case TYPE_CODE_RANGE: case TYPE_CODE_RANGE:
store_signed_integer (value_contents_raw (val), len, num); store_signed_integer (value_contents_raw (val), len, num);