Skip to content

Commit 2f29d3b

Browse files
committed
Preserve the base pointer, and don't use the nest parameter or GOT pointer for arguments
1 parent 50cce89 commit 2f29d3b

File tree

5 files changed

+89
-84
lines changed

5 files changed

+89
-84
lines changed

clang/include/clang/Basic/AttrDocs.td

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6440,9 +6440,9 @@ also uses more general registers to pass arguments. This attribute doesn't
64406440
impact floating-point registers. ``preserve_none``'s ABI is still unstable, and
64416441
may be changed in the future.
64426442

6443-
- On X86, only ESP and EBP are preserved by the callee. Registers EDI, ESI, EDX,
6444-
ECX, and EAX now can be used to pass function arguments.
6445-
- On X86-64, only RSP and RBP are preserved by the callee.
6443+
- On X86, only ESP, EBP, and ESI are preserved by the callee. Registers EDI,
6444+
EDX, and EAX now can be used to pass function arguments.
6445+
- On X86-64, only RSP, RBP, and RBX are preserved by the callee.
64466446
Registers R12, R13, R14, R15, RDI, RSI, RDX, RCX, R8, R9, R11, and RAX now can
64476447
be used to pass function arguments. Floating-point registers (XMMs/YMMs) still
64486448
follow the C calling convention.

llvm/lib/Target/X86/X86CallingConv.td

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1052,8 +1052,12 @@ def CC_X86_64_Preserve_None : CallingConv<[
10521052
]>;
10531053

10541054
def CC_X86_32_Preserve_None : CallingConv<[
1055-
// 32-bit variant of CC_X86_64_Preserve_None, above.
1056-
CCIfType<[i32], CCAssignToReg<[EDI, ESI, EDX, ECX, EAX]>>,
1055+
// 32-bit variant of CC_X86_64_Preserve_None, above. Use everything except:
1056+
// - EBP frame pointer
1057+
// - ECX 'nest' parameter
1058+
// - ESI base pointer
1059+
// - EBX GOT pointer for PLT calls
1060+
CCIfType<[i32], CCAssignToReg<[EDI, EDX, EAX]>>,
10571061
CCDelegateTo<CC_X86_32_C>
10581062
]>;
10591063

@@ -1193,8 +1197,8 @@ def CSR_64_AllRegs_AVX512 : CalleeSavedRegs<(sub (add CSR_64_MostRegs, RAX,
11931197
(sequence "ZMM%u", 0, 31),
11941198
(sequence "K%u", 0, 7)),
11951199
(sequence "XMM%u", 0, 15))>;
1196-
def CSR_64_NoneRegs : CalleeSavedRegs<(add RBP)>;
1197-
def CSR_32_NoneRegs : CalleeSavedRegs<(add EBP)>;
1200+
def CSR_64_NoneRegs : CalleeSavedRegs<(add RBP, RBX)>;
1201+
def CSR_32_NoneRegs : CalleeSavedRegs<(add EBP, ESI)>;
11981202

11991203
// Standard C + YMM6-15
12001204
def CSR_Win64_Intel_OCL_BI_AVX : CalleeSavedRegs<(add RBX, RBP, RDI, RSI, R12,

llvm/test/CodeGen/X86/preserve_nonecc64.ll

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,12 @@
1010
define preserve_nonecc RETTYPE @preserve_nonecc1(i64, i64, double, double) nounwind {
1111
entry:
1212
;ALL-LABEL: preserve_nonecc1
13-
;ALL: pushq %rbp
13+
;ALL: pushq %rbx
14+
;ALL-NEXT: pushq %rbp
1415
;ALL-NEXT: InlineAsm Start
1516
;ALL-NEXT: InlineAsm End
1617
;ALL-NEXT: popq %rbp
18+
;ALL-NEXT: popq %rbx
1719
;ALL-NEXT: retq
1820
call void asm sideeffect "", "~{rax},~{rbx},~{rcx},~{rdx},~{rsi},~{rdi},~{r8},~{r9},~{r10},~{r11},~{r12},~{r13},~{r14},~{r15},~{rbp},~{xmm0},~{xmm1},~{xmm2},~{xmm3},~{xmm4},~{xmm5},~{xmm6},~{xmm7},~{xmm8},~{xmm9},~{xmm10},~{xmm11},~{xmm12},~{xmm13},~{xmm14},~{xmm15}"()
1921
ret RETTYPE RETVAL

llvm/test/CodeGen/X86/preserve_nonecc_call.ll

Lines changed: 60 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -21,16 +21,15 @@ define void @caller1(ptr %a) {
2121
; X64-NEXT: .cfi_def_cfa_offset 32
2222
; X64-NEXT: pushq %r12
2323
; X64-NEXT: .cfi_def_cfa_offset 40
24-
; X64-NEXT: pushq %rbx
24+
; X64-NEXT: pushq %rax
2525
; X64-NEXT: .cfi_def_cfa_offset 48
26-
; X64-NEXT: .cfi_offset %rbx, -48
2726
; X64-NEXT: .cfi_offset %r12, -40
2827
; X64-NEXT: .cfi_offset %r13, -32
2928
; X64-NEXT: .cfi_offset %r14, -24
3029
; X64-NEXT: .cfi_offset %r15, -16
3130
; X64-NEXT: movq %rdi, %r12
3231
; X64-NEXT: callq callee@PLT
33-
; X64-NEXT: popq %rbx
32+
; X64-NEXT: addq $8, %rsp
3433
; X64-NEXT: .cfi_def_cfa_offset 40
3534
; X64-NEXT: popq %r12
3635
; X64-NEXT: .cfi_def_cfa_offset 32
@@ -48,15 +47,10 @@ define void @caller1(ptr %a) {
4847
; X86-NEXT: .cfi_def_cfa_offset 8
4948
; X86-NEXT: pushl %edi
5049
; X86-NEXT: .cfi_def_cfa_offset 12
51-
; X86-NEXT: pushl %esi
52-
; X86-NEXT: .cfi_def_cfa_offset 16
53-
; X86-NEXT: .cfi_offset %esi, -16
5450
; X86-NEXT: .cfi_offset %edi, -12
5551
; X86-NEXT: .cfi_offset %ebx, -8
5652
; X86-NEXT: movl {{[0-9]+}}(%esp), %edi
5753
; X86-NEXT: calll callee@PLT
58-
; X86-NEXT: popl %esi
59-
; X86-NEXT: .cfi_def_cfa_offset 12
6054
; X86-NEXT: popl %edi
6155
; X86-NEXT: .cfi_def_cfa_offset 8
6256
; X86-NEXT: popl %ebx
@@ -106,16 +100,14 @@ define preserve_nonecc i64 @callee_with_12_params(i64 %a1, i64 %a2, i64 %a3, i64
106100
;
107101
; X86-LABEL: callee_with_12_params:
108102
; X86: # %bb.0:
109-
; X86-NEXT: pushl %ebp
110-
; X86-NEXT: .cfi_def_cfa_offset 8
111-
; X86-NEXT: .cfi_offset %ebp, -8
112-
; X86-NEXT: movl %edx, %edi
113-
; X86-NEXT: movl {{[0-9]+}}(%esp), %ebx
114-
; X86-NEXT: movl {{[0-9]+}}(%esp), %ebp
115-
; X86-NEXT: movl %ecx, %esi
116-
; X86-NEXT: movl %eax, %edx
117-
; X86-NEXT: movl %ebx, %ecx
118-
; X86-NEXT: movl %ebp, %eax
103+
; X86-NEXT: movl {{[0-9]+}}(%esp), %edx
104+
; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
105+
; X86-NEXT: movl %eax, %edi
106+
; X86-NEXT: movl %ecx, %eax
107+
; X86-NEXT: pushl {{[0-9]+}}(%esp)
108+
; X86-NEXT: .cfi_adjust_cfa_offset 4
109+
; X86-NEXT: pushl {{[0-9]+}}(%esp)
110+
; X86-NEXT: .cfi_adjust_cfa_offset 4
119111
; X86-NEXT: pushl {{[0-9]+}}(%esp)
120112
; X86-NEXT: .cfi_adjust_cfa_offset 4
121113
; X86-NEXT: pushl {{[0-9]+}}(%esp)
@@ -151,10 +143,8 @@ define preserve_nonecc i64 @callee_with_12_params(i64 %a1, i64 %a2, i64 %a3, i64
151143
; X86-NEXT: pushl {{[0-9]+}}(%esp)
152144
; X86-NEXT: .cfi_adjust_cfa_offset 4
153145
; X86-NEXT: calll callee_with_11_params@PLT
154-
; X86-NEXT: addl $68, %esp
155-
; X86-NEXT: .cfi_adjust_cfa_offset -68
156-
; X86-NEXT: popl %ebp
157-
; X86-NEXT: .cfi_def_cfa_offset 4
146+
; X86-NEXT: addl $76, %esp
147+
; X86-NEXT: .cfi_adjust_cfa_offset -76
158148
; X86-NEXT: retl
159149
%ret = call preserve_nonecc i64 @callee_with_11_params(i64 %a2, i64 %a3, i64 %a4, i64 %a5, i64 %a6, i64 %a7, i64 %a8, i64 %a9, i64 %a10, i64 %a11, i64 %a12)
160150
ret i64 %ret
@@ -171,9 +161,8 @@ define i64 @caller3() {
171161
; X64-NEXT: .cfi_def_cfa_offset 32
172162
; X64-NEXT: pushq %r12
173163
; X64-NEXT: .cfi_def_cfa_offset 40
174-
; X64-NEXT: pushq %rbx
164+
; X64-NEXT: pushq %rax
175165
; X64-NEXT: .cfi_def_cfa_offset 48
176-
; X64-NEXT: .cfi_offset %rbx, -48
177166
; X64-NEXT: .cfi_offset %r12, -40
178167
; X64-NEXT: .cfi_offset %r13, -32
179168
; X64-NEXT: .cfi_offset %r14, -24
@@ -191,7 +180,7 @@ define i64 @caller3() {
191180
; X64-NEXT: movl $11, %r11d
192181
; X64-NEXT: movl $12, %eax
193182
; X64-NEXT: callq callee_with_12_params@PLT
194-
; X64-NEXT: popq %rbx
183+
; X64-NEXT: addq $8, %rsp
195184
; X64-NEXT: .cfi_def_cfa_offset 40
196185
; X64-NEXT: popq %r12
197186
; X64-NEXT: .cfi_def_cfa_offset 32
@@ -209,16 +198,11 @@ define i64 @caller3() {
209198
; X86-NEXT: .cfi_def_cfa_offset 8
210199
; X86-NEXT: pushl %edi
211200
; X86-NEXT: .cfi_def_cfa_offset 12
212-
; X86-NEXT: pushl %esi
213-
; X86-NEXT: .cfi_def_cfa_offset 16
214-
; X86-NEXT: .cfi_offset %esi, -16
215201
; X86-NEXT: .cfi_offset %edi, -12
216202
; X86-NEXT: .cfi_offset %ebx, -8
217203
; X86-NEXT: movl $1, %edi
218-
; X86-NEXT: xorl %esi, %esi
219-
; X86-NEXT: movl $2, %edx
220-
; X86-NEXT: xorl %ecx, %ecx
221-
; X86-NEXT: movl $3, %eax
204+
; X86-NEXT: xorl %edx, %edx
205+
; X86-NEXT: movl $2, %eax
222206
; X86-NEXT: pushl $0
223207
; X86-NEXT: .cfi_adjust_cfa_offset 4
224208
; X86-NEXT: pushl $12
@@ -257,11 +241,13 @@ define i64 @caller3() {
257241
; X86-NEXT: .cfi_adjust_cfa_offset 4
258242
; X86-NEXT: pushl $0
259243
; X86-NEXT: .cfi_adjust_cfa_offset 4
244+
; X86-NEXT: pushl $3
245+
; X86-NEXT: .cfi_adjust_cfa_offset 4
246+
; X86-NEXT: pushl $0
247+
; X86-NEXT: .cfi_adjust_cfa_offset 4
260248
; X86-NEXT: calll callee_with_12_params@PLT
261-
; X86-NEXT: addl $76, %esp
262-
; X86-NEXT: .cfi_adjust_cfa_offset -76
263-
; X86-NEXT: popl %esi
264-
; X86-NEXT: .cfi_def_cfa_offset 12
249+
; X86-NEXT: addl $84, %esp
250+
; X86-NEXT: .cfi_adjust_cfa_offset -84
265251
; X86-NEXT: popl %edi
266252
; X86-NEXT: .cfi_def_cfa_offset 8
267253
; X86-NEXT: popl %ebx
@@ -288,11 +274,15 @@ define preserve_nonecc i32 @callee_with_5_params(i32 %a1, i32 %a2, i32 %a3, i32
288274
;
289275
; X86-LABEL: callee_with_5_params:
290276
; X86: # %bb.0:
291-
; X86-NEXT: movl %esi, %edi
292-
; X86-NEXT: movl %edx, %esi
293-
; X86-NEXT: movl %ecx, %edx
294-
; X86-NEXT: movl %eax, %ecx
277+
; X86-NEXT: movl %edx, %edi
278+
; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
279+
; X86-NEXT: movl %eax, %edx
280+
; X86-NEXT: movl %ecx, %eax
281+
; X86-NEXT: pushl {{[0-9]+}}(%esp)
282+
; X86-NEXT: .cfi_adjust_cfa_offset 4
295283
; X86-NEXT: calll callee_with_4_params@PLT
284+
; X86-NEXT: addl $4, %esp
285+
; X86-NEXT: .cfi_adjust_cfa_offset -4
296286
; X86-NEXT: retl
297287
%ret = call preserve_nonecc i32 @callee_with_4_params(i32 %a2, i32 %a3, i32 %a4, i32 %a5)
298288
ret i32 %ret
@@ -309,9 +299,8 @@ define i32 @caller4() {
309299
; X64-NEXT: .cfi_def_cfa_offset 32
310300
; X64-NEXT: pushq %r12
311301
; X64-NEXT: .cfi_def_cfa_offset 40
312-
; X64-NEXT: pushq %rbx
302+
; X64-NEXT: pushq %rax
313303
; X64-NEXT: .cfi_def_cfa_offset 48
314-
; X64-NEXT: .cfi_offset %rbx, -48
315304
; X64-NEXT: .cfi_offset %r12, -40
316305
; X64-NEXT: .cfi_offset %r13, -32
317306
; X64-NEXT: .cfi_offset %r14, -24
@@ -322,7 +311,7 @@ define i32 @caller4() {
322311
; X64-NEXT: movl $4, %r15d
323312
; X64-NEXT: movl $5, %edi
324313
; X64-NEXT: callq callee_with_5_params@PLT
325-
; X64-NEXT: popq %rbx
314+
; X64-NEXT: addq $8, %rsp
326315
; X64-NEXT: .cfi_def_cfa_offset 40
327316
; X64-NEXT: popq %r12
328317
; X64-NEXT: .cfi_def_cfa_offset 32
@@ -340,19 +329,18 @@ define i32 @caller4() {
340329
; X86-NEXT: .cfi_def_cfa_offset 8
341330
; X86-NEXT: pushl %edi
342331
; X86-NEXT: .cfi_def_cfa_offset 12
343-
; X86-NEXT: pushl %esi
344-
; X86-NEXT: .cfi_def_cfa_offset 16
345-
; X86-NEXT: .cfi_offset %esi, -16
346332
; X86-NEXT: .cfi_offset %edi, -12
347333
; X86-NEXT: .cfi_offset %ebx, -8
348334
; X86-NEXT: movl $1, %edi
349-
; X86-NEXT: movl $2, %esi
350-
; X86-NEXT: movl $3, %edx
351-
; X86-NEXT: movl $4, %ecx
352-
; X86-NEXT: movl $5, %eax
335+
; X86-NEXT: movl $2, %edx
336+
; X86-NEXT: movl $3, %eax
337+
; X86-NEXT: pushl $5
338+
; X86-NEXT: .cfi_adjust_cfa_offset 4
339+
; X86-NEXT: pushl $4
340+
; X86-NEXT: .cfi_adjust_cfa_offset 4
353341
; X86-NEXT: calll callee_with_5_params@PLT
354-
; X86-NEXT: popl %esi
355-
; X86-NEXT: .cfi_def_cfa_offset 12
342+
; X86-NEXT: addl $8, %esp
343+
; X86-NEXT: .cfi_adjust_cfa_offset -8
356344
; X86-NEXT: popl %edi
357345
; X86-NEXT: .cfi_def_cfa_offset 8
358346
; X86-NEXT: popl %ebx
@@ -377,38 +365,45 @@ define preserve_nonecc void @entry4(ptr %a, ptr %b, ptr %c, ptr %d) {
377365
;
378366
; X86-LABEL: entry4:
379367
; X86: # %bb.0:
380-
; X86-NEXT: pushl %ebp
368+
; X86-NEXT: pushl %esi
381369
; X86-NEXT: .cfi_def_cfa_offset 8
382-
; X86-NEXT: .cfi_offset %ebp, -8
383-
; X86-NEXT: movl %ecx, %ebx
384-
; X86-NEXT: movl %edx, %ebp
370+
; X86-NEXT: pushl %ebp
371+
; X86-NEXT: .cfi_def_cfa_offset 12
372+
; X86-NEXT: .cfi_offset %ebp, -12
373+
; X86-NEXT: .cfi_offset %esi, -8
374+
; X86-NEXT: movl %eax, %ebx
375+
; X86-NEXT: movl %edx, %esi
376+
; X86-NEXT: movl {{[0-9]+}}(%esp), %ebp
385377
; X86-NEXT: calll boring@PLT
386-
; X86-NEXT: movl %ebp, %edx
387-
; X86-NEXT: movl %ebx, %ecx
378+
; X86-NEXT: movl %ebp, {{[0-9]+}}(%esp)
379+
; X86-NEXT: movl %esi, %edx
380+
; X86-NEXT: movl %ebx, %eax
388381
; X86-NEXT: popl %ebp
382+
; X86-NEXT: .cfi_def_cfa_offset 8
383+
; X86-NEXT: popl %esi
389384
; X86-NEXT: .cfi_def_cfa_offset 4
390385
; X86-NEXT: jmp continuation4@PLT # TAILCALL
391386
call void @boring()
392387
musttail call preserve_nonecc void @continuation4(ptr %a, ptr %b, ptr %c, ptr %d)
393388
ret void
394389
}
395390

396-
declare preserve_nonecc void @continuation2(ptr, ptr)
397-
define preserve_nonecc void @entry2(ptr %a, ptr %b) {
398-
; X64-LABEL: entry2:
391+
declare preserve_nonecc void @continuation1(ptr, ptr)
392+
define preserve_nonecc void @entry1(ptr %a) {
393+
; X64-LABEL: entry1:
399394
; X64: # %bb.0:
400395
; X64-NEXT: pushq %rax
401396
; X64-NEXT: .cfi_def_cfa_offset 16
402397
; X64-NEXT: callq boring@PLT
403398
; X64-NEXT: popq %rax
404399
; X64-NEXT: .cfi_def_cfa_offset 8
405-
; X64-NEXT: jmp continuation2@PLT # TAILCALL
400+
; X64-NEXT: jmp continuation1@PLT # TAILCALL
406401
;
407-
; X86-LABEL: entry2:
402+
; X86-LABEL: entry1:
408403
; X86: # %bb.0:
409404
; X86-NEXT: calll boring@PLT
410-
; X86-NEXT: jmp continuation2@PLT # TAILCALL
405+
; X86-NEXT: jmp continuation1@PLT # TAILCALL
411406
call void @boring()
412-
musttail call preserve_nonecc void @continuation2(ptr %a, ptr %b)
407+
musttail call preserve_nonecc void @continuation1(ptr %a)
413408
ret void
414409
}

llvm/test/CodeGen/X86/preserve_nonecc_call_win.ll

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -21,28 +21,32 @@ define preserve_nonecc void @entry6(ptr %a, ptr %b, ptr %c, ptr %d, ptr %e, ptr
2121
;
2222
; X86-LABEL: entry6:
2323
; X86: # %bb.0:
24+
; X86-NEXT: pushl %esi
2425
; X86-NEXT: pushl %ebp
2526
; X86-NEXT: subl $8, %esp
2627
; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
27-
; X86-NEXT: movl %ecx, (%esp) # 4-byte Spill
28-
; X86-NEXT: movl %edx, %ebx
28+
; X86-NEXT: movl %edx, (%esp) # 4-byte Spill
2929
; X86-NEXT: movl {{[0-9]+}}(%esp), %ebp
30+
; X86-NEXT: movl {{[0-9]+}}(%esp), %ebx
31+
; X86-NEXT: movl {{[0-9]+}}(%esp), %esi
3032
; X86-NEXT: calll _boring
33+
; X86-NEXT: movl %esi, {{[0-9]+}}(%esp)
34+
; X86-NEXT: movl %ebx, {{[0-9]+}}(%esp)
3135
; X86-NEXT: movl %ebp, {{[0-9]+}}(%esp)
32-
; X86-NEXT: movl %ebx, %edx
33-
; X86-NEXT: movl (%esp), %ecx # 4-byte Reload
36+
; X86-NEXT: movl (%esp), %edx # 4-byte Reload
3437
; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
3538
; X86-NEXT: addl $8, %esp
3639
; X86-NEXT: popl %ebp
40+
; X86-NEXT: popl %esi
3741
; X86-NEXT: jmp _continuation6 # TAILCALL
3842
call void @boring()
3943
musttail call preserve_nonecc void @continuation6(ptr %a, ptr %b, ptr %c, ptr %d, ptr %e, ptr %f)
4044
ret void
4145
}
4246

43-
declare preserve_nonecc void @continuation2(ptr, ptr)
44-
define preserve_nonecc void @entry2(ptr %a, ptr %b) {
45-
; X64-LABEL: entry2:
47+
declare preserve_nonecc void @continuation1(ptr)
48+
define preserve_nonecc void @entry1(ptr %a) {
49+
; X64-LABEL: entry1:
4650
; X64: # %bb.0:
4751
; X64-NEXT: subq $40, %rsp
4852
; X64-NEXT: .seh_stackalloc 40
@@ -52,14 +56,14 @@ define preserve_nonecc void @entry2(ptr %a, ptr %b) {
5256
; X64-NEXT: .seh_startepilogue
5357
; X64-NEXT: addq $40, %rsp
5458
; X64-NEXT: .seh_endepilogue
55-
; X64-NEXT: jmp continuation2 # TAILCALL
59+
; X64-NEXT: jmp continuation1 # TAILCALL
5660
; X64-NEXT: .seh_endproc
5761
;
58-
; X86-LABEL: entry2:
62+
; X86-LABEL: entry1:
5963
; X86: # %bb.0:
6064
; X86-NEXT: calll _boring
61-
; X86-NEXT: jmp _continuation2 # TAILCALL
65+
; X86-NEXT: jmp _continuation1 # TAILCALL
6266
call void @boring()
63-
musttail call preserve_nonecc void @continuation2(ptr %a, ptr %b)
67+
musttail call preserve_nonecc void @continuation1(ptr %a)
6468
ret void
6569
}

0 commit comments

Comments
 (0)