libctf, types: support slices of anything terminating in an int
authorNick Alcock <nick.alcock@oracle.com>
Tue, 2 Jun 2020 19:43:03 +0000 (20:43 +0100)
committerNick Alcock <nick.alcock@oracle.com>
Wed, 22 Jul 2020 16:57:31 +0000 (17:57 +0100)
commit502e838ed9657ee74cdb4f53798e1468004c9524
tree6571863adaa1fe7e0b450b7b104ced7a7391abe6
parentdd987f004301f6a737fcd431a9ae14d2fc2675bf
libctf, types: support slices of anything terminating in an int

It is perfectly valid C to say e.g.

typedef u64 int;
struct foo_t
  {
    const volatile u64 wibble:2;
  };

i.e. bitfields have to be integral types, but they can be cv-qualified
integral types or typedefs of same, etc.

This is easy to fix: do a ctf_type_resolve_unsliced() at creation time
to ensure the ultimate type is integral, and ctf_type_resolve() at
lookup time so that if you somehow have e.g. a slice of a typedef of a
slice of a cv-qualified int, we pull the encoding that the topmost slice
is based on out of the subsidiary slice (and then modify it), not out of
the underlying int.  (This last bit is rather academic right now, since
all slices override exactly the same properties of the underlying type,
but it's still the right thing to do.)

libctf/
* ctf-create.c (ctf_add_slice): Support slices of any kind that
resolves to an integral type.
* ctf-types.c (ctf_type_encoding): Resolve the type before
fishing its encoding out.
libctf/ChangeLog
libctf/ctf-create.c
libctf/ctf-types.c