1+ ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
12; RUN: llc --force-dwarf-frame-section %s -o - | FileCheck %s
23; RUN: llc --filetype=obj %s -o - | llvm-readelf -s --unwind - | FileCheck %s --check-prefix=UNWIND
34target datalayout = "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64"
@@ -16,79 +17,112 @@ target triple = "thumbv8m.main-none-none-eabi"
1617; }
1718
1819define hidden i32 @f0 (i32 %x ) local_unnamed_addr "sign-return-address" ="non-leaf" {
20+ ; CHECK-LABEL: f0:
21+ ; CHECK: .cfi_sections .debug_frame
22+ ; CHECK-NEXT: .cfi_startproc
23+ ; CHECK-NEXT: @ %bb.0: @ %entry
24+ ; CHECK-NEXT: pac r12, lr, sp
25+ ; CHECK-NEXT: .save {r7, ra_auth_code, lr}
26+ ; CHECK-NEXT: push.w {r7, r12, lr}
27+ ; CHECK-NEXT: .cfi_def_cfa_offset 12
28+ ; CHECK-NEXT: .cfi_offset lr, -4
29+ ; CHECK-NEXT: .cfi_offset ra_auth_code, -8
30+ ; CHECK-NEXT: .cfi_offset r7, -12
31+ ; CHECK-NEXT: .pad #4
32+ ; CHECK-NEXT: sub sp, #4
33+ ; CHECK-NEXT: .cfi_def_cfa_offset 16
34+ ; CHECK-NEXT: subs r0, #1
35+ ; CHECK-NEXT: bl g
36+ ; CHECK-NEXT: adds r0, #1
37+ ; CHECK-NEXT: add sp, #4
38+ ; CHECK-NEXT: pop.w {r7, r12, lr}
39+ ; CHECK-NEXT: aut r12, lr, sp
40+ ; CHECK-NEXT: bx lr
1941entry:
2042 %sub = add nsw i32 %x , -1
2143 %call = tail call i32 @g (i32 %sub )
2244 %add = add nsw i32 %call , 1
2345 ret i32 %add
2446}
2547
26- ; CHECK-LABEL: f0:
27- ; CHECK: pac r12, lr, sp
28- ; CHECK-NEXT: .save {r7, lr}
29- ; CHECK-NEXT: push {r7, lr}
30- ; CHECK-NEXT: .cfi_def_cfa_offset 8
31- ; CHECK-NEXT: .cfi_offset lr, -4
32- ; CHECK-NEXT: .cfi_offset r7, -8
33- ; CHECK-NEXT: .save {ra_auth_code}
34- ; CHECK-NEXT: str r12, [sp, #-4]!
35- ; CHECK-NEXT: .cfi_def_cfa_offset 12
36- ; CHECK-NEXT: .cfi_offset ra_auth_code, -12
37- ; CHECK-NEXT: .pad #4
38- ; CHECK-NEXT: sub sp, #4
39- ; ...
40- ; CHECK: add sp, #4
41- ; CHECK-NEXT: ldr r12, [sp], #4
42- ; CHECK-NEXT: pop.w {r7, lr}
43- ; CHECK-NEXT: aut r12, lr, sp
44- ; CHECK-NEXT: bx lr
45-
4648define hidden i32 @f1 (i32 %x ) local_unnamed_addr #0 {
49+ ; CHECK-LABEL: f1:
50+ ; CHECK: .cfi_startproc
51+ ; CHECK-NEXT: @ %bb.0: @ %entry
52+ ; CHECK-NEXT: pac r12, lr, sp
53+ ; CHECK-NEXT: vstr fpcxtns, [sp, #-4]!
54+ ; CHECK-NEXT: .cfi_def_cfa_offset 4
55+ ; CHECK-NEXT: .save {r7, ra_auth_code, lr}
56+ ; CHECK-NEXT: push.w {r7, r12, lr}
57+ ; CHECK-NEXT: .cfi_def_cfa_offset 16
58+ ; CHECK-NEXT: .cfi_offset lr, -8
59+ ; CHECK-NEXT: .cfi_offset ra_auth_code, -12
60+ ; CHECK-NEXT: .cfi_offset r7, -16
61+ ; CHECK-NEXT: subs r0, #1
62+ ; CHECK-NEXT: bl g
63+ ; CHECK-NEXT: adds r0, #1
64+ ; CHECK-NEXT: pop.w {r7, r12, lr}
65+ ; CHECK-NEXT: vscclrm {s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, vpr}
66+ ; CHECK-NEXT: vldr fpcxtns, [sp], #4
67+ ; CHECK-NEXT: aut r12, lr, sp
68+ ; CHECK-NEXT: clrm {r1, r2, r3, r12, apsr}
69+ ; CHECK-NEXT: bxns lr
4770entry:
4871 %sub = add nsw i32 %x , -1
4972 %call = tail call i32 @g (i32 %sub )
5073 %add = add nsw i32 %call , 1
5174 ret i32 %add
5275}
5376
54- ; CHECK-LABEL: f1:
55- ; CHECK: pac r12, lr, sp
56- ; CHECK-NEXT: vstr fpcxtns, [sp, #-4]!
57- ; CHECK-NEXT: .cfi_def_cfa_offset 4
58- ; CHECK-NEXT: .save {r7, lr}
59- ; CHECK-NEXT: push {r7, lr}
60- ; CHECK: vldr fpcxtns, [sp], #4
61- ; CHECK: aut r12, lr, sp
62-
6377define hidden i32 @f2 (i32 %x ) local_unnamed_addr #1 {
78+ ; CHECK-LABEL: f2:
79+ ; CHECK: .cfi_startproc
80+ ; CHECK-NEXT: @ %bb.0: @ %entry
81+ ; CHECK-NEXT: pac r12, lr, sp
82+ ; CHECK-NEXT: .save {r7, ra_auth_code, lr}
83+ ; CHECK-NEXT: push.w {r7, r12, lr}
84+ ; CHECK-NEXT: .cfi_def_cfa_offset 12
85+ ; CHECK-NEXT: .cfi_offset lr, -4
86+ ; CHECK-NEXT: .cfi_offset ra_auth_code, -8
87+ ; CHECK-NEXT: .cfi_offset r7, -12
88+ ; CHECK-NEXT: .pad #4
89+ ; CHECK-NEXT: sub sp, #4
90+ ; CHECK-NEXT: .cfi_def_cfa_offset 16
91+ ; CHECK-NEXT: subs r0, #1
92+ ; CHECK-NEXT: bl g
93+ ; CHECK-NEXT: adds r0, #1
94+ ; CHECK-NEXT: add sp, #4
95+ ; CHECK-NEXT: pop.w {r7, r12, lr}
96+ ; CHECK-NEXT: aut r12, lr, sp
97+ ; CHECK-NEXT: mrs r12, control
98+ ; CHECK-NEXT: tst.w r12, #8
99+ ; CHECK-NEXT: beq .LBB2_2
100+ ; CHECK-NEXT: @ %bb.1: @ %entry
101+ ; CHECK-NEXT: vmrs r12, fpscr
102+ ; CHECK-NEXT: vmov d0, lr, lr
103+ ; CHECK-NEXT: vmov d1, lr, lr
104+ ; CHECK-NEXT: vmov d2, lr, lr
105+ ; CHECK-NEXT: vmov d3, lr, lr
106+ ; CHECK-NEXT: vmov d4, lr, lr
107+ ; CHECK-NEXT: vmov d5, lr, lr
108+ ; CHECK-NEXT: vmov d6, lr, lr
109+ ; CHECK-NEXT: vmov d7, lr, lr
110+ ; CHECK-NEXT: bic r12, r12, #159
111+ ; CHECK-NEXT: bic r12, r12, #4026531840
112+ ; CHECK-NEXT: vmsr fpscr, r12
113+ ; CHECK-NEXT: .LBB2_2: @ %entry
114+ ; CHECK-NEXT: mov r1, lr
115+ ; CHECK-NEXT: mov r2, lr
116+ ; CHECK-NEXT: mov r3, lr
117+ ; CHECK-NEXT: mov r12, lr
118+ ; CHECK-NEXT: msr apsr_nzcvq, lr
119+ ; CHECK-NEXT: bxns lr
64120entry:
65121 %sub = add nsw i32 %x , -1
66122 %call = tail call i32 @g (i32 %sub )
67123 %add = add nsw i32 %call , 1
68124 ret i32 %add
69125}
70- ; CHECK-LABEL: f2:
71- ; CHECK: pac r12, lr, sp
72- ; CHECK-NEXT: .save {r7, lr}
73- ; CHECK-NEXT: push {r7, lr}
74- ; CHECK-NEXT: .cfi_def_cfa_offset 8
75- ; CHECK-NEXT: .cfi_offset lr, -4
76- ; CHECK-NEXT: .cfi_offset r7, -8
77- ; CHECK-NEXT: .save {ra_auth_code}
78- ; CHECK-NEXT: str r12, [sp, #-4]!
79- ; CHECK-NEXT: .cfi_def_cfa_offset 12
80- ; CHECK-NEXT: .cfi_offset ra_auth_code, -12
81- ; CHECK-NEXT: .pad #4
82- ; CHECK-NEXT: sub sp, #4
83- ; CHECK-NEXT: .cfi_def_cfa_offset 16
84- ; ...
85- ; CHECK: add sp, #4
86- ; CHECK-NEXT: ldr r12, [sp], #4
87- ; CHECK-NEXT: pop.w {r7, lr}
88- ; CHECK-NEXT: aut r12, lr, sp
89- ; CHECK-NEXT: mrs r12, control
90- ; ...
91- ; CHECK: bxns lr
92126
93127declare dso_local i32 @g (i32 ) local_unnamed_addr
94128
@@ -103,22 +137,22 @@ attributes #1 = { "sign-return-address"="non-leaf" "cmse_nonsecure_entry" "targe
103137
104138; UNWIND-LABEL: FunctionAddress: 0x0
105139; UNWIND: 0x00 ; vsp = vsp + 4
140+ ; UNWIND-NEXT: 0x80 0x08 ; pop {r7}
106141; UNWIND-NEXT: 0xB4 ; pop ra_auth_code
107- ; UNWIND-NEXT: 0x84 0x08 ; pop {r7, lr}
108- ; UNWIND-NEXT: 0xB0 ; finish
109- ; UNWIND-NEXT: 0xB0 ; finish
142+ ; UNWIND-NEXT: 0x84 0x00 ; pop {lr}
110143
111- ; UNWIND-LABEL: FunctionAddress: 0x24
112- ; UNWIND: 0xB4 ; pop ra_auth_code
113- ; UNWIND-NEXT: 0x84 0x08 ; pop {r7, lr}
114144
115- ; UNWIND-LABEL: FunctionAddress: 0x54
145+ ; UNWIND-LABEL: FunctionAddress: 0x1E
146+ ; UNWIND: 0x80 0x08 ; pop {r7}
147+ ; UNWIND-NEXT: 0xB4 ; pop ra_auth_code
148+ ; UNWIND-NEXT: 0x84 0x00 ; pop {lr}
149+
150+ ; UNWIND-LABEL: FunctionAddress: 0x48
116151; UNWIND: 0x00 ; vsp = vsp + 4
152+ ; UNWIND-NEXT: 0x80 0x08 ; pop {r7}
117153; UNWIND-NEXT: 0xB4 ; pop ra_auth_code
118- ; UNWIND-NEXT: 0x84 0x08 ; pop {r7, lr}
119- ; UNWIND-NEXT: 0xB0 ; finish
120- ; UNWIND-NEXT: 0xB0 ; finish
154+ ; UNWIND-NEXT: 0x84 0x00 ; pop {lr}
121155
122156; UNWIND-LABEL: 00000001 {{.*}} f0
123- ; UNWIND-LABEL: 00000025 {{.*}} f1
124- ; UNWIND-LABEL: 00000055 {{.*}} f2
157+ ; UNWIND-LABEL: 0000001f {{.*}} f1
158+ ; UNWIND-LABEL: 00000049 {{.*}} f2
0 commit comments