Jato can be compiled with workarounds which make valgrind work with jato. To do so, define VALGRIND variable for make: make jato VALGRIND=y
Currently workarounds eliminate class initialization from signal handler by unconditionally selecting calls to vm_class_ensure_init(). Signed-off-by: Tomek Grabiec <tgrab...@gmail.com> --- Makefile | 5 +++++ arch/x86/insn-selector.brg | 44 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+), 0 deletions(-) diff --git a/Makefile b/Makefile index 55ef9ba..f9c8d9b 100644 --- a/Makefile +++ b/Makefile @@ -177,6 +177,11 @@ INSTALL := install DEFAULT_CFLAGS += $(ARCH_CFLAGS) -g -rdynamic -std=gnu99 -D_GNU_SOURCE -fstack-protector-all -D_FORTIFY_SOURCE=2 +ifdef VALGRIND +DEFAULT_CFLAGS += -DCONFIG_VALGRIND +MB_DEFINES += -DCONFIG_VALGRIND +endif + # XXX: Temporary hack -Vegard DEFAULT_CFLAGS += -DNOT_IMPLEMENTED='fprintf(stderr, "%s:%d: warning: %s not implemented\n", __FILE__, __LINE__, __func__)' diff --git a/arch/x86/insn-selector.brg b/arch/x86/insn-selector.brg index 8522667..9c8dd70 100644 --- a/arch/x86/insn-selector.brg +++ b/arch/x86/insn-selector.brg @@ -1051,6 +1051,14 @@ reg: EXPR_CLASS_FIELD 1 vmc_state = vmc->state; vm_monitor_unlock(&vmc->monitor); +%ifdef CONFIG_VALGRIND + select_insn(s, tree, imm_insn(INSN_PUSH_IMM, (unsigned long)vmc)); + select_insn(s, tree, rel_insn(INSN_CALL_REL, (unsigned long)vm_class_ensure_init)); + method_args_cleanup(s, tree, 1); + + mov_insn = memdisp_reg_insn(INSN_MOV_MEMDISP_REG, + (unsigned long) vmc->static_values + vmf->offset, out); +%else if (vmc_state >= VM_CLASS_INITIALIZING) { /* Class is already initialized; no need for fix-up. We also * don't want the fixup if we're already inside the @@ -1064,6 +1072,7 @@ reg: EXPR_CLASS_FIELD 1 /* XXX: Check return value */ add_getstatic_fixup_site(mov_insn, vmf, s->b_parent); } +%endif /* CONFIG_VALGRIND */ select_insn(s, tree, mov_insn); @@ -1097,6 +1106,18 @@ freg: EXPR_FLOAT_CLASS_FIELD 1 vmc_state = vmc->state; vm_monitor_unlock(&vmc->monitor); +%ifdef CONFIG_VALGRIND + select_insn(s, tree, imm_insn(INSN_PUSH_IMM, (unsigned long)vmc)); + select_insn(s, tree, rel_insn(INSN_CALL_REL, (unsigned long)vm_class_ensure_init)); + method_args_cleanup(s, tree, 1); + + if (expr->vm_type == J_FLOAT) + mov_insn = memdisp_reg_insn(INSN_MOV_MEMDISP_XMM, + (unsigned long) vmc->static_values + vmf->offset, out); + else + mov_insn = memdisp_reg_insn(INSN_MOV_64_MEMDISP_XMM, + (unsigned long) vmc->static_values + vmf->offset, out); +%else if (vmc_state >= VM_CLASS_INITIALIZING) { /* Class is already initialized; no need for fix-up. We also * don't want the fixup if we're already inside the @@ -1118,6 +1139,7 @@ freg: EXPR_FLOAT_CLASS_FIELD 1 /* XXX: Check return value */ add_getstatic_fixup_site(mov_insn, vmf, s->b_parent); } +%endif /* CONFIG_VALGRIND */ select_insn(s, tree, mov_insn); } @@ -1995,6 +2017,14 @@ stmt: STMT_STORE(EXPR_CLASS_FIELD, reg) vmc_state = vmc->state; vm_monitor_unlock(&vmc->monitor); +%ifdef CONFIG_VALGRIND + select_insn(s, tree, imm_insn(INSN_PUSH_IMM, (unsigned long)vmc)); + select_insn(s, tree, rel_insn(INSN_CALL_REL, (unsigned long)vm_class_ensure_init)); + method_args_cleanup(s, tree, 1); + + mov_insn = reg_memdisp_insn(INSN_MOV_REG_MEMDISP, + src, (unsigned long) vmc->static_values + vmf->offset); +%else if (vmc_state >= VM_CLASS_INITIALIZING) { /* Class is already initialized; no need for fix-up. We also * don't want the fixup if we're already inside the @@ -2008,6 +2038,7 @@ stmt: STMT_STORE(EXPR_CLASS_FIELD, reg) /* XXX: Check return value */ add_putstatic_fixup_site(mov_insn, vmf, s->b_parent); } +%endif /* CONFIG_VALGRIND */ select_insn(s, tree, mov_insn); @@ -2044,6 +2075,18 @@ stmt: STMT_STORE(EXPR_FLOAT_CLASS_FIELD, freg) vmc_state = vmc->state; vm_monitor_unlock(&vmc->monitor); +%ifdef CONFIG_VALGRIND + select_insn(s, tree, imm_insn(INSN_PUSH_IMM, (unsigned long)vmc)); + select_insn(s, tree, rel_insn(INSN_CALL_REL, (unsigned long)vm_class_ensure_init)); + method_args_cleanup(s, tree, 1); + + if (store_dest->vm_type == J_FLOAT) + mov_insn = reg_memdisp_insn(INSN_MOV_XMM_MEMDISP, + src, (unsigned long) vmc->static_values + vmf->offset); + else + mov_insn = reg_memdisp_insn(INSN_MOV_64_XMM_MEMDISP, + src, (unsigned long) vmc->static_values + vmf->offset); +%else if (vmc_state >= VM_CLASS_INITIALIZING) { /* Class is already initialized; no need for fix-up. We also * don't want the fixup if we're already inside the @@ -2065,6 +2108,7 @@ stmt: STMT_STORE(EXPR_FLOAT_CLASS_FIELD, freg) /* XXX: Check return value */ add_putstatic_fixup_site(mov_insn, vmf, s->b_parent); } +%endif /* CONFIG_VALGRIND */ select_insn(s, tree, mov_insn); } -- 1.6.3.3 ------------------------------------------------------------------------------ Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day trial. Simplify your report design, integration and deployment - and focus on what you do best, core application coding. Discover what's new with Crystal Reports now. http://p.sf.net/sfu/bobj-july _______________________________________________ Jatovm-devel mailing list Jatovm-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/jatovm-devel