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);
8 fn_t
*p0
__attribute__((cmse_nonsecure_call
));
10 typedef fn_t
*pfn_t
__attribute__((cmse_nonsecure_call
));
15 typedef void (*pfn1_t
)(int) __attribute__((cmse_nonsecure_call
));
18 typedef fn_t
*apfn_t
[4] __attribute__((cmse_nonsecure_call
));
21 typedef pfn_t apfn1_t
[4] __attribute__((cmse_nonsecure_call
));
24 typedef void (*apfn2_t
[4])(void) __attribute__((cmse_nonsecure_call
));
27 void (*b
[4])(int) __attribute__((cmse_nonsecure_call
));
31 // CHECK: call void @s() #[[#A1:]]
34 // CHECK: %[[#P0:]] = load {{.*}} @p0
35 // CHECK: call void %[[#P0]]() #[[#A2:]]
38 // CHECK: %[[#P1:]] = load {{.*}} @p1
39 // CHECK: call void %[[#P1]]() #[[#A2]]
42 // CHECK: %[[#P2:]] = load {{.*}} @p2
43 // CHECK: call void %[[#P2]](i32 noundef %i) #[[#A2]]
46 // CHECK: %[[EP0:.*]] = getelementptr {{.*}} @a0
47 // CHECK: %[[#E0:]] = load {{.*}} %[[EP0]]
48 // CHECK: call void %[[#E0]]() #[[#A2]]
51 // CHECK: %[[EP1:.*]] = getelementptr {{.*}} @a1
52 // CHECK: %[[#E1:]] = load {{.*}} %[[EP1]]
53 // CHECK: call void %[[#E1]]() #[[#A2]]
56 // CHECK: %[[EP2:.*]] = getelementptr {{.*}} @a2
57 // CHECK: %[[#E2:]] = load {{.*}} %[[EP2]]
58 // CHECK: call void %[[#E2]]() #[[#A2]]
61 // CHECK: %[[EP3:.*]] = getelementptr {{.*}} @a3
62 // CHECK: %[[#E3:]] = load {{.*}} %[[EP3]]
63 // CHECK: call void %[[#E3]]() #[[#A2]]
66 // CHECK: %[[EP4:.*]] = getelementptr {{.*}} @a4
67 // CHECK: %[[#E4:]] = load {{.*}} %[[EP4]]
68 // CHECK: call void %[[#E4]]() #[[#A2]]
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"