aboutsummaryrefslogtreecommitdiff
path: root/gdb/dwarf2
diff options
context:
space:
mode:
authorSimon Marchi <simon.marchi@efficios.com>2020-02-18 17:29:23 -0500
committerSimon Marchi <simon.marchi@efficios.com>2020-02-18 17:32:57 -0500
commit6740f0cc3bd1530e4aeefe856d9cfe5c0ba2098a (patch)
tree479be063e13d06ad978b4c29772debda946c2d49 /gdb/dwarf2
parentedd45eb06bfc4683922c6877589004632e6e6d29 (diff)
downloadgdb-6740f0cc3bd1530e4aeefe856d9cfe5c0ba2098a.zip
gdb-6740f0cc3bd1530e4aeefe856d9cfe5c0ba2098a.tar.gz
gdb-6740f0cc3bd1530e4aeefe856d9cfe5c0ba2098a.tar.bz2
gdb: allow duplicate enumerators in flag enums
I have come across some uses cases where it would be desirable to treat an enum that has duplicate values as a "flag enum". For example, this one here [1]: enum membarrier_cmd { MEMBARRIER_CMD_QUERY = 0, MEMBARRIER_CMD_GLOBAL = (1 << 0), MEMBARRIER_CMD_GLOBAL_EXPEDITED = (1 << 1), MEMBARRIER_CMD_REGISTER_GLOBAL_EXPEDITED = (1 << 2), MEMBARRIER_CMD_PRIVATE_EXPEDITED = (1 << 3), MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED = (1 << 4), MEMBARRIER_CMD_PRIVATE_EXPEDITED_SYNC_CORE = (1 << 5), MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED_SYNC_CORE = (1 << 6), /* Alias for header backward compatibility. */ MEMBARRIER_CMD_SHARED = MEMBARRIER_CMD_GLOBAL, }; The last enumerator is kept for backwards compatibility. Without this patch, this enumeration wouldn't be considered a flag enum, because two enumerators collide. With this patch, it would be considered a flag enum, and the value 3 would be printed as: MEMBARRIER_CMD_GLOBAL | MEMBARRIER_CMD_GLOBAL_EXPEDITED Although if people prefer, we could display both MEMBARRIER_CMD_GLOBAL and MEMBARRIER_CMD_SHARED in the result. It wouldn't be wrong, and could perhaps be useful in case a bit may have multiple meanings (depending on some other bit value). [1] https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/include/uapi/linux/membarrier.h?id=0bf999f9c5e74c7ecf9dafb527146601e5c848b9#n125 gdb/ChangeLog: * dwarf2/read.c (update_enumeration_type_from_children): Allow flag enums to contain duplicate enumerators. * valprint.c (generic_val_print_enum_1): Update comment. gdb/testsuite/ChangeLog: * gdb.base/printcmds.c (enum flag_enum): Add FE_TWO_LEGACY enumerator.
Diffstat (limited to 'gdb/dwarf2')
-rw-r--r--gdb/dwarf2/read.c5
1 files changed, 0 insertions, 5 deletions
diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c
index 5a77b62..ee220ab 100644
--- a/gdb/dwarf2/read.c
+++ b/gdb/dwarf2/read.c
@@ -15495,7 +15495,6 @@ update_enumeration_type_from_children (struct die_info *die,
struct die_info *child_die;
int unsigned_enum = 1;
int flag_enum = 1;
- ULONGEST mask = 0;
auto_obstack obstack;
@@ -15531,10 +15530,6 @@ update_enumeration_type_from_children (struct die_info *die,
{
if (count_one_bits_ll (value) >= 2)
flag_enum = 0;
- else if ((mask & value) != 0)
- flag_enum = 0;
- else
- mask |= value;
}
/* If we already know that the enum type is neither unsigned, nor