refactor bitfields
commita9e502cc3bae649fe4f9adffcd0715eb0a71d085
authorgrischka <grischka>
Sun, 9 Jul 2017 10:38:59 +0000 (9 12:38 +0200)
committergrischka <grischka>
Sun, 9 Jul 2017 10:38:59 +0000 (9 12:38 +0200)
tree6a61d98549fbf33ba25440f0d4db164fc695adce
parentf87afa72e06842da1f1bb902e4a192195646134b
refactor bitfields

Use 2 level strategy to access packed bitfields cleanly:

1) Allow to override the original declaration type with
   an auxilary "access type".  This solves cases such as

    struct {
        ...
        unsigned f1:1;
    };

    by using VT_BYTE to access f1.

2) Allow byte-wise split accesses using two new functions
   load/store_packed_bf. This solves any cases, also ones
   such as

    struct __attribute((packed)) _s {
        unsigned x : 12;
        unsigned char y : 7;
        unsigned z : 28;
        unsigned a: 3;
        unsigned b: 3;
        unsigned c: 3;
    };

    where for field 'z':
    - VT_INT access from offset 2 would be unaligned
    - VT_LLONG from offset 0 would go past the total
      struct size (7)

    and for field 'a' because it is in two bytes and
    aligned access with VT_SHORT/INT is not possible.

Also, static bitfield initializers are stored byte-wise always.
Also, cleanup the struct_layout function a bit.
tcc.h
tccgen.c
tests/tcctest.c