Cranelift: Add instructions for getting the current stack/frame/return pointers (#4573)

* Cranelift: Add instructions for getting the current stack/frame pointers and return address

This is the initial part of https://github.com/bytecodealliance/wasmtime/issues/4535

* x64: Remove `Amode::RbpOffset` and use `Amode::ImmReg` instead

We just special case getting operands from `Amode`s now.

* Fix s390x `get_return_address`; require `preserve_frame_pointers=true`

* Assert that `Amode::ImmRegRegShift` doesn't use rbp/rsp

* Handle non-allocatable registers in Amode::with_allocs

* Use "stack" instead of "r15" on s390x

* r14 is an allocatable register on s390x, so it shouldn't be used with `MovPReg`
This commit is contained in:
Nick Fitzgerald
2022-08-02 14:37:17 -07:00
committed by GitHub
parent 6b4e6523f7
commit 42bba452a6
28 changed files with 484 additions and 24 deletions

View File

@@ -0,0 +1,43 @@
test compile precise-output
set preserve_frame_pointers=true
target aarch64
function %fp() -> i64 {
block0:
v0 = get_frame_pointer.i64
return v0
}
; stp fp, lr, [sp, #-16]!
; mov fp, sp
; block0:
; mov x0, fp
; ldp fp, lr, [sp], #16
; ret
function %sp() -> i64 {
block0:
v0 = get_stack_pointer.i64
return v0
}
; stp fp, lr, [sp, #-16]!
; mov fp, sp
; block0:
; mov x0, sp
; ldp fp, lr, [sp], #16
; ret
function %return_address() -> i64 {
block0:
v0 = get_return_address.i64
return v0
}
; stp fp, lr, [sp, #-16]!
; mov fp, sp
; block0:
; mov x0, lr
; ldp fp, lr, [sp], #16
; ret

View File

@@ -0,0 +1,52 @@
test compile precise-output
set preserve_frame_pointers=true
target s390x
function %fp() -> i64 {
block0:
v0 = get_frame_pointer.i64
return v0
}
; stmg %r14, %r15, 112(%r15)
; lgr %r1, %r15
; aghi %r15, -160
; virtual_sp_offset_adjust 160
; stg %r1, 0(%r15)
; block0:
; lg %r2, 0(%r15)
; lmg %r14, %r15, 272(%r15)
; br %r14
function %sp() -> i64 {
block0:
v0 = get_stack_pointer.i64
return v0
}
; stmg %r14, %r15, 112(%r15)
; lgr %r1, %r15
; aghi %r15, -160
; virtual_sp_offset_adjust 160
; stg %r1, 0(%r15)
; block0:
; lgr %r2, %r15
; lmg %r14, %r15, 272(%r15)
; br %r14
function %return_address() -> i64 {
block0:
v0 = get_return_address.i64
return v0
}
; stmg %r14, %r15, 112(%r15)
; lgr %r1, %r15
; aghi %r15, -160
; virtual_sp_offset_adjust 160
; stg %r1, 0(%r15)
; block0:
; lg %r2, 272(%r15)
; lmg %r14, %r15, 272(%r15)
; br %r14

View File

@@ -0,0 +1,45 @@
test compile precise-output
set preserve_frame_pointers=true
target x86_64
function %fp() -> i64 {
block0:
v0 = get_frame_pointer.i64
return v0
}
; pushq %rbp
; movq %rsp, %rbp
; block0:
; movq %rbp, %rax
; movq %rbp, %rsp
; popq %rbp
; ret
function %sp() -> i64 {
block0:
v0 = get_stack_pointer.i64
return v0
}
; pushq %rbp
; movq %rsp, %rbp
; block0:
; movq %rsp, %rax
; movq %rbp, %rsp
; popq %rbp
; ret
function %return_address() -> i64 {
block0:
v0 = get_return_address.i64
return v0
}
; pushq %rbp
; movq %rsp, %rbp
; block0:
; movq 8(%rbp), %rax
; movq %rbp, %rsp
; popq %rbp
; ret