diff mbox series

[6/7] bpf testsuite: Add BPF CO-RE tests

Message ID 20210804175411.6783-7-david.faust@oracle.com
State New
Headers show
Series BPF CO-RE Support | expand

Commit Message

David Faust Aug. 4, 2021, 5:54 p.m. UTC
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

Comments

Jose E. Marchesi Aug. 10, 2021, 3:12 p.m. UTC | #1
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 } } */
diff mbox series

Patch

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 } } */