[BPF] Add preserve_access_index attribute for record definition
authorYonghong Song <yhs@fb.com>
Sat, 2 Nov 2019 05:16:59 +0000 (22:16 -0700)
committerYonghong Song <yhs@fb.com>
Sat, 9 Nov 2019 16:17:12 +0000 (08:17 -0800)
commit4a5aa1a7bf8b1714b817ede8e09cd28c0784228a
tree1bc0e5f6d33732583fce0799e0ec36ac96f93621
parent27c4eaac8c066eb1f7c5ad26c6fbc3e78eded778
[BPF] Add preserve_access_index attribute for record definition

This patch introduced a new bpf specific attribute which can
be added to struct or union definition. For example,
  struct s { ... } __attribute__((preserve_access_index));
  union u { ... } __attribute__((preserve_access_index));
The goal is to simplify user codes for cases
where preserve access index happens for certain struct/union,
so user does not need to use clang __builtin_preserve_access_index
for every members.

The attribute has no effect if -g is not specified.

When the attribute is specified and -g is specified, any member
access defined by that structure or union, including array subscript
access and inner records, will be preserved through
  __builtin_preserve_{array,struct,union}_access_index()
IR intrinsics, which will enable relocation generation
in bpf backend.

The following is an example to illustrate the usage:
  -bash-4.4$ cat t.c
  #define __reloc__ __attribute__((preserve_access_index))
  struct s1 {
    int c;
  } __reloc__;

  struct s2 {
    union {
      struct s1 b[3];
    };
  } __reloc__;

  struct s3 {
    struct s2 a;
  } __reloc__;

  int test(struct s3 *arg) {
    return arg->a.b[2].c;
  }
  -bash-4.4$ clang -target bpf -g -S -O2 t.c

A relocation with access string "0:0:0:0:2:0" will be generated
representing access offset of arg->a.b[2].c.

forward declaration with attribute is also handled properly such
that the attribute is copied and populated in real record definition.

Differential Revision: https://reviews.llvm.org/D69759
14 files changed:
clang/include/clang/Basic/Attr.td
clang/include/clang/Basic/AttrDocs.td
clang/include/clang/Basic/DiagnosticSemaKinds.td
clang/lib/CodeGen/CGExpr.cpp
clang/lib/Sema/SemaDeclAttr.cpp
clang/test/CodeGen/bpf-attr-preserve-access-index-1.c [new file with mode: 0644]
clang/test/CodeGen/bpf-attr-preserve-access-index-2.c [new file with mode: 0644]
clang/test/CodeGen/bpf-attr-preserve-access-index-3.c [new file with mode: 0644]
clang/test/CodeGen/bpf-attr-preserve-access-index-4.c [new file with mode: 0644]
clang/test/CodeGen/bpf-attr-preserve-access-index-5.c [new file with mode: 0644]
clang/test/CodeGen/bpf-attr-preserve-access-index-6.c [new file with mode: 0644]
clang/test/CodeGen/bpf-attr-preserve-access-index-7.c [new file with mode: 0644]
clang/test/CodeGen/bpf-attr-preserve-access-index-8.c [new file with mode: 0644]
clang/test/Sema/bpf-attr-preserve-access-index.c [new file with mode: 0644]