78 lines · c
1// RUN: %clang_cc1 -triple thumbv8m.base-none-eabi -mcmse -O1 -emit-llvm %s -o - 2>&1 | \2// RUN: FileCheck %s --check-prefix=CHECK3// RUN: %clang_cc1 -triple thumbebv8m.base-none-eabi -mcmse -O1 -emit-llvm %s -o - 2>&1 | \4// RUN: FileCheck %s --check-prefix=CHECK5 6typedef void fn_t(void);7fn_t s;8fn_t *p0 __attribute__((cmse_nonsecure_call));9 10typedef fn_t *pfn_t __attribute__((cmse_nonsecure_call));11pfn_t p1;12pfn_t a0[4];13extern pfn_t a1[];14 15typedef void (*pfn1_t)(int) __attribute__((cmse_nonsecure_call));16pfn1_t p2;17 18typedef fn_t *apfn_t[4] __attribute__((cmse_nonsecure_call));19apfn_t a2;20 21typedef pfn_t apfn1_t[4] __attribute__((cmse_nonsecure_call));22apfn1_t a3;23 24typedef void (*apfn2_t[4])(void) __attribute__((cmse_nonsecure_call));25apfn2_t a4;26 27void (*b[4])(int) __attribute__((cmse_nonsecure_call));28 29void f(int i) {30 s();31// CHECK: call void @s() #[[#A1:]]32 33 p0();34// CHECK: %[[#P0:]] = load {{.*}} @p035// CHECK: call void %[[#P0]]() #[[#A2:]]36 37 p1();38// CHECK: %[[#P1:]] = load {{.*}} @p139// CHECK: call void %[[#P1]]() #[[#A2]]40 41 p2(i);42// CHECK: %[[#P2:]] = load {{.*}} @p243// CHECK: call void %[[#P2]](i32 noundef %i) #[[#A2]]44 45 a0[i]();46// CHECK: %[[EP0:.*]] = getelementptr {{.*}} @a047// CHECK: %[[#E0:]] = load {{.*}} %[[EP0]]48// CHECK: call void %[[#E0]]() #[[#A2]]49 50 a1[i]();51// CHECK: %[[EP1:.*]] = getelementptr {{.*}} @a152// CHECK: %[[#E1:]] = load {{.*}} %[[EP1]]53// CHECK: call void %[[#E1]]() #[[#A2]]54 55 a2[i]();56// CHECK: %[[EP2:.*]] = getelementptr {{.*}} @a257// CHECK: %[[#E2:]] = load {{.*}} %[[EP2]]58// CHECK: call void %[[#E2]]() #[[#A2]]59 60 a3[i]();61// CHECK: %[[EP3:.*]] = getelementptr {{.*}} @a362// CHECK: %[[#E3:]] = load {{.*}} %[[EP3]]63// CHECK: call void %[[#E3]]() #[[#A2]]64 65 a4[i]();66// CHECK: %[[EP4:.*]] = getelementptr {{.*}} @a467// CHECK: %[[#E4:]] = load {{.*}} %[[EP4]]68// CHECK: call void %[[#E4]]() #[[#A2]]69 70 b[i](i);71// CHECK: %[[EP5:.*]] = getelementptr {{.*}} @b72// CHECK: %[[#E5:]] = load {{.*}} %[[EP5]]73// CHECK: call void %[[#E5]](i32 noundef %i) #[[#A2]]74}75 76// CHECK: attributes #[[#A1]] = { nounwind }77// CHECK: attributes #[[#A2]] = { nounwind "cmse_nonsecure_call"78