1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
|
/* Test for BPF CO-RE __attribute__((preserve_access_index)) with accesses on
LHS and both LHS and RHS of assignment. */
/* { dg-do compile } */
/* { dg-options "-O2 -dA -gbtf -mco-re -masm=normal" } */
struct U {
int c;
struct V {
int d;
int e[4];
int f;
int *g;
} v;
} __attribute__((preserve_access_index));
struct T {
int a;
int b;
struct U u;
struct U *ptr_u;
struct U *array_u;
} __attribute__((preserve_access_index));
extern void mset(void *);
void
func (struct T *t, int i)
{
/* This next expression is silently generating incomplete CO-RE relocations
* because of a front-end optimization to the array access with i. It is
* converting the access to pointer arithmetics, which completely removes the
* reference to the type of array_u. With current folding it is not possible
* to generate correct/complete CO-RE relocations for such cases. The XFAIL
* is exactly for this reason. Once we do XPASS this test there is a slight
* chance we are doing the proper code generation. */
/* 0:4 sizeof(struct U) 0:1:1:3 */
t->array_u[i].v.e[3] = 0xc1;
/* This was commented since in this case it is detectable as not a field
* expression. */
/* 0:4 sizeof(struct U) 0:1:1:2 */
//__builtin_preserve_access_index (t->array_u[i].v.e[2]) = 0xa1;
/* 0:3 0:1:1:1 */
t->ptr_u->v.e[1] = 0xb1;
/* 0:3 0:1:2 */
mset (&(t->ptr_u->v.f));
mset (&t->a);
}
/* { dg-final { scan-assembler-times "ascii \"0:4.0\"\[\t \]+\[^\n\]*btf_aux_string" 1 } } */
/* { dg-final { scan-assembler-times "ascii \"0:1:1:3.0\"\[\t \]+\[^\n\]*btf_aux_string" 1 } } */
/* { dg-final { scan-assembler-times "ascii \"0:1:1:1.0\"\[\t \]+\[^\n\]*btf_aux_string" 1 } } */
/* { dg-final { scan-assembler-times "ascii \"0:3.0\"\[\t \]+\[^\n\]*btf_aux_string" 1 } } */
/* { dg-final { scan-assembler-times "ascii \"0:0.0\"\[\t \]+\[^\n\]*btf_aux_string" 1 } } */
/* { dg-final { scan-assembler-times "bpfcr_astr_off \\(\"0:1:1:3\"\\)" 1 } } */
/* { dg-final { scan-assembler-times "bpfcr_astr_off \\(\"0:4\"\\)" 1 } } */
/* { dg-final { scan-assembler-times "bpfcr_astr_off \\(\"0:3\"\\)" 2 } } */
/* { dg-final { scan-assembler-times "bpfcr_astr_off \\(\"0:1:2\"\\)" 1 } } */
/* { dg-final { scan-assembler-times "bpfcr_astr_off \\(\"0:1:1:1\"\\)" 1 } } */
/* { dg-final { scan-assembler-times "bpfcr_astr_off \\(\"0:0\"\\)" 1 } } */
/* { dg-final { scan-assembler-times "bpfcr_type \\(struct T\\)" 4 } } */
/* { dg-final { scan-assembler-times "bpfcr_type \\(struct U\\)" 4 { xfail *-*-* } } } */
|