BPF: fix FIELD_EXISTS relocation with array subscripts
authorYonghong Song <yhs@fb.com>
Thu, 6 May 2021 23:31:30 +0000 (16:31 -0700)
committerYonghong Song <yhs@fb.com>
Fri, 7 May 2021 05:37:02 +0000 (22:37 -0700)
commit605c811d2b0f71c576740c9a54629804353bf67a
treed5dd83bb8fab6b365cac0108317e413d1957c32c
parente6cf3d64412c1ddd2fcece337fe0a5f80e386a48
BPF: fix FIELD_EXISTS relocation with array subscripts

Lorenz Bauer reported an issue in bpf mailing list ([1]) where
for FIELD_EXISTS relocation, if the object is an array subscript,
the patched immediate is the object offset from the base address,
instead of 1.

Currently in BPF AbstractMemberAccess pass, the final offset
from the base address is the patched offset except FIELD_EXISTS
which is 1 unconditionally. In this particular case, the last
data structure access is not a field (struct/union offset)
so it didn't hit the place to set patched immediate to be 1.

This patch fixed the issue by checking the relocation type.
If the type is FIELD_EXISTS, just set to 1.
Tested by modifying some bpf selftests, libbpf is okay with
such types with FIELD_EXISTS relocation.

 [1] https://lore.kernel.org/bpf/CACAyw99n-cMEtVst7aK-3BfHb99GMEChmRLCvhrjsRpHhPrtvA@mail.gmail.com/

Differential Revision: https://reviews.llvm.org/D102036
llvm/lib/Target/BPF/BPFAbstractMemberAccess.cpp
llvm/test/CodeGen/BPF/CORE/intrinsic-fieldinfo-existence-4.ll [new file with mode: 0644]