X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=src%2Fvm%2Fjit%2Fi386%2Fpatcher.c;h=19b91971803a6c59d1c2f0a9f04dac19662a7e9d;hb=f24e856e3c43a10dcc8581fd5ddbdda200d63aba;hp=3befeff5d96855818fd3dd2588beff84ebaf9212;hpb=a266bddaca35ff9ccfa4171607e8b035fc70df2e;p=cacao.git diff --git a/src/vm/jit/i386/patcher.c b/src/vm/jit/i386/patcher.c index 3befeff5d..19b919718 100644 --- a/src/vm/jit/i386/patcher.c +++ b/src/vm/jit/i386/patcher.c @@ -30,23 +30,28 @@ #include "vm/types.h" #include "vm/jit/i386/codegen.h" +#include "vm/jit/i386/md.h" #include "mm/memory.h" -#include "native/native.h" +#include "native/native.hpp" -#include "vm/builtin.h" +#include "vm/jit/builtin.hpp" #include "vm/class.h" -#include "vm/field.h" +#include "vm/field.hpp" #include "vm/initialize.h" #include "vm/options.h" #include "vm/references.h" #include "vm/resolve.h" -#include "vm/jit/patcher-common.h" +#include "vm/jit/patcher-common.hpp" -#define PATCH_BACK_ORIGINAL_MCODE *((u2 *) pr->mpc) = (u2) pr->mcode +#define PATCH_BACK_ORIGINAL_MCODE \ + do { \ + *((uint16_t*) pr->mpc) = (uint16_t) pr->mcode; \ + md_icacheflush((void*) pr->mpc, PATCHER_CALL_SIZE); \ + } while (0) /* patcher_patch_code ********************************************************** @@ -94,11 +99,6 @@ bool patcher_get_putstatic(patchref_t *pr) PATCH_BACK_ORIGINAL_MCODE; - /* if we show disassembly, we have to skip the nop's */ - - if (opt_shownops) - ra = ra + PATCHER_CALL_SIZE; - /* patch the field value's address */ *((intptr_t *) (ra + 1)) = (intptr_t) fi->value; @@ -134,11 +134,6 @@ bool patcher_getfield(patchref_t *pr) PATCH_BACK_ORIGINAL_MCODE; - /* if we show disassembly, we have to skip the nop's */ - - if (opt_shownops) - ra = ra + PATCHER_CALL_SIZE; - /* patch the field's offset */ *((u4 *) (ra + 2)) = (u4) (fi->offset); @@ -179,11 +174,6 @@ bool patcher_putfield(patchref_t *pr) PATCH_BACK_ORIGINAL_MCODE; - /* if we show disassembly, we have to skip the nop's */ - - if (opt_shownops) - ra = ra + PATCHER_CALL_SIZE; - /* patch the field's offset */ if (fi->type != TYPE_LNG) { @@ -231,11 +221,6 @@ bool patcher_putfieldconst(patchref_t *pr) PATCH_BACK_ORIGINAL_MCODE; - /* if we show disassembly, we have to skip the nop's */ - - if (opt_shownops) - ra = ra + PATCHER_CALL_SIZE; - /* patch the field's offset */ if (!IS_2_WORD_TYPE(fi->type)) { @@ -284,11 +269,6 @@ bool patcher_aconst(patchref_t *pr) PATCH_BACK_ORIGINAL_MCODE; - /* if we show disassembly, we have to skip the nop's */ - - if (opt_shownops) - ra = ra + PATCHER_CALL_SIZE; - /* patch the classinfo pointer */ *((ptrint *) (ra + 1)) = (ptrint) c; @@ -330,11 +310,6 @@ bool patcher_builtin_multianewarray(patchref_t *pr) PATCH_BACK_ORIGINAL_MCODE; - /* if we show disassembly, we have to skip the nop's */ - - if (opt_shownops) - ra = ra + PATCHER_CALL_SIZE; - /* patch the classinfo pointer */ *((ptrint *) (ra + 7 + 4)) = (ptrint) c; @@ -372,11 +347,6 @@ bool patcher_builtin_arraycheckcast(patchref_t *pr) PATCH_BACK_ORIGINAL_MCODE; - /* if we show disassembly, we have to skip the nop's */ - - if (opt_shownops) - ra = ra + PATCHER_CALL_SIZE; - /* patch the classinfo pointer */ *((ptrint *) (ra + 4)) = (ptrint) c; @@ -417,11 +387,6 @@ bool patcher_invokestatic_special(patchref_t *pr) PATCH_BACK_ORIGINAL_MCODE; - /* if we show disassembly, we have to skip the nop's */ - - if (opt_shownops) - ra = ra + PATCHER_CALL_SIZE; - /* patch stubroutine */ *((ptrint *) (ra + 1)) = (ptrint) m->stubroutine; @@ -459,11 +424,6 @@ bool patcher_invokevirtual(patchref_t *pr) PATCH_BACK_ORIGINAL_MCODE; - /* if we show disassembly, we have to skip the nop's */ - - if (opt_shownops) - ra = ra + PATCHER_CALL_SIZE; - /* patch vftbl index */ *((s4 *) (ra + 2 + 2)) = (s4) (OFFSET(vftbl_t, table[0]) + @@ -503,11 +463,6 @@ bool patcher_invokeinterface(patchref_t *pr) PATCH_BACK_ORIGINAL_MCODE; - /* if we show disassembly, we have to skip the nop's */ - - if (opt_shownops) - ra = ra + PATCHER_CALL_SIZE; - /* patch interfacetable index */ *((s4 *) (ra + 2 + 2)) = (s4) (OFFSET(vftbl_t, interfacetable[0]) - @@ -549,11 +504,6 @@ bool patcher_checkcast_instanceof_flags(patchref_t *pr) PATCH_BACK_ORIGINAL_MCODE; - /* if we show disassembly, we have to skip the nop's */ - - if (opt_shownops) - ra = ra + PATCHER_CALL_SIZE; - /* patch class flags */ *((s4 *) (ra + 1)) = (s4) c->flags; @@ -594,11 +544,6 @@ bool patcher_checkcast_interface(patchref_t *pr) PATCH_BACK_ORIGINAL_MCODE; - /* if we show disassembly, we have to skip the nop's */ - - if (opt_shownops) - ra = ra + PATCHER_CALL_SIZE; - /* patch super class index */ *((s4 *) (ra + 6 + 2)) = (s4) c->index; @@ -642,11 +587,6 @@ bool patcher_instanceof_interface(patchref_t *pr) PATCH_BACK_ORIGINAL_MCODE; - /* if we show disassembly, we have to skip the nop's */ - - if (opt_shownops) - ra = ra + PATCHER_CALL_SIZE; - /* patch super class index */ *((s4 *) (ra + 6 + 2)) = (s4) c->index; @@ -690,11 +630,6 @@ bool patcher_checkcast_class(patchref_t *pr) PATCH_BACK_ORIGINAL_MCODE; - /* if we show disassembly, we have to skip the nop's */ - - if (opt_shownops) - ra = ra + PATCHER_CALL_SIZE; - /* patch super class' vftbl */ *((ptrint *) (ra + 1)) = (ptrint) c->vftbl; @@ -734,11 +669,6 @@ bool patcher_instanceof_class(patchref_t *pr) PATCH_BACK_ORIGINAL_MCODE; - /* if we show disassembly, we have to skip the nop's */ - - if (opt_shownops) - ra = ra + PATCHER_CALL_SIZE; - /* patch super class' vftbl */ *((ptrint *) (ra + 1)) = (ptrint) c->vftbl;