Hi David. This BPF part is OK.
> This commit adds several tests for the new BPF CO-RE functionality to > the BPF target testsuite. > > gcc/testsuite/ChangeLog: > > * gcc.target/bpf/core-attr-1.c: New test. > * gcc.target/bpf/core-attr-2.c: Likewise. > * gcc.target/bpf/core-attr-3.c: Likewise. > * gcc.target/bpf/core-attr-4.c: Likewise > * gcc.target/bpf/core-builtin-1.c: Likewise > * gcc.target/bpf/core-builtin-2.c: Likewise. > * gcc.target/bpf/core-builtin-3.c: Likewise. > * gcc.target/bpf/core-section-1.c: Likewise. > --- > gcc/testsuite/gcc.target/bpf/core-attr-1.c | 23 +++++++ > gcc/testsuite/gcc.target/bpf/core-attr-2.c | 21 ++++++ > gcc/testsuite/gcc.target/bpf/core-attr-3.c | 41 ++++++++++++ > gcc/testsuite/gcc.target/bpf/core-attr-4.c | 35 ++++++++++ > gcc/testsuite/gcc.target/bpf/core-builtin-1.c | 64 +++++++++++++++++++ > gcc/testsuite/gcc.target/bpf/core-builtin-2.c | 26 ++++++++ > gcc/testsuite/gcc.target/bpf/core-builtin-3.c | 26 ++++++++ > gcc/testsuite/gcc.target/bpf/core-section-1.c | 38 +++++++++++ > 8 files changed, 274 insertions(+) > create mode 100644 gcc/testsuite/gcc.target/bpf/core-attr-1.c > create mode 100644 gcc/testsuite/gcc.target/bpf/core-attr-2.c > create mode 100644 gcc/testsuite/gcc.target/bpf/core-attr-3.c > create mode 100644 gcc/testsuite/gcc.target/bpf/core-attr-4.c > create mode 100644 gcc/testsuite/gcc.target/bpf/core-builtin-1.c > create mode 100644 gcc/testsuite/gcc.target/bpf/core-builtin-2.c > create mode 100644 gcc/testsuite/gcc.target/bpf/core-builtin-3.c > create mode 100644 gcc/testsuite/gcc.target/bpf/core-section-1.c > > diff --git a/gcc/testsuite/gcc.target/bpf/core-attr-1.c > b/gcc/testsuite/gcc.target/bpf/core-attr-1.c > new file mode 100644 > index 00000000000..7f0d0e50dd6 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/bpf/core-attr-1.c > @@ -0,0 +1,23 @@ > +/* Basic test for struct __attribute__((preserve_access_index)) > + for BPF CO-RE support. */ > + > +/* { dg-do compile } */ > +/* { dg-options "-O0 -dA -gbtf -mcore" } */ > + > +struct S { > + int a; > + int b; > + int c; > +} __attribute__((preserve_access_index)); > + > +void > +func (struct S * s) > +{ > + /* 0:2 */ > + int *x = &(s->c); > + > + *x = 4; > +} > + > +/* { dg-final { scan-assembler-times "ascii \"0:2.0\"\[\t > \]+\[^\n\]*btf_aux_string" 1 } } */ > +/* { dg-final { scan-assembler-times "bpfcr_type" 1 } } */ > diff --git a/gcc/testsuite/gcc.target/bpf/core-attr-2.c > b/gcc/testsuite/gcc.target/bpf/core-attr-2.c > new file mode 100644 > index 00000000000..508e1e4c4b1 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/bpf/core-attr-2.c > @@ -0,0 +1,21 @@ > +/* Basic test for union __attribute__((preserve_access_index)) > + for BPF CO-RE support. */ > + > +/* { dg-do compile } */ > +/* { dg-options "-O0 -dA -gbtf -mcore" } */ > + > +union U { > + int a; > + char c; > +} __attribute__((preserve_access_index)); > + > +void > +func (union U *u) > +{ > + /* 0:1 */ > + char *c = &(u->c); > + *c = 'c'; > +} > + > +/* { dg-final { scan-assembler-times "ascii \"0:1.0\"\[\t > \]+\[^\n\]*btf_aux_string" 1 } } */ > +/* { dg-final { scan-assembler-times "bpfcr_type" 1 } } */ > diff --git a/gcc/testsuite/gcc.target/bpf/core-attr-3.c > b/gcc/testsuite/gcc.target/bpf/core-attr-3.c > new file mode 100644 > index 00000000000..1813fd07a2f > --- /dev/null > +++ b/gcc/testsuite/gcc.target/bpf/core-attr-3.c > @@ -0,0 +1,41 @@ > +/* Test for __attribute__((preserve_access_index)) for BPF CO-RE support > + for nested structure. > + > + Note that even though struct O lacks the attribute, when accessed as a > + member of another attributed type, CO-RE relocations should still be > + generated. */ > + > +/* { dg-do compile } */ > +/* { dg-options "-O0 -dA -gbtf -mcore" } */ > + > +struct O { > + int e; > + int f; > +}; > + > +struct S { > + int a; > + struct { > + int b; > + int c; > + } inner; > + struct O other; > +} __attribute__((preserve_access_index)); > + > +void > +func (struct S *foo) > +{ > + /* 0:1:1 */ > + int *x = &(foo->inner.c); > + > + /* 0:2:0 */ > + int *y = &(foo->other.e); > + > + *x = 4; > + *y = 5; > +} > + > +/* { dg-final { scan-assembler-times "ascii \"0:1:1.0\"\[\t > \]+\[^\n\]*btf_aux_string" 1 } } */ > +/* { dg-final { scan-assembler-times "ascii \"0:2:0.0\"\[\t > \]+\[^\n\]*btf_aux_string" 1 } } */ > + > +/* { dg-final { scan-assembler-times "bpfcr_type" 2 } } */ > diff --git a/gcc/testsuite/gcc.target/bpf/core-attr-4.c > b/gcc/testsuite/gcc.target/bpf/core-attr-4.c > new file mode 100644 > index 00000000000..30d859a1c57 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/bpf/core-attr-4.c > @@ -0,0 +1,35 @@ > +/* 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 "-O0 -dA -gbtf -mcore" } */ > + > +struct T { > + int a; > + int b; > + struct U { > + int c; > + struct V { > + int d; > + int e[4]; > + int f; > + } v; > + } u; > +} __attribute__((preserve_access_index)); > + > + > +void > +func (struct T *t) > +{ > + /* 0:2:1:1:3 */ > + t->u.v.e[3] = 0xa1; > + > + /* 0:2:0, 0:0, 0:1 */ > + t->u.c = t->a + t->b; > +} > + > +/* { dg-final { scan-assembler-times "ascii \"0:2:1:1:3.0\"\[\t > \]+\[^\n\]*btf_aux_string" 1 } } */ > +/* { dg-final { scan-assembler-times "ascii \"0:2:0.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 "ascii \"0:1.0\"\[\t > \]+\[^\n\]*btf_aux_string" 1 } } */ > +/* { dg-final { scan-assembler-times "bpfcr_type" 4 } } */ > diff --git a/gcc/testsuite/gcc.target/bpf/core-builtin-1.c > b/gcc/testsuite/gcc.target/bpf/core-builtin-1.c > new file mode 100644 > index 00000000000..e6905418c89 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/bpf/core-builtin-1.c > @@ -0,0 +1,64 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O0 -dA -gbtf -mcore" } */ > + > +struct S { > + int a; > + int b; > + char c; > +}; > + > +union U { > + unsigned int u; > + int i; > + unsigned char uc[4]; > + signed char ic[4]; > +}; > + > +struct S my_s; > +union U my_u; > + > +unsigned long ula[8]; > + > +#define _(x) (__builtin_preserve_access_index (x)) > + > +void > +func (void) > +{ > + /* 1 */ > + int b = _(my_s.b); > + > + /* 2 */ > + char c = _(my_s.c); > + > + /* 2:3 */ > + unsigned char uc = _(my_u.uc[3]); > + > + /* 6 */ > + unsigned long ul = _(ula[6]); > +} > + > +char > +s_ptr (struct S *ps) > +{ > + /* 0:2 */ > + char x = _(ps->c); > + return x; > +} > + > +unsigned char > +u_ptr (union U *pu) > +{ > + /* 0:2:3 */ > + unsigned char x = _(pu->uc[3]); > + return x; > +} > + > +/* { dg-final { scan-assembler-times "ascii \"1.0\"\[\t > \]+\[^\n\]*btf_aux_string" 1 } } */ > +/* { dg-final { scan-assembler-times "ascii \"2.0\"\[\t > \]+\[^\n\]*btf_aux_string" 1 } } */ > +/* { dg-final { scan-assembler-times "ascii \"2:3.0\"\[\t > \]+\[^\n\]*btf_aux_string" 1 } } */ > +/* { dg-final { scan-assembler-times "ascii \"6.0\"\[\t > \]+\[^\n\]*btf_aux_string" 1 } } */ > +/* { dg-final { scan-assembler-times "ascii \"0:2.0\"\[\t > \]+\[^\n\]*btf_aux_string" 1 } } */ > +/* { dg-final { scan-assembler-times "ascii \"0:2:3.0\"\[\t > \]+\[^\n\]*btf_aux_string" 1 } } */ > + > +/* { dg-final { scan-assembler-times "bpfcr_type" 6 } } */ > +/* { dg-final { scan-assembler-times "\[\t \]0x6c\[\t > \]+\[^\n\]*core_relo_len" 1 } } */ > diff --git a/gcc/testsuite/gcc.target/bpf/core-builtin-2.c > b/gcc/testsuite/gcc.target/bpf/core-builtin-2.c > new file mode 100644 > index 00000000000..5e9dfecce65 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/bpf/core-builtin-2.c > @@ -0,0 +1,26 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O0 -dA -gbtf -mcore" } */ > + > +struct S { > + int a; > + union { > + int _unused; > + int b; > + char c; > + } u[4]; > +}; > + > +struct S foo; > + > +#define _(x) (__builtin_preserve_access_index (x)) > + > +void func (void) > +{ > + char *x = __builtin_preserve_access_index (&foo.u[3].c); > + > + *x = 's'; > +} > + > +/* { dg-final { scan-assembler-times "\[\t \]0x4000002\[\t > \]+\[^\n\]*btt_info" 1 } } */ > +/* { dg-final { scan-assembler-times "ascii \"1:3:2.0\"\[\t > \]+\[^\n\]*btf_aux_string" 1 } } */ > +/* { dg-final { scan-assembler-times "bpfcr_type" 1 } } */ > diff --git a/gcc/testsuite/gcc.target/bpf/core-builtin-3.c > b/gcc/testsuite/gcc.target/bpf/core-builtin-3.c > new file mode 100644 > index 00000000000..495eeadfe69 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/bpf/core-builtin-3.c > @@ -0,0 +1,26 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O0 -dA -gbtf -mcore" } */ > + > +struct T { > + int a; > + int b; > + struct U { > + int c; > + struct V { > + int d; > + int e[4]; > + int f; > + } v; > + } u; > +}; > + > +void func (struct T * foo) > +{ > + /* Access string: "0:2:1:1:3" */ > + int *x = __builtin_preserve_access_index (&(foo->u.v.e[3])); > + > + *x = 17; > +} > + > +/* { dg-final { scan-assembler-times "ascii \"0:2:1:1:3.0\"\[\t > \]+\[^\n\]*btf_aux_string" 1 } } */ > +/* { dg-final { scan-assembler-times "bpfcr_type" 1 } } */ > diff --git a/gcc/testsuite/gcc.target/bpf/core-section-1.c > b/gcc/testsuite/gcc.target/bpf/core-section-1.c > new file mode 100644 > index 00000000000..b816aefd0d2 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/bpf/core-section-1.c > @@ -0,0 +1,38 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O0 -gbtf -dA -mcore" } */ > + > +struct T { > + int a; > + int b; > + struct U { > + int c; > + struct V { > + int d; > + int e[4]; > + int f; > + } v; > + } u; > +}; > + > +__attribute__((section("foo_sec"), used)) > +int foo_func (struct T *t) > +{ > + t->u.c = 5; > + return __builtin_preserve_access_index (t->u.v.e[3]); > +} > + > +__attribute__((section("bar_sec"), used)) > +int bar_func (struct T *t) > +{ > + int *x = __builtin_preserve_access_index (&(t->u.v.f)); > + int old = *x; > + *x = 4; > + return old; > +} > + > +/* { dg-final { scan-assembler-times "ascii \"0:2:1:1:3.0\"\[\t > \]+\[^\n\]*btf_aux_string" 1 } } */ > +/* { dg-final { scan-assembler-times "ascii \"0:2:1:2.0\"\[\t > \]+\[^\n\]*btf_aux_string" 1 } } */ > +/* { dg-final { scan-assembler-times "ascii \"foo_sec.0\"\[\t > \]+\[^\n\]*btf_aux_string" 1 } } */ > +/* { dg-final { scan-assembler-times "ascii \"bar_sec.0\"\[\t > \]+\[^\n\]*btf_aux_string" 1 } } */ > +/* { dg-final { scan-assembler-times "bpfcr_type" 2 } } */ > +/* { dg-final { scan-assembler-times "btfext_secinfo_rec_size" 2 } } */