x86: emit absolute calls, as reallocating exec mem breaks relative ones

This commit is contained in:
Keith Whitwell
2008-02-13 12:35:16 +00:00
parent a3534a27bf
commit 8162d317d2
3 changed files with 19 additions and 2 deletions
+4 -1
View File
@@ -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
+13
View File
@@ -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,
+2 -1
View File
@@ -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,