Skip to content

Commit d069a19

Browse files
committed
[TSan] Improve handling of stack pointer mangling in {set,long}jmp, pt.6
Cleanup ARM64 assembly after removing unnecessary computation of mangled stack pointer in previous commit. llvm-svn: 366258
1 parent f8c8284 commit d069a19

File tree

1 file changed

+44
-45
lines changed

1 file changed

+44
-45
lines changed

compiler-rt/lib/tsan/rtl/tsan_rtl_aarch64.S

+44-45
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ ASM_TYPE_FUNCTION(ASM_SYMBOL_INTERCEPTOR(setjmp))
3939
ASM_SYMBOL_INTERCEPTOR(setjmp):
4040
CFI_STARTPROC
4141

42-
// save env parameters for function call
42+
// Save frame/link register
4343
stp x29, x30, [sp, -32]!
4444
CFI_DEF_CFA_OFFSET (32)
4545
CFI_OFFSET (29, -32)
@@ -49,23 +49,24 @@ ASM_SYMBOL_INTERCEPTOR(setjmp):
4949
add x29, sp, 0
5050
CFI_DEF_CFA_REGISTER (29)
5151

52-
// Save jmp_buf
53-
str x19, [sp, 16]
54-
CFI_OFFSET (19, -16)
55-
mov x19, x0
52+
// Save env parameter
53+
str x0, [sp, 16]
54+
CFI_OFFSET (0, -16)
5655

5756
// Obtain SP, first argument to `void __tsan_setjmp(uptr sp)`
5857
add x0, x29, 32
5958

6059
// call tsan interceptor
6160
bl ASM_SYMBOL(__tsan_setjmp)
6261

63-
// restore env parameter
64-
mov x0, x19
65-
ldr x19, [sp, 16]
62+
// Restore env parameter
63+
ldr x0, [sp, 16]
64+
CFI_RESTORE (0)
65+
66+
// Restore frame/link register
6667
ldp x29, x30, [sp], 32
68+
CFI_RESTORE (29)
6769
CFI_RESTORE (30)
68-
CFI_RESTORE (19)
6970
CFI_DEF_CFA (31, 0)
7071

7172
// tail jump to libc setjmp
@@ -89,7 +90,7 @@ ASM_TYPE_FUNCTION(ASM_SYMBOL_INTERCEPTOR(_setjmp))
8990
ASM_SYMBOL_INTERCEPTOR(_setjmp):
9091
CFI_STARTPROC
9192

92-
// save env parameters for function call
93+
// Save frame/link register
9394
stp x29, x30, [sp, -32]!
9495
CFI_DEF_CFA_OFFSET (32)
9596
CFI_OFFSET (29, -32)
@@ -99,23 +100,24 @@ ASM_SYMBOL_INTERCEPTOR(_setjmp):
99100
add x29, sp, 0
100101
CFI_DEF_CFA_REGISTER (29)
101102

102-
// Save jmp_buf
103-
str x19, [sp, 16]
104-
CFI_OFFSET (19, -16)
105-
mov x19, x0
103+
// Save env parameter
104+
str x0, [sp, 16]
105+
CFI_OFFSET (0, -16)
106106

107107
// Obtain SP, first argument to `void __tsan_setjmp(uptr sp)`
108108
add x0, x29, 32
109109

110110
// call tsan interceptor
111111
bl ASM_SYMBOL(__tsan_setjmp)
112112

113-
// Restore jmp_buf parameter
114-
mov x0, x19
115-
ldr x19, [sp, 16]
113+
// Restore env parameter
114+
ldr x0, [sp, 16]
115+
CFI_RESTORE (0)
116+
117+
// Restore frame/link register
116118
ldp x29, x30, [sp], 32
119+
CFI_RESTORE (29)
117120
CFI_RESTORE (30)
118-
CFI_RESTORE (19)
119121
CFI_DEF_CFA (31, 0)
120122

121123
// tail jump to libc setjmp
@@ -139,7 +141,7 @@ ASM_TYPE_FUNCTION(ASM_SYMBOL_INTERCEPTOR(sigsetjmp))
139141
ASM_SYMBOL_INTERCEPTOR(sigsetjmp):
140142
CFI_STARTPROC
141143

142-
// save env parameters for function call
144+
// Save frame/link register
143145
stp x29, x30, [sp, -32]!
144146
CFI_DEF_CFA_OFFSET (32)
145147
CFI_OFFSET (29, -32)
@@ -149,28 +151,26 @@ ASM_SYMBOL_INTERCEPTOR(sigsetjmp):
149151
add x29, sp, 0
150152
CFI_DEF_CFA_REGISTER (29)
151153

152-
// Save jmp_buf and savesigs
153-
stp x19, x20, [sp, 16]
154-
CFI_OFFSET (19, -16)
155-
CFI_OFFSET (20, -8)
156-
mov w20, w1
157-
mov x19, x0
154+
// Save env and savesigs parameter
155+
stp x0, x1, [sp, 16]
156+
CFI_OFFSET (0, -16)
157+
CFI_OFFSET (1, -8)
158158

159159
// Obtain SP, first argument to `void __tsan_setjmp(uptr sp)`
160160
add x0, x29, 32
161161

162162
// call tsan interceptor
163163
bl ASM_SYMBOL(__tsan_setjmp)
164164

165-
// restore env parameter
166-
mov w1, w20
167-
mov x0, x19
168-
ldp x19, x20, [sp, 16]
165+
// Restore env and savesigs parameter
166+
ldp x0, x1, [sp, 16]
167+
CFI_RESTORE (0)
168+
CFI_RESTORE (1)
169+
170+
// Restore frame/link register
169171
ldp x29, x30, [sp], 32
170-
CFI_RESTORE (30)
171172
CFI_RESTORE (29)
172-
CFI_RESTORE (19)
173-
CFI_RESTORE (20)
173+
CFI_RESTORE (30)
174174
CFI_DEF_CFA (31, 0)
175175

176176
// tail jump to libc sigsetjmp
@@ -194,7 +194,7 @@ ASM_TYPE_FUNCTION(ASM_SYMBOL_INTERCEPTOR(__sigsetjmp))
194194
ASM_SYMBOL_INTERCEPTOR(__sigsetjmp):
195195
CFI_STARTPROC
196196

197-
// save env parameters for function call
197+
// Save frame/link register
198198
stp x29, x30, [sp, -32]!
199199
CFI_DEF_CFA_OFFSET (32)
200200
CFI_OFFSET (29, -32)
@@ -204,27 +204,26 @@ ASM_SYMBOL_INTERCEPTOR(__sigsetjmp):
204204
add x29, sp, 0
205205
CFI_DEF_CFA_REGISTER (29)
206206

207-
// Save jmp_buf and savesigs
208-
stp x19, x20, [sp, 16]
209-
CFI_OFFSET (19, -16)
210-
CFI_OFFSET (20, -8)
211-
mov w20, w1
212-
mov x19, x0
207+
// Save env and savesigs parameter
208+
stp x0, x1, [sp, 16]
209+
CFI_OFFSET (0, -16)
210+
CFI_OFFSET (1, -8)
213211

214212
// Obtain SP, first argument to `void __tsan_setjmp(uptr sp)`
215213
add x0, x29, 32
216214

217215
// call tsan interceptor
218216
bl ASM_SYMBOL(__tsan_setjmp)
219217

220-
mov w1, w20
221-
mov x0, x19
222-
ldp x19, x20, [sp, 16]
218+
// Restore env and savesigs parameter
219+
ldp x0, x1, [sp, 16]
220+
CFI_RESTORE (0)
221+
CFI_RESTORE (1)
222+
223+
// Restore frame/link register
223224
ldp x29, x30, [sp], 32
224-
CFI_RESTORE (30)
225225
CFI_RESTORE (29)
226-
CFI_RESTORE (19)
227-
CFI_RESTORE (20)
226+
CFI_RESTORE (30)
228227
CFI_DEF_CFA (31, 0)
229228

230229
// tail jump to libc __sigsetjmp

0 commit comments

Comments
 (0)