adams381 wrote:

I've been struggling with this representation.  The field description is the 
right place to look, and `#cir.bitfield_info` is the natural home for all of 
it.  However, that cannot be reached from here.  It is an operand of 
`cir.get_bitfield` and `cir.set_bitfield`, so it exists only where a field is 
accessed.  CallConvLowering classifies a signature and sees the record type 
alone, and the type carries no equivalent: a member is marked `bitfield` and 
has a storage type, but no name, width, offset or signedness.  `bitfield_info` 
itself already carries `storage_type`, `size` and `offset`, so the declared 
type really is the only piece missing from it.

The equivalent that is reachable is to put it on the member description in the 
record type.  `StructType` and `UnionType` already carry a `member_kinds` array 
parallel to the member types.  We could add a third array that carries the 
extent per member, printed on the kind:

```mlir
    !rec_S = !cir.struct<"S" {bitfield<11> !u64i, bitfield<4> !u16i, data 
!u32i}>
```

against today's

```mlir
    !rec_S = !cir.struct<"S" {bitfield !u64i, bitfield 
!cir.array<!cir.array<!u8i x 3> x 0>, bitfield !u16i, bitfield 
!cir.array<!cir.array<!u8i x 2> x 0>, data !u32i}>
```

`bitfield<11> !u64i` reads as an 8-byte access unit whose bit-fields were 
declared with types extending to 11 bytes.  Absent means nothing outruns the 
unit, so records without such a unit print exactly as they do now.

This fixes the problem that a zero-length member is still a member, so it 
reaches the LLVM struct type and shifts member indices:

```mlir
    %struct.S = type { i64, [0 x i8], i16, [0 x i8], i32 }   // -fclangir
    %struct.S = type { i64, i16, i32 }                        // classic
```

That divergence is why this patch has to split CHECK prefixes in 
`bitfields.cpp` and move `cir.get_member` indices in `paren-list-agg-init.cpp`. 
 An extent on the member description adds no member, so the lowered struct 
matches classic again and most of the test churn here disappears.

I can implement the extent parameter as a prereq for this PR and then rebase 
when that lands.

https://github.com/llvm/llvm-project/pull/220069
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to