[all-commits] [llvm/llvm-project] 6d0780: [BPF] handle typedef of struct/union for CO-RE rel...

yonghong-song via All-commits all-commits at lists.llvm.org
Tue Feb 4 08:53:23 PST 2020


  Branch: refs/heads/master
  Home:   https://github.com/llvm/llvm-project
  Commit: 6d07802d63a8589447de0a697696447a583de9d8
      https://github.com/llvm/llvm-project/commit/6d07802d63a8589447de0a697696447a583de9d8
  Author: Yonghong Song <yhs at fb.com>
  Date:   2020-02-04 (Tue, 04 Feb 2020)

  Changed paths:
    M llvm/lib/Target/BPF/BPFAbstractMemberAccess.cpp
    A llvm/test/CodeGen/BPF/CORE/offset-reloc-typedef-struct-2.ll
    A llvm/test/CodeGen/BPF/CORE/offset-reloc-typedef-union-2.ll

  Log Message:
  -----------
  [BPF] handle typedef of struct/union for CO-RE relocations

Linux commit
  https://github.com/torvalds/linux/commit/1cf5b23988ea0086a252a5c8b005b075f1e9b030#diff-289313b9fec99c6f0acfea19d9cfd949
uses "#pragma clang attribute push (__attribute__((preserve_access_index)),
      apply_to = record)"
to apply CO-RE relocations to all records including the following pattern:
  #pragma clang attribute push (__attribute__((preserve_access_index)), apply_to = record)
  typedef struct {
    int a;
  } __t;
  #pragma clang attribute pop
  int test(__t *arg) { return arg->a; }

The current approach to use struct/union type in the relocation record will
result in an anonymous struct, which make later type matching difficult
in bpf loader. In fact, current BPF backend will fail the above program
with assertion:
  clang: ../lib/Target/BPF/BPFAbstractMemberAccess.cpp:796: ...
     Assertion `TypeName.size()' failed.

clang will change to use the type of the base of the member access
which will preserve the typedef modifier for the
preserve_{struct,union}_access_index intrinsics in the above example.
Here we adjust BPF backend to accept that the debuginfo
type metadata may be 'typedef' and handle them properly.

Differential Revision: https://reviews.llvm.org/D73902




More information about the All-commits mailing list