[PATCH 4/5] Make sect_offset and cu_offset strong typedefs instead of structs

Simon Marchi simon.marchi@polymtl.ca
Wed Mar 29 15:46:00 GMT 2017


On 2017-03-28 22:24, Pedro Alves wrote:
> A while ago, back when GDB was a C program, the sect_offset and
> cu_offset types were made structs in order to prevent incorrect mixing
> of those offsets.  Now that we require C++11, we can make them
> integers again, while keeping the safety, by exploiting "enum class".
> We can add a bit more safety, even, by defining operators that the
> types _should_ support, helping making the suspicious uses stand out
> more.
> 
> Getting at the underlying type is done with the new to_underlying
> function added by the previous patch, which also helps better spot
> where do we need to step out of the safety net.  Mostly, that's around
> parsing the DWARF, and when we print the offset for complaint/debug
> purposes.  But there are other occasional uses.
> 
> Since we have to define the sect_offset/cu_offset types in a header
> anyway, I went ahead and generalized/library-fied the idea of "offset"
> types, making it trivial to add more such types if we find a use.  See
> common/offset-type.h and the DEFINE_OFFSET_TYPE macro.
> 
> I needed a couple generaly-useful preprocessor bits (e.g., yet another
> CONCAT implementation), so I started a new common/preprocessor.h file.
> 
> I included units tests covering the "offset" types API.  These are
> mostly compile-time tests, using SFINAE to check that expressions that
> shouldn't compile (e.g., comparing unrelated offset types) really are
> invalid and would fail to compile.  This same idea appeared in my
> pending enum-flags revamp from a few months ago (though this version
> is a bit further modernized compared to what I had posted), and I plan
> on reusing the "check valid expression" bits added here in that
> series, so I went ahead and defined the CHECK_VALID_EXPR macro in its
> own header -- common/valid-expr.h.  I think that's nicer regardless.
> 
> I was borderline between calling the new types "offset" types, or
> "index" types, BTW.  I stuck with "offset" simply because that's what
> we're already calling them, mostly.

A while ago (in the pre C++ era), I asked you if we could make some 
integer types that couldn't be assigned to each other, to represent 
8-bit bytes and target bytes.  That would help avoid mixing incompatible 
lengths or offsets for targets that have 16 or 32 bit bytes, forcing us 
to do the appropriate conversion.  There was no way to do it in C.  Do 
you think offset-type could be used for that now?



More information about the Gdb-patches mailing list