mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-26 04:32:44 +01:00
6e7aff07a4
Treat it as callee-saved, and always back it up. When windows code calls entry points in unix code, marked with the windows calling convention, that unix code can call other functions that isn't compiled with -ffixed-x18 which may clobber x18 freely. By backing it up and restoring it on return, we preserve the register across the function call, fulfilling this part of the windows calling convention on another OS. This isn't enough for making sure that x18 is preseved when non-windows code does a callback to windows code, but is a clear improvement over the current status quo. Additionally, wine is nowadays building many modules as PE DLLs, which avoids the callback issue altogether for those DLLs. Differential Revision: https://reviews.llvm.org/D61892
27 lines
923 B
LLVM
27 lines
923 B
LLVM
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
|
|
|
;; Testing that x18 is backed up and restored, and that x29 (if used) still
|
|
;; points to the x29,x30 pair on the stack.
|
|
|
|
; RUN: llc < %s -mtriple=aarch64-linux-gnu --frame-pointer=non-leaf | FileCheck %s
|
|
; RUN: llc < %s -mtriple=aarch64-linux-gnu --frame-pointer=non-leaf -mattr=+reserve-x18 | FileCheck %s
|
|
|
|
declare dso_local void @other()
|
|
|
|
define dso_local win64cc void @func() #0 {
|
|
; CHECK-LABEL: func:
|
|
; CHECK: // %bb.0: // %entry
|
|
; CHECK-NEXT: stp x29, x30, [sp, #-32]! // 16-byte Folded Spill
|
|
; CHECK-NEXT: str x18, [sp, #16] // 8-byte Folded Spill
|
|
; CHECK-NEXT: mov x29, sp
|
|
; CHECK-NEXT: bl other
|
|
; CHECK-NEXT: ldr x18, [sp, #16] // 8-byte Folded Reload
|
|
; CHECK-NEXT: ldp x29, x30, [sp], #32 // 16-byte Folded Reload
|
|
; CHECK-NEXT: ret
|
|
entry:
|
|
tail call void @other()
|
|
ret void
|
|
}
|
|
|
|
attributes #0 = { nounwind }
|