| /* Basic test for struct __attribute__((preserve_access_index)) |
| for BPF CO-RE support. */ |
| |
| /* { dg-do compile } */ |
| /* { dg-options "-O0 -dA -gbtf -mco-re" } */ |
| |
| struct S { |
| int a; |
| int b; |
| int c; |
| } __attribute__((preserve_access_index)); |
| |
| void |
| func (struct S * s) |
| { |
| /* This test is marked as XFAIL since for the time being the CO-RE |
| implementation is not able to disambiguate between a point manipulation |
| and a CO-RE access when using preserve_access_index attribute. The |
| current implemetantion is incorrect if we consider that STRUCT S might |
| have different size within the kernel. |
| This example demonstrates how the implementation of preserve_access_index |
| as an attribute of the type is flagile. */ |
| |
| /* 2:2 */ |
| int *x = &((s+2)->c); |
| *x = 4; |
| |
| /* 2:1 */ |
| int *y = __builtin_preserve_access_index (&((s+2)->b)); |
| *y = 2; |
| } |
| |
| /* { dg-final { scan-assembler-times "ascii \"2:2.0\"\[\t \]+\[^\n\]*btf_aux_string" 1 { xfail *-*-* } } } */ |
| /* { dg-final { scan-assembler-times "ascii \"2:1.0\"\[\t \]+\[^\n\]*btf_aux_string" 1 } } */ |
| /* { dg-final { scan-assembler-times "bpfcr_type" 2 } } */ |