move jmp into the architecture-specific trait mods

This commit is contained in:
Folkert 2023-09-16 15:29:31 +02:00
parent 93d7054a00
commit 99873f948d
No known key found for this signature in database
GPG key ID: 1F17F6FFD112B97C
3 changed files with 41 additions and 13 deletions

View file

@ -1119,6 +1119,26 @@ impl Assembler<AArch64GeneralReg, AArch64FloatReg> for AArch64Assembler {
buf.len() buf.len()
} }
/// Updates a jump instruction to a new offset and returns the number of bytes written.
fn update_jmp_imm32_offset(
buf: &mut Vec<'_, u8>,
jmp_location: u64,
base_offset: u64,
target_offset: u64,
) {
let old_buf_len = buf.len();
// write the jmp at the back of buf
let jmp_offset = target_offset as i32 - base_offset as i32 + 4;
Self::jmp_imm32(buf, jmp_offset);
// move the new jmp instruction into position
buf.copy_within(old_buf_len.., jmp_location as usize);
// wipe the jmp we created at the end
buf.truncate(old_buf_len)
}
#[inline(always)] #[inline(always)]
fn tail_call(buf: &mut Vec<'_, u8>) -> u64 { fn tail_call(buf: &mut Vec<'_, u8>) -> u64 {
Self::jmp_imm32(buf, 0); Self::jmp_imm32(buf, 0);

View file

@ -263,19 +263,7 @@ pub trait Assembler<GeneralReg: RegTrait, FloatReg: RegTrait>: Sized + Copy {
jmp_location: u64, jmp_location: u64,
base_offset: u64, base_offset: u64,
target_offset: u64, target_offset: u64,
) { );
let old_buf_len = buf.len();
// write the jmp at the back of buf
let jmp_offset = target_offset as i32 - base_offset as i32;
Self::jmp_imm32(buf, jmp_offset);
// move the new jmp instruction into position
buf.copy_within(old_buf_len.., jmp_location as usize);
// wipe the jmp we created at the end
buf.truncate(old_buf_len)
}
fn tail_call(buf: &mut Vec<'_, u8>) -> u64; fn tail_call(buf: &mut Vec<'_, u8>) -> u64;

View file

@ -2114,6 +2114,26 @@ impl Assembler<X86_64GeneralReg, X86_64FloatReg> for X86_64Assembler {
buf.len() buf.len()
} }
/// Updates a jump instruction to a new offset and returns the number of bytes written.
fn update_jmp_imm32_offset(
buf: &mut Vec<'_, u8>,
jmp_location: u64,
base_offset: u64,
target_offset: u64,
) {
let old_buf_len = buf.len();
// write the jmp at the back of buf
let jmp_offset = target_offset as i32 - base_offset as i32;
Self::jmp_imm32(buf, jmp_offset);
// move the new jmp instruction into position
buf.copy_within(old_buf_len.., jmp_location as usize);
// wipe the jmp we created at the end
buf.truncate(old_buf_len)
}
#[inline(always)] #[inline(always)]
fn tail_call(buf: &mut Vec<'_, u8>) -> u64 { fn tail_call(buf: &mut Vec<'_, u8>) -> u64 {
Self::jmp_imm32(buf, 0); Self::jmp_imm32(buf, 0);