mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-06-21 19:20:21 +02:00
Add separate functions for veneer patching
This commit is contained in:
parent
297ae99c3f
commit
aacaa6e38c
3 changed files with 22 additions and 4 deletions
|
@ -114,8 +114,12 @@ DEFINE_ENCODER(size, 2, 22, unsigned, uint32_t)
|
|||
} \
|
||||
}
|
||||
|
||||
DEFINE_PATCHABLE_INSTRUCTION(jmp, simm26, JMP_WITH_VENEER, 2);
|
||||
DEFINE_PATCHABLE_INSTRUCTION(jcc, simm19, JCC_WITH_VENEER, 2);
|
||||
#define DEFINE_PATCHABLE_INSTRUCTIONS(name, kind, RELOC, rsh) \
|
||||
DEFINE_PATCHABLE_INSTRUCTION(name, kind, RELOC, rsh); \
|
||||
DEFINE_PATCHABLE_INSTRUCTION(veneer_##name, kind, RELOC, rsh);
|
||||
|
||||
DEFINE_PATCHABLE_INSTRUCTIONS(jmp, simm26, JMP_WITH_VENEER, 2);
|
||||
DEFINE_PATCHABLE_INSTRUCTIONS(jcc, simm19, JCC_WITH_VENEER, 2);
|
||||
DEFINE_PATCHABLE_INSTRUCTION(load_from_pool, simm19, LOAD_FROM_POOL, 2);
|
||||
|
||||
struct veneer
|
||||
|
|
|
@ -325,6 +325,12 @@ patch_jmp_offset(uint32_t *loc, int32_t v)
|
|||
write_wide_thumb(loc, patch_thumb_jump(read_wide_thumb(loc), v));
|
||||
}
|
||||
|
||||
static void
|
||||
patch_veneer_jmp_offset(uint32_t *loc, int32_t v)
|
||||
{
|
||||
patch_jmp_offset(loc, v);
|
||||
}
|
||||
|
||||
static jit_reloc_t
|
||||
emit_thumb_jump(jit_state_t *_jit, uint32_t inst)
|
||||
{
|
||||
|
@ -401,6 +407,12 @@ patch_jcc_offset(uint32_t *loc, int32_t v)
|
|||
write_wide_thumb(loc, patch_thumb_cc_jump(read_wide_thumb(loc), v));
|
||||
}
|
||||
|
||||
static void
|
||||
patch_veneer_jcc_offset(uint32_t *loc, int32_t v)
|
||||
{
|
||||
patch_jcc_offset(loc, v);
|
||||
}
|
||||
|
||||
static jit_reloc_t
|
||||
emit_thumb_cc_jump(jit_state_t *_jit, uint32_t inst)
|
||||
{
|
||||
|
|
|
@ -107,9 +107,11 @@ static void emit_literal_pool(jit_state_t *_jit, enum guard_pool guard);
|
|||
static int32_t read_jmp_offset(uint32_t *loc);
|
||||
static int offset_in_jmp_range(ptrdiff_t offset);
|
||||
static void patch_jmp_offset(uint32_t *loc, ptrdiff_t offset);
|
||||
static void patch_veneer_jmp_offset(uint32_t *loc, ptrdiff_t offset);
|
||||
static int32_t read_jcc_offset(uint32_t *loc);
|
||||
static int offset_in_jcc_range(ptrdiff_t offset);
|
||||
static void patch_jcc_offset(uint32_t *loc, ptrdiff_t offset);
|
||||
static void patch_veneer_jcc_offset(uint32_t *loc, ptrdiff_t offset);
|
||||
static void patch_veneer(uint32_t *loc, jit_pointer_t addr);
|
||||
static int32_t read_load_from_pool_offset(uint32_t *loc);
|
||||
#endif
|
||||
|
@ -1367,11 +1369,11 @@ emit_literal_pool(jit_state_t *_jit, enum guard_pool guard)
|
|||
|
||||
switch (entry->reloc.kind & JIT_RELOC_MASK) {
|
||||
case JIT_RELOC_JMP_WITH_VENEER:
|
||||
patch_jmp_offset((uint32_t*) loc, diff);
|
||||
patch_veneer_jmp_offset((uint32_t*) loc, diff);
|
||||
emit_veneer(_jit, (void*) (uintptr_t) entry->value);
|
||||
break;
|
||||
case JIT_RELOC_JCC_WITH_VENEER:
|
||||
patch_jcc_offset((uint32_t*) loc, diff);
|
||||
patch_veneer_jcc_offset((uint32_t*) loc, diff);
|
||||
emit_veneer(_jit, (void*) (uintptr_t) entry->value);
|
||||
break;
|
||||
case JIT_RELOC_LOAD_FROM_POOL:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue