From a5d9bbe29c1e748b8f5f2e2a445dec97b70dc8a7 Mon Sep 17 00:00:00 2001 From: bjorn3 <17426603+bjorn3@users.noreply.github.com> Date: Mon, 23 Oct 2023 17:16:56 +0200 Subject: [PATCH] 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. --- cranelift/codegen/src/isa/aarch64/abi.rs | 10 +++-- cranelift/codegen/src/isa/x64/abi.rs | 4 +- .../isa/aarch64/uext-sext-handling.clif | 36 ++++++++++++++++++ .../filetests/isa/x64/uext-sext-handling.clif | 38 +++++++++++++++++++ 4 files changed, 83 insertions(+), 5 deletions(-) create mode 100644 cranelift/filetests/filetests/isa/aarch64/uext-sext-handling.clif create mode 100644 cranelift/filetests/filetests/isa/x64/uext-sext-handling.clif diff --git a/cranelift/codegen/src/isa/aarch64/abi.rs b/cranelift/codegen/src/isa/aarch64/abi.rs index bcf865d260..b5d6e56fcd 100644 --- a/cranelift/codegen/src/isa/aarch64/abi.rs +++ b/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( diff --git a/cranelift/codegen/src/isa/x64/abi.rs b/cranelift/codegen/src/isa/x64/abi.rs index be005e1022..d999335001 100644 --- a/cranelift/codegen/src/isa/x64/abi.rs +++ b/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( diff --git a/cranelift/filetests/filetests/isa/aarch64/uext-sext-handling.clif b/cranelift/filetests/filetests/isa/aarch64/uext-sext-handling.clif new file mode 100644 index 0000000000..473f3b7f16 --- /dev/null +++ b/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 diff --git a/cranelift/filetests/filetests/isa/x64/uext-sext-handling.clif b/cranelift/filetests/filetests/isa/x64/uext-sext-handling.clif new file mode 100644 index 0000000000..0908bec08c --- /dev/null +++ b/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