guile-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Guile-commits] 03/14: Add separate functions for veneer patching


From: Andy Wingo
Subject: [Guile-commits] 03/14: Add separate functions for veneer patching
Date: Fri, 12 Jun 2020 10:18:41 -0400 (EDT)

wingo pushed a commit to branch master
in repository guile.

commit aacaa6e38cda6154c5ab5d8d6bb2fe1b84feb256
Author: Icecream95 <ixn@keemail.me>
AuthorDate: Mon Apr 6 19:44:03 2020 +1200

    Add separate functions for veneer patching
---
 lightening/aarch64.c    |  8 ++++++--
 lightening/arm-cpu.c    | 12 ++++++++++++
 lightening/lightening.c |  6 ++++--
 3 files changed, 22 insertions(+), 4 deletions(-)

diff --git a/lightening/aarch64.c b/lightening/aarch64.c
index 2e52516..b605cc5 100644
--- a/lightening/aarch64.c
+++ b/lightening/aarch64.c
@@ -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
diff --git a/lightening/arm-cpu.c b/lightening/arm-cpu.c
index d96d57b..8e3b121 100644
--- a/lightening/arm-cpu.c
+++ b/lightening/arm-cpu.c
@@ -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)
 {
diff --git a/lightening/lightening.c b/lightening/lightening.c
index 8d4c3d7..0940263 100644
--- a/lightening/lightening.c
+++ b/lightening/lightening.c
@@ -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:



reply via email to

[Prev in Thread] Current Thread [Next in Thread]