[PATCH] D128501: [CodeGen] Make uninitialized Lvalue bit-field stores poison compatible

Nuno Lopes via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Mon Jun 27 13:25:21 PDT 2022

nlopes added a comment.

In D128501#3613420 <https://reviews.llvm.org/D128501#3613420>, @efriedma wrote:

>> No, you can still link those. There's no ABI change nor any interference at IR level.
> The scenario I was thinking of with -ffine-grained-bitfield-accesses is something like the following:
> File A:
>   struct X { int a : 8; int b : 24; };
>   void f(struct X*);
>   int g() {
>       struct X x;
>       x.a = 10;
>       f(&x);
>       return x.a;
>   }
> File B:
>   struct X { int a : 8; int b : 24; };
>   void f(struct X* x) {
>       x->b = 10;
>   }
> If both files are compiled -ffine-grained-bitfield-accesses, the fields don't overlap.  If both files are compiled with -fno-fine-grained-bitfield-accesses, the assignment in file A freezes both fields of "x".  If file A is compiled with -ffine-grained-bitfield-accesses, but file B is not, f() corrupts the field "a", so g() returns poison (if I'm not missing anything?).

You are right, thanks! f() corrupts `a` because f assumes the fields were both initialized or neither of them was initialized.
The fix is not trivial though, because -ffine-grained-bitfield-accesses would have to freeze the adjacent fields.
This only matters if the IRs are linked together with IPO. Otherwise, at object level it doesn't really matter.

Do you think we can get away by just documenting the incompatibility of doing IPO with files compiled with different -ffine-grained-bitfield-accesses flags?

  rG LLVM Github Monorepo



More information about the cfe-commits mailing list