diff options
Diffstat (limited to 'clang/test/CodeGen')
8 files changed, 248 insertions, 0 deletions
diff --git a/clang/test/CodeGen/bpf-attr-preserve-access-index-1.c b/clang/test/CodeGen/bpf-attr-preserve-access-index-1.c new file mode 100644 index 00000000000..accf6ab2cf9 --- /dev/null +++ b/clang/test/CodeGen/bpf-attr-preserve-access-index-1.c @@ -0,0 +1,23 @@ +// REQUIRES: bpf-registered-target +// RUN: %clang -target bpf -emit-llvm -S -g %s -o - | FileCheck %s + +#define __reloc__ __attribute__((preserve_access_index)) + +// test simple member access and initial struct with non-zero stride access +struct s1 { + int a; + union { + int b; + int c; + }; +} __reloc__; +typedef struct s1 __s1; + +int test(__s1 *arg) { + return arg->a + arg[1].b; +} + +// CHECK: call i32* @llvm.preserve.struct.access.index.p0i32.p0s_struct.s1s(%struct.s1* %{{[0-9a-z]+}}, i32 0, i32 0) +// CHECK: call %struct.s1* @llvm.preserve.array.access.index.p0s_struct.s1s.p0s_struct.s1s(%struct.s1* %{{[0-9a-z]+}}, i32 0, i32 1) +// CHECK: call %union.anon* @llvm.preserve.struct.access.index.p0s_union.anons.p0s_struct.s1s(%struct.s1* %{{[0-9a-z]+}}, i32 1, i32 1) +// CHECK: call %union.anon* @llvm.preserve.union.access.index.p0s_union.anons.p0s_union.anons(%union.anon* %{{[0-9a-z]+}}, i32 0) diff --git a/clang/test/CodeGen/bpf-attr-preserve-access-index-2.c b/clang/test/CodeGen/bpf-attr-preserve-access-index-2.c new file mode 100644 index 00000000000..a136eeea9f1 --- /dev/null +++ b/clang/test/CodeGen/bpf-attr-preserve-access-index-2.c @@ -0,0 +1,24 @@ +// REQUIRES: bpf-registered-target +// RUN: %clang -target bpf -emit-llvm -S -g %s -o - | FileCheck %s + +#define __reloc__ __attribute__((preserve_access_index)) + +// test array access +struct s1 { + int a[3]; + union { + int b; + int c[4]; + }; +} __reloc__; +typedef struct s1 __s1; + +int test(__s1 *arg) { + return arg->a[2] + arg->c[2]; +} + +// CHECK: call [3 x i32]* @llvm.preserve.struct.access.index.p0a3i32.p0s_struct.s1s(%struct.s1* %{{[0-9a-z]+}}, i32 0, i32 0) +// CHECK: call i32* @llvm.preserve.array.access.index.p0i32.p0a3i32([3 x i32]* %{{[0-9a-z]+}}, i32 1, i32 2) +// CHECK: call %union.anon* @llvm.preserve.struct.access.index.p0s_union.anons.p0s_struct.s1s(%struct.s1* %{{[0-9a-z]+}}, i32 1, i32 1) +// CHECK: call %union.anon* @llvm.preserve.union.access.index.p0s_union.anons.p0s_union.anons(%union.anon* %{{[0-9a-z]+}}, i32 1) +// CHECK: call i32* @llvm.preserve.array.access.index.p0i32.p0a4i32([4 x i32]* %{{[0-9a-z]+}}, i32 1, i32 2) diff --git a/clang/test/CodeGen/bpf-attr-preserve-access-index-3.c b/clang/test/CodeGen/bpf-attr-preserve-access-index-3.c new file mode 100644 index 00000000000..917b508704a --- /dev/null +++ b/clang/test/CodeGen/bpf-attr-preserve-access-index-3.c @@ -0,0 +1,32 @@ +// REQUIRES: bpf-registered-target +// RUN: %clang -target bpf -emit-llvm -S -g %s -o - | FileCheck %s + +#define __reloc__ __attribute__((preserve_access_index)) + +// chain of records, all with attributes +struct s1 { + int c; +} __reloc__; +typedef struct s1 __s1; + +struct s2 { + union { + __s1 b[3]; + }; +} __reloc__; +typedef struct s2 __s2; + +struct s3 { + __s2 a; +} __reloc__; +typedef struct s3 __s3; + +int test(__s3 *arg) { + return arg->a.b[2].c; +} + +// CHECK: call %struct.s2* @llvm.preserve.struct.access.index.p0s_struct.s2s.p0s_struct.s3s(%struct.s3* %{{[0-9a-z]+}}, i32 0, i32 0) +// CHECK: call %union.anon* @llvm.preserve.struct.access.index.p0s_union.anons.p0s_struct.s2s(%struct.s2* %{{[0-9a-z]+}}, i32 0, i32 0) +// CHECK: call %union.anon* @llvm.preserve.union.access.index.p0s_union.anons.p0s_union.anons(%union.anon* %{{[0-9a-z]+}}, i32 0) +// CHECK: call %struct.s1* @llvm.preserve.array.access.index.p0s_struct.s1s.p0a3s_struct.s1s([3 x %struct.s1]* %{{[0-9a-z]+}}, i32 1, i32 2) +// CHECK: call i32* @llvm.preserve.struct.access.index.p0i32.p0s_struct.s1s(%struct.s1* %{{[0-9a-z]+}}, i32 0, i32 0) diff --git a/clang/test/CodeGen/bpf-attr-preserve-access-index-4.c b/clang/test/CodeGen/bpf-attr-preserve-access-index-4.c new file mode 100644 index 00000000000..5ec56d96de1 --- /dev/null +++ b/clang/test/CodeGen/bpf-attr-preserve-access-index-4.c @@ -0,0 +1,33 @@ +// REQUIRES: bpf-registered-target +// RUN: %clang -target bpf -emit-llvm -S -g %s -o - | FileCheck %s + +#define __reloc__ __attribute__((preserve_access_index)) + +// chain of records, some do not have attributes. +struct s1 { + int c; +}; +typedef struct s1 __s1; + +struct s2 { + union { + __s1 b[3]; + }; +} __reloc__; +typedef struct s2 __s2; + +struct s3 { + __s2 a; +}; +typedef struct s3 __s3; + +int test(__s3 *arg) { + return arg->a.b[2].c; +} + +// CHECK: define dso_local i32 @test +// CHECK-NOT: call %struct.s2* @llvm.preserve.struct.access.index.p0s_struct.s2s.p0s_struct.s3s +// CHECK: call %union.anon* @llvm.preserve.struct.access.index.p0s_union.anons.p0s_struct.s2s(%struct.s2* %a, i32 0, i32 0) +// CHECK: call %union.anon* @llvm.preserve.union.access.index.p0s_union.anons.p0s_union.anons(%union.anon* %1, i32 0) +// CHECK: call %struct.s1* @llvm.preserve.array.access.index.p0s_struct.s1s.p0a3s_struct.s1s([3 x %struct.s1]* %b, i32 1, i32 2) +// CHECK-NOT: call i32* @llvm.preserve.struct.access.index.p0i32.p0s_struct.s1s diff --git a/clang/test/CodeGen/bpf-attr-preserve-access-index-5.c b/clang/test/CodeGen/bpf-attr-preserve-access-index-5.c new file mode 100644 index 00000000000..281bcdd782c --- /dev/null +++ b/clang/test/CodeGen/bpf-attr-preserve-access-index-5.c @@ -0,0 +1,32 @@ +// REQUIRES: bpf-registered-target +// RUN: %clang -target bpf -emit-llvm -S -g %s -o - | FileCheck %s + +#define __reloc__ __attribute__((preserve_access_index)) + +// chain of records, attribute may be in inner record. +struct s1 { + int c; +} __reloc__; +typedef struct s1 __s1; + +struct s2 { + union { + __s1 b[3]; + } __reloc__; +}; +typedef struct s2 __s2; + +struct s3 { + __s2 a; +} __reloc__; +typedef struct s3 __s3; + +int test(__s3 *arg) { + return arg->a.b[2].c; +} + +// CHECK: call %struct.s2* @llvm.preserve.struct.access.index.p0s_struct.s2s.p0s_struct.s3s(%struct.s3* %{{[0-9a-z]+}}, i32 0, i32 0) +// CHECK-NOT: call %union.anon* @llvm.preserve.struct.access.index.p0s_union.anons.p0s_struct.s2s +// CHECK: call %union.anon* @llvm.preserve.union.access.index.p0s_union.anons.p0s_union.anons(%union.anon* %{{[0-9a-z]+}}, i32 0) +// CHECK: call %struct.s1* @llvm.preserve.array.access.index.p0s_struct.s1s.p0a3s_struct.s1s([3 x %struct.s1]* %{{[0-9a-z]+}}, i32 1, i32 2) +// CHECK: call i32* @llvm.preserve.struct.access.index.p0i32.p0s_struct.s1s(%struct.s1* %{{[0-9a-z]+}}, i32 0, i32 0) diff --git a/clang/test/CodeGen/bpf-attr-preserve-access-index-6.c b/clang/test/CodeGen/bpf-attr-preserve-access-index-6.c new file mode 100644 index 00000000000..a763f28bcd6 --- /dev/null +++ b/clang/test/CodeGen/bpf-attr-preserve-access-index-6.c @@ -0,0 +1,32 @@ +// REQUIRES: bpf-registered-target +// RUN: %clang -target bpf -emit-llvm -S -g %s -o - | FileCheck %s + +#define __reloc__ __attribute__((preserve_access_index)) + +// chain of records, both inner and outer record have attributes. +struct s1 { + int c; +} __reloc__; +typedef struct s1 __s1; + +struct s2 { + union { + __s1 b[3]; + } __reloc__; +} __reloc__; +typedef struct s2 __s2; + +struct s3 { + __s2 a; +} __reloc__; +typedef struct s3 __s3; + +int test(__s3 *arg) { + return arg->a.b[2].c; +} + +// CHECK: call %struct.s2* @llvm.preserve.struct.access.index.p0s_struct.s2s.p0s_struct.s3s(%struct.s3* %{{[0-9a-z]+}}, i32 0, i32 0) +// CHECK: call %union.anon* @llvm.preserve.struct.access.index.p0s_union.anons.p0s_struct.s2s(%struct.s2* %{{[0-9a-z]+}}, i32 0, i32 0) +// CHECK: call %union.anon* @llvm.preserve.union.access.index.p0s_union.anons.p0s_union.anons(%union.anon* %{{[0-9a-z]+}}, i32 0) +// CHECK: call %struct.s1* @llvm.preserve.array.access.index.p0s_struct.s1s.p0a3s_struct.s1s([3 x %struct.s1]* %{{[0-9a-z]+}}, i32 1, i32 2) +// CHECK: call i32* @llvm.preserve.struct.access.index.p0i32.p0s_struct.s1s(%struct.s1* %{{[0-9a-z]+}}, i32 0, i32 0) diff --git a/clang/test/CodeGen/bpf-attr-preserve-access-index-7.c b/clang/test/CodeGen/bpf-attr-preserve-access-index-7.c new file mode 100644 index 00000000000..49f4a4d2b26 --- /dev/null +++ b/clang/test/CodeGen/bpf-attr-preserve-access-index-7.c @@ -0,0 +1,36 @@ +// REQUIRES: bpf-registered-target +// RUN: %clang -target bpf -emit-llvm -S -g %s -o - | FileCheck %s + +#define __reloc__ __attribute__((preserve_access_index)) + +// chain of records, all with attributes +struct __reloc__ s1; +struct __reloc__ s2; +struct __reloc__ s3; + +struct s1 { + int c; +}; +typedef struct s1 __s1; + +struct s2 { + union { + __s1 b[3]; + }; +}; +typedef struct s2 __s2; + +struct s3 { + __s2 a; +}; +typedef struct s3 __s3; + +int test(__s3 *arg) { + return arg->a.b[2].c; +} + +// CHECK: call %struct.s2* @llvm.preserve.struct.access.index.p0s_struct.s2s.p0s_struct.s3s(%struct.s3* %{{[0-9a-z]+}}, i32 0, i32 0) +// CHECK: call %union.anon* @llvm.preserve.struct.access.index.p0s_union.anons.p0s_struct.s2s(%struct.s2* %{{[0-9a-z]+}}, i32 0, i32 0) +// CHECK: call %union.anon* @llvm.preserve.union.access.index.p0s_union.anons.p0s_union.anons(%union.anon* %{{[0-9a-z]+}}, i32 0) +// CHECK: call %struct.s1* @llvm.preserve.array.access.index.p0s_struct.s1s.p0a3s_struct.s1s([3 x %struct.s1]* %{{[0-9a-z]+}}, i32 1, i32 2) +// CHECK: call i32* @llvm.preserve.struct.access.index.p0i32.p0s_struct.s1s(%struct.s1* %{{[0-9a-z]+}}, i32 0, i32 0) diff --git a/clang/test/CodeGen/bpf-attr-preserve-access-index-8.c b/clang/test/CodeGen/bpf-attr-preserve-access-index-8.c new file mode 100644 index 00000000000..7febf7cbe2e --- /dev/null +++ b/clang/test/CodeGen/bpf-attr-preserve-access-index-8.c @@ -0,0 +1,36 @@ +// REQUIRES: bpf-registered-target +// RUN: %clang -target bpf -emit-llvm -S -g %s -o - | FileCheck %s + +#define __reloc__ __attribute__((preserve_access_index)) + +// chain of records, all with attributes +struct s1; +struct s2; +struct s3; + +struct s1 { + int c; +} __reloc__; +typedef struct s1 __s1; + +struct s2 { + union { + __s1 b[3]; + }; +} __reloc__; +typedef struct s2 __s2; + +struct s3 { + __s2 a; +} __reloc__; +typedef struct s3 __s3; + +int test(__s3 *arg) { + return arg->a.b[2].c; +} + +// CHECK: call %struct.s2* @llvm.preserve.struct.access.index.p0s_struct.s2s.p0s_struct.s3s(%struct.s3* %{{[0-9a-z]+}}, i32 0, i32 0) +// CHECK: call %union.anon* @llvm.preserve.struct.access.index.p0s_union.anons.p0s_struct.s2s(%struct.s2* %{{[0-9a-z]+}}, i32 0, i32 0) +// CHECK: call %union.anon* @llvm.preserve.union.access.index.p0s_union.anons.p0s_union.anons(%union.anon* %{{[0-9a-z]+}}, i32 0) +// CHECK: call %struct.s1* @llvm.preserve.array.access.index.p0s_struct.s1s.p0a3s_struct.s1s([3 x %struct.s1]* %{{[0-9a-z]+}}, i32 1, i32 2) +// CHECK: call i32* @llvm.preserve.struct.access.index.p0i32.p0s_struct.s1s(%struct.s1* %{{[0-9a-z]+}}, i32 0, i32 0) |