andykaylor wrote:

@bcardosolopes, I have some general concerns about the way that we're 
representing bitfields and bitfield accesses. It seems fundamentally 
inconsistent with the way we represent unions. For example:
```
union U {
  char a;
  int b;
  long c;
};
```
becomes

`!cir.record<union "U" {!s8i, !s32i, !s64i}`

but
```
struct S {
  int x;
  unsigned a:2;
  unsigned b:5;
  unsigned c:7;
} s;
```
becomes

`!cir.record<struct "S" {!s32i, !u16i}`

And all three bitfield members are hidden away inside the second member, 
leading to the need for two operations to access a bitfield member:

```
    %3 = cir.get_member %2[1] {name = "b"} : !cir.ptr<!rec_S> -> 
!cir.ptr<!u16i> loc(#loc11)
    %4 = cir.get_bitfield(#bfi_b, %3 : !cir.ptr<!u16i>) -> !u32i loc(#loc12)
```

Why are we representing each member of a union individually but packing 
bitfields away in integer fields?

What would you think of something like this?

`!cir.record<struct "S" {!s32i, !cir.bitfield<2>, !cir.bitfield<5>, 
!cir.bitfield<7>}`

That puts a bit more burden on the  `RecordType::getElementOffset` 
implementation, but I think it would let us defer some of the details to 
lowering.

https://github.com/llvm/llvm-project/pull/142041
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to