forked from Imagelibrary/binutils-gdb
gdb
PR python/13281: * gdbtypes.h (TYPE_FLAG_ENUM): New macro. (struct main_type) <flag_flag_enum>: New field. * dwarf2read.c (process_enumeration_scope): Detect "flag" enums. * NEWS: Add entries. * c-valprint.c (c_val_print) <TYPE_CODE_ENUM>: Handle "flag" enums. * python/lib/gdb/printing.py (_EnumInstance): New class. (FlagEnumerationPrinter): Likewise. gdb/doc * gdb.texinfo (gdb.printing): Document FlagEnumerationPrinter. gdb/testsuite * gdb.base/printcmds.c (enum flag_enum): New. (three): New global. * gdb.base/printcmds.exp (test_print_enums): Add test for flag enum printing. * gdb.python/py-pp-maint.py (build_pretty_printer): Instantiate FlagEnumerationPrinter. * gdb.python/py-pp-maint.exp: Add tests for FlagEnumerationPrinter. * gdb.python/py-pp-maint.c (enum flag_enum): New. (fval): New global.
This commit is contained in:
@@ -456,10 +456,41 @@ c_val_print (struct type *type, const gdb_byte *valaddr,
|
||||
{
|
||||
fputs_filtered (TYPE_FIELD_NAME (type, i), stream);
|
||||
}
|
||||
else
|
||||
else if (TYPE_FLAG_ENUM (type))
|
||||
{
|
||||
print_longest (stream, 'd', 0, val);
|
||||
int first = 1;
|
||||
|
||||
/* We have a "flag" enum, so we try to decompose it into
|
||||
pieces as appropriate. A flag enum has disjoint
|
||||
constants by definition. */
|
||||
fputs_filtered ("(", stream);
|
||||
for (i = 0; i < len; ++i)
|
||||
{
|
||||
QUIT;
|
||||
|
||||
if ((val & TYPE_FIELD_BITPOS (type, i)) != 0)
|
||||
{
|
||||
if (!first)
|
||||
fputs_filtered (" | ", stream);
|
||||
first = 0;
|
||||
|
||||
val &= ~TYPE_FIELD_BITPOS (type, i);
|
||||
fputs_filtered (TYPE_FIELD_NAME (type, i), stream);
|
||||
}
|
||||
}
|
||||
|
||||
if (first || val != 0)
|
||||
{
|
||||
if (!first)
|
||||
fputs_filtered (" | ", stream);
|
||||
fputs_filtered ("unknown: ", stream);
|
||||
print_longest (stream, 'd', 0, val);
|
||||
}
|
||||
|
||||
fputs_filtered (")", stream);
|
||||
}
|
||||
else
|
||||
print_longest (stream, 'd', 0, val);
|
||||
break;
|
||||
|
||||
case TYPE_CODE_FLAGS:
|
||||
|
||||
Reference in New Issue
Block a user