]> git.ipfire.org Git - thirdparty/gcc.git/commit
bpf: add preserve_field_info builtin
authorDavid Faust <david.faust@oracle.com>
Mon, 24 Oct 2022 20:59:39 +0000 (13:59 -0700)
committerDavid Faust <david.faust@oracle.com>
Wed, 26 Oct 2022 20:18:48 +0000 (13:18 -0700)
commit068baae1864e2a8036beec3082d384a204e24201
tree680abc541c63bb61cc0d1c31622da8cc6f19c7db
parentd2249cd9adf5ae638577139177a50f7e62d8abd9
bpf: add preserve_field_info builtin

Add BPF __builtin_preserve_field_info. This builtin is used to extract
information to facilitate struct and union relocations performed by the
BPF loader, especially for bitfields.

The builtin has the following signature:

  unsigned int __builtin_preserve_field_info (EXPR, unsigned int KIND);

Where EXPR is an expression accessing a field of a struct or union.
Depending on KIND, different information is returned to the program. The
supported values for KIND are as follows:

  enum {
    FIELD_BYTE_OFFSET = 0,
    FIELD_BYTE_SIZE,
    FIELD_EXISTENCE,
    FIELD_SIGNEDNESS,
    FIELD_LSHIFT_U64,
    FIELD_RSHIFT_U64
  };

If -mco-re is in effect (explicitly or implicitly specified), a CO-RE
relocation is added for the access in EXPR recording the relevant
information according to KIND.

gcc/

* config/bpf/bpf.cc: Support __builtin_preserve_field_info.
(enum bpf_builtins): Add new builtin.
(bpf_init_builtins): Likewise.
(bpf_core_field_info): New function.
(bpf_expand_builtin): Accomodate new builtin. Refactor adding new
relocation to...
(maybe_make_core_relo): ... here. New function.
(bpf_resolve_overloaded_builtin): Accomodate new builtin.
(bpf_core_newdecl): Likewise.
(bpf_core_walk): Likewise.
(bpf_core_is_maybe_aggregate_access): Improve logic.
(struct core_walk_data): New.
* config/bpf/coreout.cc (bpf_core_reloc_add): Allow adding different
relocation kinds.
* config/bpf/coreout.h: Analogous change.
* doc/extend.texi: Document BPF __builtin_preserve_field_info.

gcc/testsuite/

* gcc.target/bpf/core-builtin-fieldinfo-errors-1.c: New test.
* gcc.target/bpf/core-builtin-fieldinfo-errors-2.c: New test.
* gcc.target/bpf/core-builtin-fieldinfo-existence-1.c: New test.
* gcc.target/bpf/core-builtin-fieldinfo-lshift-1-be.c: New test.
* gcc.target/bpf/core-builtin-fieldinfo-lshift-1-le.c: New test.
* gcc.target/bpf/core-builtin-fieldinfo-lshift-2.c: New test.
* gcc.target/bpf/core-builtin-fieldinfo-offset-1.c: New test.
* gcc.target/bpf/core-builtin-fieldinfo-rshift-1.c: New test.
* gcc.target/bpf/core-builtin-fieldinfo-rshift-2.c: New test.
* gcc.target/bpf/core-builtin-fieldinfo-sign-1.c: New test.
* gcc.target/bpf/core-builtin-fieldinfo-sign-2.c: New test.
* gcc.target/bpf/core-builtin-fieldinfo-size-1.c: New test.
16 files changed:
gcc/config/bpf/bpf.cc
gcc/config/bpf/coreout.cc
gcc/config/bpf/coreout.h
gcc/doc/extend.texi
gcc/testsuite/gcc.target/bpf/core-builtin-fieldinfo-errors-1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/bpf/core-builtin-fieldinfo-errors-2.c [new file with mode: 0644]
gcc/testsuite/gcc.target/bpf/core-builtin-fieldinfo-existence-1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/bpf/core-builtin-fieldinfo-lshift-1-be.c [new file with mode: 0644]
gcc/testsuite/gcc.target/bpf/core-builtin-fieldinfo-lshift-1-le.c [new file with mode: 0644]
gcc/testsuite/gcc.target/bpf/core-builtin-fieldinfo-lshift-2.c [new file with mode: 0644]
gcc/testsuite/gcc.target/bpf/core-builtin-fieldinfo-offset-1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/bpf/core-builtin-fieldinfo-rshift-1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/bpf/core-builtin-fieldinfo-rshift-2.c [new file with mode: 0644]
gcc/testsuite/gcc.target/bpf/core-builtin-fieldinfo-sign-1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/bpf/core-builtin-fieldinfo-sign-2.c [new file with mode: 0644]
gcc/testsuite/gcc.target/bpf/core-builtin-fieldinfo-size-1.c [new file with mode: 0644]