1
+ ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
1
2
; RUN: llc --force-dwarf-frame-section %s -o - | FileCheck %s
2
3
; RUN: llc --filetype=obj %s -o - | llvm-readelf -s --unwind - | FileCheck %s --check-prefix=UNWIND
3
4
target 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"
16
17
; }
17
18
18
19
define 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
19
41
entry:
20
42
%sub = add nsw i32 %x , -1
21
43
%call = tail call i32 @g (i32 %sub )
22
44
%add = add nsw i32 %call , 1
23
45
ret i32 %add
24
46
}
25
47
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
-
46
48
define 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
47
70
entry:
48
71
%sub = add nsw i32 %x , -1
49
72
%call = tail call i32 @g (i32 %sub )
50
73
%add = add nsw i32 %call , 1
51
74
ret i32 %add
52
75
}
53
76
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
-
63
77
define 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
64
120
entry:
65
121
%sub = add nsw i32 %x , -1
66
122
%call = tail call i32 @g (i32 %sub )
67
123
%add = add nsw i32 %call , 1
68
124
ret i32 %add
69
125
}
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
92
126
93
127
declare dso_local i32 @g (i32 ) local_unnamed_addr
94
128
@@ -103,22 +137,22 @@ attributes #1 = { "sign-return-address"="non-leaf" "cmse_nonsecure_entry" "targe
103
137
104
138
; UNWIND-LABEL: FunctionAddress: 0x0
105
139
; UNWIND: 0x00 ; vsp = vsp + 4
140
+ ; UNWIND-NEXT: 0x80 0x08 ; pop {r7}
106
141
; 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}
110
143
111
- ; UNWIND-LABEL: FunctionAddress: 0x24
112
- ; UNWIND: 0xB4 ; pop ra_auth_code
113
- ; UNWIND-NEXT: 0x84 0x08 ; pop {r7, lr}
114
144
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
116
151
; UNWIND: 0x00 ; vsp = vsp + 4
152
+ ; UNWIND-NEXT: 0x80 0x08 ; pop {r7}
117
153
; 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}
121
155
122
156
; 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