[clang] Implement lifetime analysis for lifetime_capture_by(X) (#115921)
[llvm-project.git] / clang / test / CodeGen / arm-cmse-call.c
blob5041789d5300b5011509e78392cacbe477aee7c8
1 // RUN: %clang_cc1 -triple thumbv8m.base-none-eabi -mcmse -O1 -emit-llvm %s -o - 2>&1 | \
2 // RUN: FileCheck %s --check-prefix=CHECK
3 // RUN: %clang_cc1 -triple thumbebv8m.base-none-eabi -mcmse -O1 -emit-llvm %s -o - 2>&1 | \
4 // RUN: FileCheck %s --check-prefix=CHECK
6 typedef void fn_t(void);
7 fn_t s;
8 fn_t *p0 __attribute__((cmse_nonsecure_call));
10 typedef fn_t *pfn_t __attribute__((cmse_nonsecure_call));
11 pfn_t p1;
12 pfn_t a0[4];
13 extern pfn_t a1[];
15 typedef void (*pfn1_t)(int) __attribute__((cmse_nonsecure_call));
16 pfn1_t p2;
18 typedef fn_t *apfn_t[4] __attribute__((cmse_nonsecure_call));
19 apfn_t a2;
21 typedef pfn_t apfn1_t[4] __attribute__((cmse_nonsecure_call));
22 apfn1_t a3;
24 typedef void (*apfn2_t[4])(void) __attribute__((cmse_nonsecure_call));
25 apfn2_t a4;
27 void (*b[4])(int) __attribute__((cmse_nonsecure_call));
29 void f(int i) {
30 s();
31 // CHECK: call void @s() #[[#A1:]]
33 p0();
34 // CHECK: %[[#P0:]] = load {{.*}} @p0
35 // CHECK: call void %[[#P0]]() #[[#A2:]]
37 p1();
38 // CHECK: %[[#P1:]] = load {{.*}} @p1
39 // CHECK: call void %[[#P1]]() #[[#A2]]
41 p2(i);
42 // CHECK: %[[#P2:]] = load {{.*}} @p2
43 // CHECK: call void %[[#P2]](i32 noundef %i) #[[#A2]]
45 a0[i]();
46 // CHECK: %[[EP0:.*]] = getelementptr {{.*}} @a0
47 // CHECK: %[[#E0:]] = load {{.*}} %[[EP0]]
48 // CHECK: call void %[[#E0]]() #[[#A2]]
50 a1[i]();
51 // CHECK: %[[EP1:.*]] = getelementptr {{.*}} @a1
52 // CHECK: %[[#E1:]] = load {{.*}} %[[EP1]]
53 // CHECK: call void %[[#E1]]() #[[#A2]]
55 a2[i]();
56 // CHECK: %[[EP2:.*]] = getelementptr {{.*}} @a2
57 // CHECK: %[[#E2:]] = load {{.*}} %[[EP2]]
58 // CHECK: call void %[[#E2]]() #[[#A2]]
60 a3[i]();
61 // CHECK: %[[EP3:.*]] = getelementptr {{.*}} @a3
62 // CHECK: %[[#E3:]] = load {{.*}} %[[EP3]]
63 // CHECK: call void %[[#E3]]() #[[#A2]]
65 a4[i]();
66 // CHECK: %[[EP4:.*]] = getelementptr {{.*}} @a4
67 // CHECK: %[[#E4:]] = load {{.*}} %[[EP4]]
68 // CHECK: call void %[[#E4]]() #[[#A2]]
70 b[i](i);
71 // CHECK: %[[EP5:.*]] = getelementptr {{.*}} @b
72 // CHECK: %[[#E5:]] = load {{.*}} %[[EP5]]
73 // CHECK: call void %[[#E5]](i32 noundef %i) #[[#A2]]
76 // CHECK: attributes #[[#A1]] = { nounwind }
77 // CHECK: attributes #[[#A2]] = { nounwind "cmse_nonsecure_call"