From eb28de4a09f016d3de7caccec781eb70995a4001 Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Mon, 16 Jan 2012 19:44:11 +0000 Subject: gdb PR python/13281: * gdbtypes.h (TYPE_FLAG_ENUM): New macro. (struct main_type) : New field. * dwarf2read.c (process_enumeration_scope): Detect "flag" enums. * NEWS: Add entries. * c-valprint.c (c_val_print) : 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. --- gdb/c-valprint.c | 35 +++++++++++++++++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) (limited to 'gdb/c-valprint.c') diff --git a/gdb/c-valprint.c b/gdb/c-valprint.c index 9949015d868..82551e9dc93 100644 --- a/gdb/c-valprint.c +++ b/gdb/c-valprint.c @@ -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: -- cgit v1.2.1