[PATCH] D69837: [BPF] Fix CO-RE bugs with bitfields

Yonghong Song via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon Nov 4 19:42:30 PST 2019


yonghong-song created this revision.
yonghong-song added reviewers: ast, anakryiko.
Herald added subscribers: llvm-commits, hiraditya.
Herald added a project: LLVM.

bitfield handling is not robust with current implementation.
I have seen two issues as described below.

Issue 1:

  struct s {
    long long f1;
    char f2; 
    char b1:1;
  } *p; 
  The current approach will generate an access bit size
  56 (from b1 to the end of structure) which will be
  rejected as it is not power of 2.

Issue 2:

  struct s {
    char f1;
    char b1:3;
    char b2:5; 
    char b3:6:
    char b4:2; 
    char f2;
  };
  The LLVM will group 4 bitfields together with 2 bytes. But
  loading 2 bytes is not correct as it violates alignment
  requirement. Note that sometimes, LLVM breaks a large
  bitfield groups into multiple groups, but not in this case.

To resolve the above two issues, this patch takes a 
different approach. The alignment for the structure is used
to construct the offset of the bitfield access. The bitfield
incurred memory access is an aligned memory access with alignment/size
equal to the alignment of the structure.
This also simplified the code.

This may not be the optimal memory access in terms of memory access
width. But this should be okay since extracting the bitfield value
will have the same amount of work regardless of what kind of
memory access width.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D69837

Files:
  llvm/lib/Target/BPF/BPFAbstractMemberAccess.cpp
  llvm/test/CodeGen/BPF/CORE/field-reloc-bitfield-1.ll
  llvm/test/CodeGen/BPF/CORE/field-reloc-bitfield-2.ll

-------------- next part --------------
A non-text attachment was scrubbed...
Name: D69837.227809.patch
Type: text/x-patch
Size: 21264 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20191105/551e5253/attachment.bin>


More information about the llvm-commits mailing list