Add tail_call to ASM trait

This commit is contained in:
Richard Feldman 2021-05-24 21:41:37 -04:00
parent 595c704e88
commit 2909c06e72
3 changed files with 17 additions and 3 deletions

View file

@ -99,6 +99,8 @@ pub trait Assembler<GeneralReg: RegTrait, FloatReg: RegTrait> {
// It returns the base offset to calculate the jump from (generally the instruction after the jump).
fn jmp_imm32(buf: &mut Vec<'_, u8>, offset: i32) -> usize;
fn tail_call(buf: &mut Vec<'_, u8>) -> u64;
// Jumps by an offset of offset bytes if reg is not equal to imm.
// It should always generate the same number of bytes to enable replacement if offset changes.
// It returns the base offset to calculate the jump from (generally the instruction after the jump).
@ -344,10 +346,8 @@ impl<
/// Used for generating wrappers for malloc/realloc/free
fn build_wrapped_jmp(&mut self) -> Result<(&'a [u8], u64), String> {
let mut out = bumpalo::vec![in self.env.arena];
let offset = ASM::tail_call(&mut out);
ASM::jmp_imm32(&mut out, 0);
let offset = out.len() as u64 - 4;
Ok((out.into_bump_slice(), offset))
}