| // RUN: %clang_cc1 -triple thumbv8m.base-none-eabi -mcmse -O1 -emit-llvm %s -o - 2>&1 | \ |
| // RUN: FileCheck %s --check-prefix=CHECK |
| // RUN: %clang_cc1 -triple thumbebv8m.base-none-eabi -mcmse -O1 -emit-llvm %s -o - 2>&1 | \ |
| // RUN: FileCheck %s --check-prefix=CHECK |
| |
| typedef void fn_t(void); |
| fn_t s; |
| fn_t *p0 __attribute__((cmse_nonsecure_call)); |
| |
| typedef fn_t *pfn_t __attribute__((cmse_nonsecure_call)); |
| pfn_t p1; |
| pfn_t a0[4]; |
| extern pfn_t a1[]; |
| |
| typedef void (*pfn1_t)(int) __attribute__((cmse_nonsecure_call)); |
| pfn1_t p2; |
| |
| typedef fn_t *apfn_t[4] __attribute__((cmse_nonsecure_call)); |
| apfn_t a2; |
| |
| typedef pfn_t apfn1_t[4] __attribute__((cmse_nonsecure_call)); |
| apfn1_t a3; |
| |
| typedef void (*apfn2_t[4])(void) __attribute__((cmse_nonsecure_call)); |
| apfn2_t a4; |
| |
| void (*b[4])(int) __attribute__((cmse_nonsecure_call)); |
| |
| void f(int i) { |
| s(); |
| // CHECK: call void @s() #[[#A1:]] |
| |
| p0(); |
| // CHECK: %[[#P0:]] = load {{.*}} @p0 |
| // CHECK: call void %[[#P0]]() #[[#A2:]] |
| |
| p1(); |
| // CHECK: %[[#P1:]] = load {{.*}} @p1 |
| // CHECK: call void %[[#P1]]() #[[#A2]] |
| |
| p2(i); |
| // CHECK: %[[#P2:]] = load {{.*}} @p2 |
| // CHECK: call void %[[#P2]](i32 %i) #[[#A2]] |
| |
| a0[i](); |
| // CHECK: %[[EP0:.*]] = getelementptr {{.*}} @a0 |
| // CHECK: %[[#E0:]] = load {{.*}} %[[EP0]] |
| // CHECK: call void %[[#E0]]() #[[#A2]] |
| |
| a1[i](); |
| // CHECK: %[[EP1:.*]] = getelementptr {{.*}} @a1 |
| // CHECK: %[[#E1:]] = load {{.*}} %[[EP1]] |
| // CHECK: call void %[[#E1]]() #[[#A2]] |
| |
| a2[i](); |
| // CHECK: %[[EP2:.*]] = getelementptr {{.*}} @a2 |
| // CHECK: %[[#E2:]] = load {{.*}} %[[EP2]] |
| // CHECK: call void %[[#E2]]() #[[#A2]] |
| |
| a3[i](); |
| // CHECK: %[[EP3:.*]] = getelementptr {{.*}} @a3 |
| // CHECK: %[[#E3:]] = load {{.*}} %[[EP3]] |
| // CHECK: call void %[[#E3]]() #[[#A2]] |
| |
| a4[i](); |
| // CHECK: %[[EP4:.*]] = getelementptr {{.*}} @a4 |
| // CHECK: %[[#E4:]] = load {{.*}} %[[EP4]] |
| // CHECK: call void %[[#E4]]() #[[#A2]] |
| |
| b[i](i); |
| // CHECK: %[[EP5:.*]] = getelementptr {{.*}} @b |
| // CHECK: %[[#E5:]] = load {{.*}} %[[EP5]] |
| // CHECK: call void %[[#E5]](i32 %i) #[[#A2]] |
| } |
| |
| // CHECK: attributes #[[#A1]] = { nounwind } |
| // CHECK: attributes #[[#A2]] = { nounwind "cmse_nonsecure_call" |