From bacbd830fe70776909097a52943204249a22f5b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nikodem=20Rabuli=C5=84ski?= Date: Sun, 5 Nov 2023 21:16:08 +0100 Subject: [PATCH] LibJIT: Make X86_64Assembler::native_call take u64 instead of void* Now that x86-specific Assembler will be compiled on every architecture we can't rely on void* being the right width. It also fixes compilation on targets which have void* be different length from u64 (WASM in particular). --- Userland/Libraries/LibJIT/X86_64/Assembler.h | 6 +++--- Userland/Libraries/LibJS/JIT/Compiler.cpp | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Userland/Libraries/LibJIT/X86_64/Assembler.h b/Userland/Libraries/LibJIT/X86_64/Assembler.h index e43db2e6fd..0e049399e5 100644 --- a/Userland/Libraries/LibJIT/X86_64/Assembler.h +++ b/Userland/Libraries/LibJIT/X86_64/Assembler.h @@ -731,7 +731,7 @@ struct X86_64Assembler { } void native_call( - void* callee, + u64 callee, Vector const& preserved_registers = {}, Vector const& stack_arguments = {}) { @@ -746,14 +746,14 @@ struct X86_64Assembler { push(stack_argument); // load callee into RAX - mov(Operand::Register(Reg::RAX), Operand::Imm(bit_cast(callee))); + mov(Operand::Register(Reg::RAX), Operand::Imm(callee)); // call RAX emit8(0xff); emit_modrm_slash(2, Operand::Register(Reg::RAX)); if (!stack_arguments.is_empty() || needs_aligning) - add(Operand::Register(Reg::RSP), Operand::Imm((stack_arguments.size() + (needs_aligning ? 1 : 0)) * sizeof(void*))); + add(Operand::Register(Reg::RSP), Operand::Imm((stack_arguments.size() + (needs_aligning ? 1 : 0)) * sizeof(u64))); for (auto const& reg : preserved_registers) pop(reg); diff --git a/Userland/Libraries/LibJS/JIT/Compiler.cpp b/Userland/Libraries/LibJS/JIT/Compiler.cpp index 29743b2e0e..ad73943087 100644 --- a/Userland/Libraries/LibJS/JIT/Compiler.cpp +++ b/Userland/Libraries/LibJS/JIT/Compiler.cpp @@ -1919,7 +1919,7 @@ void Compiler::native_call(void* function_address, Vector co { // NOTE: We don't preserve caller-saved registers when making a native call. // This means that they may have changed after we return from the call. - m_assembler.native_call(function_address, { Assembler::Operand::Register(ARG0) }, stack_arguments); + m_assembler.native_call(bit_cast(function_address), { Assembler::Operand::Register(ARG0) }, stack_arguments); } OwnPtr Compiler::compile(Bytecode::Executable& bytecode_executable)