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)29void 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