• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
5 
6 typedef void fn_t(void);
7 fn_t s;
8 fn_t *p0 __attribute__((cmse_nonsecure_call));
9 
10 typedef fn_t *pfn_t __attribute__((cmse_nonsecure_call));
11 pfn_t p1;
12 pfn_t a0[4];
13 extern pfn_t a1[];
14 
15 typedef void (*pfn1_t)(int) __attribute__((cmse_nonsecure_call));
16 pfn1_t p2;
17 
18 typedef fn_t *apfn_t[4] __attribute__((cmse_nonsecure_call));
19 apfn_t a2;
20 
21 typedef pfn_t apfn1_t[4] __attribute__((cmse_nonsecure_call));
22 apfn1_t a3;
23 
24 typedef void (*apfn2_t[4])(void) __attribute__((cmse_nonsecure_call));
25 apfn2_t a4;
26 
27 void (*b[4])(int) __attribute__((cmse_nonsecure_call));
28 
f(int i)29 void f(int i) {
30   s();
31 // CHECK: call void @s() #[[#A1:]]
32 
33   p0();
34 // CHECK: %[[#P0:]] = load {{.*}} @p0
35 // CHECK: call void %[[#P0]]() #[[#A2:]]
36 
37   p1();
38 // CHECK: %[[#P1:]] = load {{.*}} @p1
39 // CHECK: call void %[[#P1]]() #[[#A2]]
40 
41   p2(i);
42 // CHECK: %[[#P2:]] = load {{.*}} @p2
43 // CHECK: call void %[[#P2]](i32 %i) #[[#A2]]
44 
45   a0[i]();
46 // CHECK: %[[EP0:.*]] = getelementptr {{.*}} @a0
47 // CHECK: %[[#E0:]] = load {{.*}} %[[EP0]]
48 // CHECK: call void %[[#E0]]() #[[#A2]]
49 
50   a1[i]();
51 // CHECK: %[[EP1:.*]] = getelementptr {{.*}} @a1
52 // CHECK: %[[#E1:]] = load {{.*}} %[[EP1]]
53 // CHECK: call void %[[#E1]]() #[[#A2]]
54 
55   a2[i]();
56 // CHECK: %[[EP2:.*]] = getelementptr {{.*}} @a2
57 // CHECK: %[[#E2:]] = load {{.*}} %[[EP2]]
58 // CHECK: call void %[[#E2]]() #[[#A2]]
59 
60   a3[i]();
61 // CHECK: %[[EP3:.*]] = getelementptr {{.*}} @a3
62 // CHECK: %[[#E3:]] = load {{.*}} %[[EP3]]
63 // CHECK: call void %[[#E3]]() #[[#A2]]
64 
65   a4[i]();
66 // CHECK: %[[EP4:.*]] = getelementptr {{.*}} @a4
67 // CHECK: %[[#E4:]] = load {{.*}} %[[EP4]]
68 // CHECK: call void %[[#E4]]() #[[#A2]]
69 
70   b[i](i);
71 // CHECK: %[[EP5:.*]] = getelementptr {{.*}} @b
72 // CHECK: %[[#E5:]] = load {{.*}} %[[EP5]]
73 // CHECK: call void %[[#E5]](i32 %i) #[[#A2]]
74 }
75 
76 // CHECK: attributes #[[#A1]] = { nounwind }
77 // CHECK: attributes #[[#A2]] = { nounwind "cmse_nonsecure_call"
78