On June 5, 2018 4:49:21 PM GMT+02:00, David Malcolm <dmalc...@redhat.com> wrote: >On Tue, 2018-06-05 at 04:40 -0400, Trevor Saunders wrote: >> On Fri, Jun 01, 2018 at 12:00:09PM +0200, Richard Biener wrote: >> > On Tue, May 29, 2018 at 10:32 PM David Malcolm <dmalc...@redhat.com >> > > wrote: >> > > >> > > The dump machinery uses "int" in a few places, for two different >> > > sets of bitmasks. >> > > >> > > This patch makes things more self-documenting and type-safe by >> > > using >> > > a new pair of enums: one for the dump_flags_t and another for the >> > > optgroup_flags. >> > >> > Great! This should also make them accessible in gdb w/o using -g3. >> > >> > > This requires adding some overloaded bit operations to the enums >> > > in question, which, in this patch is done for each enum . If the >> > > basic >> > > idea is OK, should I add a template for this? (with some kind of >> > > magic to express that bitmasking operations are only supported on >> > > certain opt-in enums). >> >> You may want to look at gdb's enum-flags.h which I think already >> implements what your doing here. > >Aha! Thanks! > >Browsing the git web UI, that gdb header was introduced by Pedro Alves >in: >https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;a=commitdiff;h=8d297bbf604c8318ffc72d5a7b3db654409c5ed9 >and the current state is here: >https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;a=blob;f=gdb/common/enum-flags.h;hb=HEAD > >I'll try this out with GCC; hopefully it works with C++98. > >Presumably it would be good to share this header between GCC and GDB; >CCing Pedro; Pedro: hi! Does this sound sane? >(for reference, the GCC patch we're discussing here is: > https://gcc.gnu.org/ml/gcc-patches/2018-05/msg01685.html ) > >Presumably gcc's copy should live in the gcc's top-level "include" >subdirectory? > >Would we need to change that "This file is part of GDB." comment, and >the include guards' "COMMON_ENUM_FLAGS_H"? > >> > Does C++ allow > int enums? I think we want some way of knowing >> > when either enum exceeds int (dump_flags_t was already uint64_t >> > but you now make it effectively int again). That is, general >> > wrapping >> > for enum ops should chose an appropriate unsigned integer for >> > the operation. So yes, a common implementation looks useful to me. >> >> I don't remember very well, but istr C++ will actually use a 8 byte >> integer if the enum contains constants larger than 2^32. Testing >> sizeof enum x { A =0x400000000 }; gives the desired thing for me, but >> it >> would still be good to check the standard. > >FWIW C++11 onwards has a std::underlying_type for enums: > http://en.cppreference.com/w/cpp/types/underlying_type >(GCC is on C++98). The gdb header seems to emulate this via the use of >sizeof(T) to select an appropriate integer_for_size specialization and >thus the appropriate struct enum_underlying_type specialization (if I'm >reading it right). > >> Trev >> >> >> > >> > I think this patch is independently useful. > >Richard: by this, did you mean that the patch is OK for trunk as-is?
Yes. Richard. >(keeping a more general bitflags enum patch as followup work) Note to >self: still needs bootstrap-and-testing. > >> > Thanks, >> > Richard. > >Thanks >Dave