Skip to content

Commit

Permalink
Preserve uext and sext flags for parameters on x86_64 and apple aarch…
Browse files Browse the repository at this point in the history
…64 (#7333)

This is required by the ABI and prevents a miscompilation when calling
LLVM compiled functions.
  • Loading branch information
bjorn3 committed Oct 23, 2023
1 parent 2da78ca commit a9d4e36
Show file tree
Hide file tree
Showing 4 changed files with 83 additions and 5 deletions.
10 changes: 7 additions & 3 deletions cranelift/codegen/src/isa/aarch64/abi.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down
4 changes: 2 additions & 2 deletions cranelift/codegen/src/isa/x64/abi.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down
36 changes: 36 additions & 0 deletions cranelift/filetests/filetests/isa/aarch64/uext-sext-handling.clif
Original file line number Diff line number Diff line change
@@ -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 changes: 38 additions & 0 deletions cranelift/filetests/filetests/isa/x64/uext-sext-handling.clif
Original file line number Diff line number Diff line change
@@ -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

0 comments on commit a9d4e36

Please sign in to comment.