Browse Source

Preserve uext and sext flags for parameters on x86_64 and apple aarch64 (#7325)

This is required by the ABI and prevents a miscompilation when calling
LLVM compiled functions.
pull/7369/head
bjorn3 1 year ago
committed by GitHub
parent
commit
a5d9bbe29c
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 10
      cranelift/codegen/src/isa/aarch64/abi.rs
  2. 4
      cranelift/codegen/src/isa/x64/abi.rs
  3. 36
      cranelift/filetests/filetests/isa/aarch64/uext-sext-handling.clif
  4. 38
      cranelift/filetests/filetests/isa/x64/uext-sext-handling.clif

10
cranelift/codegen/src/isa/aarch64/abi.rs

@ -1148,10 +1148,14 @@ impl ABIMachineSpec for AArch64MachineDeps {
}
fn get_ext_mode(
_call_conv: isa::CallConv,
_specified: ir::ArgumentExtension,
call_conv: isa::CallConv,
specified: ir::ArgumentExtension,
) -> ir::ArgumentExtension {
ir::ArgumentExtension::None
if call_conv == isa::CallConv::AppleAarch64 {
specified
} else {
ir::ArgumentExtension::None
}
}
fn compute_frame_layout(

4
cranelift/codegen/src/isa/x64/abi.rs

@ -809,9 +809,9 @@ impl ABIMachineSpec for X64ABIMachineSpec {
fn get_ext_mode(
_call_conv: isa::CallConv,
_specified: ir::ArgumentExtension,
specified: ir::ArgumentExtension,
) -> ir::ArgumentExtension {
ir::ArgumentExtension::None
specified
}
fn compute_frame_layout(

36
cranelift/filetests/filetests/isa/aarch64/uext-sext-handling.clif

@ -0,0 +1,36 @@
test compile
target aarch64
; The aapcs64 call conv ignores the uext and sext flags
function u0:0(i8) system_v {
sig0 = (i8 uext) system_v
fn0 = u0:0 sig0
block0(v0: i8):
call fn0(v0)
return
}
; check: stp fp, lr, [sp, #-16]!
; nextln: mov fp, sp
; nextln: block0:
; check-not: uxtb w0, w0
; nextln: load_ext_name x2, User(userextname0)+0
; nextln: blr x2
; The aaple aarch64 call conv respects the uext and sext flags
function u0:0(i8) apple_aarch64 {
sig0 = (i8 uext) apple_aarch64
fn0 = u0:0 sig0
block0(v0: i8):
call fn0(v0)
return
}
; check: stp fp, lr, [sp, #-16]!
; nextln: mov fp, sp
; nextln: block0:
; nextln: uxtb w0, w0
; nextln: load_ext_name x4, User(userextname0)+0
; nextln: blr x4

38
cranelift/filetests/filetests/isa/x64/uext-sext-handling.clif

@ -0,0 +1,38 @@
test compile
target x86_64
; The x86_64 system_v call conv respects uext and sext
function u0:0(i8) system_v {
sig0 = (i8 uext) system_v
fn0 = u0:0 sig0
block0(v0: i8):
call fn0(v0)
return
}
; check: pushq %rbp
; nextln: movq %rsp, %rbp
; nextln: block0:
; nextln: movzbq %dil, %rdi
; nextln: load_ext_name userextname0+0, %rdx
; nextln: call *%rdx
; The x86_64 windows_fastcall call conv respects uext and sext
function u0:0(i8) windows_fastcall {
sig0 = (i8 uext) windows_fastcall
fn0 = u0:0 sig0
block0(v0: i8):
call fn0(v0)
return
}
; check: pushq %rbp
; nextln: movq %rsp, %rbp
; nextln: block0:
; nextln: subq %rsp, $$32, %rsp
; nextln: virtual_sp_offset_adjust 32
; nextln: movzbq %cl, %rcx
; nextln: load_ext_name userextname0+0, %r9
; nextln: call *%r9
Loading…
Cancel
Save