binutils-gdb/gdb/dwarf2
Simon Marchi 6740f0cc3b 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.
2020-02-18 17:32:57 -05:00
..
abbrev.c Minor simplification in abbrev_table::read 2020-02-08 13:43:24 -07:00
abbrev.h Use htab_up in abbrev_table 2020-02-08 13:43:24 -07:00
attribute.c Change attr_form_is_block to be a method 2020-02-08 13:40:57 -07:00
attribute.h Change attr_form_is_block to be a method 2020-02-08 13:40:57 -07:00
comp-unit.c Convert read_address to a method on comp_unit_head 2020-02-08 13:43:24 -07:00
comp-unit.h Convert read_address to a method on comp_unit_head 2020-02-08 13:43:24 -07:00
expr.c Move DWARF code to dwarf2/ subdirectory 2020-02-08 13:40:59 -07:00
expr.h Move DWARF code to dwarf2/ subdirectory 2020-02-08 13:40:59 -07:00
frame-tailcall.c Return unique_xmalloc_ptr from call_site_find_chain 2020-02-14 12:38:04 -07:00
frame-tailcall.h Move DWARF code to dwarf2/ subdirectory 2020-02-08 13:40:59 -07:00
frame.c Move the frame data to the BFD when possible 2020-02-12 15:51:58 -07:00
frame.h Don't forward-declare struct objfile in dwarf2/frame.h 2020-02-11 17:57:46 -07:00
index-cache.c Move DWARF code to dwarf2/ subdirectory 2020-02-08 13:40:59 -07:00
index-cache.h Move DWARF code to dwarf2/ subdirectory 2020-02-08 13:40:59 -07:00
index-common.c Move DWARF code to dwarf2/ subdirectory 2020-02-08 13:40:59 -07:00
index-common.h Move DWARF code to dwarf2/ subdirectory 2020-02-08 13:40:59 -07:00
index-write.c Change dwarf2_per_objfile::signatured_types to be htab_up 2020-02-08 13:43:03 -07:00
index-write.h Move DWARF code to dwarf2/ subdirectory 2020-02-08 13:40:59 -07:00
leb.c Move read_offset_1 to leb.c 2020-02-08 13:43:24 -07:00
leb.h Move two more functions to dwarf2/leb.h 2020-02-08 13:43:24 -07:00
line-header.c Move DWARF line_header to new file 2020-02-08 13:43:24 -07:00
line-header.h Move DWARF line_header to new file 2020-02-08 13:43:24 -07:00
loc.c Return unique_xmalloc_ptr from call_site_find_chain 2020-02-14 12:38:04 -07:00
loc.h Return unique_xmalloc_ptr from call_site_find_chain 2020-02-14 12:38:04 -07:00
read.c gdb: allow duplicate enumerators in flag enums 2020-02-18 17:32:57 -05:00
read.h Add some methods to dwarf2_per_cu_data 2020-02-08 13:43:24 -07:00
section.c Change section functions to be methods of dwarf2_section_info 2020-02-08 13:40:55 -07:00
section.h Convert dwarf2_section_size to a method 2020-02-08 13:43:24 -07:00