x86: emit absolute calls, as reallocating exec mem breaks relative ones
This commit is contained in:
@@ -328,8 +328,11 @@ emit_call(
|
||||
struct x86_function *func,
|
||||
void (* addr)() )
|
||||
{
|
||||
struct x86_reg ecx = x86_make_reg( file_REG32, reg_CX );
|
||||
|
||||
DUMP_I( "CALL", addr );
|
||||
x86_call( func, addr );
|
||||
x86_mov_reg_imm( func, ecx, (unsigned long) addr );
|
||||
x86_call( func, ecx );
|
||||
}
|
||||
|
||||
static void
|
||||
|
||||
@@ -278,11 +278,24 @@ void x86_jmp( struct x86_function *p, unsigned char *label)
|
||||
emit_1i(p, label - x86_get_label(p) - 4);
|
||||
}
|
||||
|
||||
#if 0
|
||||
/* This doesn't work once we start reallocating & copying the
|
||||
* generated code on buffer fills, because the call is relative to the
|
||||
* current pc.
|
||||
*/
|
||||
void x86_call( struct x86_function *p, void (*label)())
|
||||
{
|
||||
emit_1ub(p, 0xe8);
|
||||
emit_1i(p, cptr(label) - x86_get_label(p) - 4);
|
||||
}
|
||||
#else
|
||||
void x86_call( struct x86_function *p, struct x86_reg reg)
|
||||
{
|
||||
emit_1ub(p, 0xff);
|
||||
emit_modrm(p, reg, reg);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/* michal:
|
||||
* Temporary. As I need immediate operands, and dont want to mess with the codegen,
|
||||
|
||||
@@ -119,7 +119,8 @@ void x86_fixup_fwd_jump( struct x86_function *p,
|
||||
|
||||
void x86_jmp( struct x86_function *p, unsigned char *label );
|
||||
|
||||
void x86_call( struct x86_function *p, void (*label)() );
|
||||
/* void x86_call( struct x86_function *p, void (*label)() ); */
|
||||
void x86_call( struct x86_function *p, struct x86_reg reg);
|
||||
|
||||
/* michal:
|
||||
* Temporary. As I need immediate operands, and dont want to mess with the codegen,
|
||||
|
||||
Reference in New Issue
Block a user