[Bug target/120241] bpf: problem with preserve_access_index in "nested" struct types
cvs-commit at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Wed Feb 25 18:01:11 GMT 2026
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120241
--- Comment #1 from GCC Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Cupertino Miranda <cupermir@gcc.gnu.org>:
https://gcc.gnu.org/g:fb7bfbaa9192a8055683447810f08b9fa352e402
commit r16-7698-gfb7bfbaa9192a8055683447810f08b9fa352e402
Author: Cupertino Miranda <cupertino.miranda@oracle.com>
Date: Tue Oct 21 13:33:58 2025 +0100
bpf: Split expressions for proper CO-RE code generation
This patch corrects CO-RE generation for the cases where an expression
starts with a non-CO-RE access, but in the middle it requires to
generate CO-RE to correctly compute the access location.
It fixes it by splitting the expression into their CO-RE and non-CO-RE
counterparts. It performs this by walking gimple expressions, and for
each field access to which its type is a struct or union, it verifies if
both the types for the base and field are attributed similarly.
Otherwise, it splits the expression at this location by creating a
temporary variable and performing any required pointer conversions.
This smaller expressions are converted to CO-RE in the subsequent
gimple walker.
There is no way in GCC to distinguish nested struct/union definitions
from non-nested ones.
This patch simplifies code and enforces that all preserve_access_index
structs/unions would be attributed explicitly.
Previous approach was error prone as it would extend CO-RE accesses to
structures which would not be attributed.
All GCC BPF dejagnu passes tests:
# of expected passes 553
# of expected failures 6
kernel-next bpf selftests:
before: Summary: 543/4888 PASSED, 113 SKIPPED, 136 FAILED
after: Summary: 545/4893 PASSED, 113 SKIPPED, 134 FAILED
gcc/ChangeLog:
PR target/120241
* config/bpf/core-builtins.cc
(is_attr_preserve_access): Correct for pointer types.
(maybe_get_base_for_field_expr, core_access_index_map,
core_access_clean, core_is_access_index,
core_mark_as_access_index):
Remove.
(make_gimple_core_safe_access_index): Remove function.
(struct walker_data): New struct to pass data to tree walker.
(callback_should_do_core_access, should_do_core_access): Add
function to identify expressions that should not be converted to
CO-RE.
(core_make_builtins): Add callback tree walker function to
convert expressions to CO-RE.
(callback_find_next_split_location, core_should_split_expr,
find_next_split_location, gimple_core_early_split_expr): Add
function to split expressions in CO-RE and non-CO-RE
expressions.
(execute_lower_bpf_core): Adapt to new code.
* config/bpf/bpf.opt: Add option Wco-re.
* doc/invoke.texi: Add documentation for Wco-re.
gcc/testsuite/ChangeLog:
PR target/120241
* gcc.target/bpf/core-attr-3.c: Add attribute.
* gcc.target/bpf/core-attr-4.c: Add attribute.
* gcc.target/bpf/core-attr-5.c: Add attribute.
* gcc.target/bpf/core-attr-6.c: Add attribute.
* gcc.target/bpf/core-attr-7.c: New test.
* gcc.target/bpf/core-attr-calls.c: Adapt.
More information about the Gcc-bugs
mailing list