* configure.ac: [ENABLE_SSA] define ENABLE_ESCAPE_CHECK.
authorPeter Molnar <pm@complang.tuwien.ac.at>
Fri, 6 Jun 2008 08:29:23 +0000 (10:29 +0200)
committerPeter Molnar <pm@complang.tuwien.ac.at>
Fri, 6 Jun 2008 08:29:23 +0000 (10:29 +0200)
* src/vm/global.h [ENABLE_ESCAPE_CHECK] add additional fields to java_object_t for escape analysis verification.
* src/vm/jit/asmpart.h,
src/vm/jit/i386/asmpart.S [ENABLE_ESCAPE_CHECK] (asm_escape_check): new symbol.
* src/vm/jit/i386/codegen.c [ENABLE_ESCAPE_CHECK] (codegen_emit): First stetps of annotating all objects with escape information and checking that information upon every access to an object.
* src/vm/jit/i386/emit.c,
src/vm/jit/i386/emit.h (emit_escape_check): New symbol.
* src/vm/jit/optimizing/escape.c (escape_analysis_escape_check): New symbol.

configure.ac
src/vm/global.h
src/vm/jit/asmpart.h
src/vm/jit/i386/asmpart.S
src/vm/jit/i386/codegen.c
src/vm/jit/i386/emit.c
src/vm/jit/i386/emit.h
src/vm/jit/optimizing/escape.c

index 642f98bb2a7c772f571f4e9eb2b5f477e219b5a0..6797d5b098c22ae0463105b960332306f1d113ff 100644 (file)
@@ -667,10 +667,12 @@ AC_ARG_ENABLE([ssa],
 AC_MSG_RESULT(${ENABLE_SSA})
 AM_CONDITIONAL([ENABLE_SSA], test x"${ENABLE_SSA}" = "xyes")
 AM_CONDITIONAL([ENABLE_ESCAPE], test x"${ENABLE_SSA}" = "xyes")
+AM_CONDITIONAL([ENABLE_ESCAPE_CHECK], test x"${ENABLE_SSA}" = "xyes")
 
 if test x"${ENABLE_SSA}" = "xyes"; then
     AC_DEFINE([ENABLE_SSA], 1, [enable lsra with ssa])
     AC_DEFINE([ENABLE_ESCAPE], 1, [enable escape analysis with ssa])
+    AC_DEFINE([ENABLE_ESCAPE_CHECK], 1, [enable generating code to validate escape analysis results])
     ENABLE_LSRA="no"
 fi
 
index aa4d400ea9ae512fac1d78066a9cc2b66f9d83d1..125eb3ff1096ff8e76fb1cdd82886dbfe1a21811 100644 (file)
@@ -239,6 +239,11 @@ struct java_object_t {                 /* header for all objects              */
 #if defined(ENABLE_GC_CACAO)
        uintptr_t      hdrflags;           /* word containing the GC bits         */
 #endif
+#if defined(ENABLE_ESCAPE_CHECK)
+       void *method;
+       void *thread;
+       uintptr_t escape;
+#endif
 };
 
 
index 76c6dcc8ee7eb7c0a7b0ea5de92bd3f66d14d12b..8dea3aacc2030445d82d8c60fa3ee7e9cf8b4ec9 100644 (file)
@@ -113,6 +113,10 @@ u8 asm_get_cycle_count(void);
 
 void *md_asm_codegen_get_pv_from_pc(void *ra);
 
+#if defined(ENABLE_ESCAPE_CHECK)
+void asm_escape_check(java_object_t *obj);
+#endif
+
 #endif /* _ASMPART_H */
 
 
index 6904b0a89fa21ec96bb50975eacecad602962e5f..72653f436afe572c8b5df04d783478245f0e48b2 100644 (file)
 
        .globl asm_get_cycle_count
 
+#if defined(ENABLE_ESCAPE_CHECK)
+       .globl asm_escape_check
+#endif
+
 
 /* asm_md_init *****************************************************************
 
@@ -423,6 +427,29 @@ asm_get_cycle_count:
        rdtsc
        ret
 
+#if defined(ENABLE_ESCAPE_CHECK)
+asm_escape_check:
+       sub     $24,%esp
+
+       mov     t0, 4(%esp)
+       mov     itmp1, 8(%esp)
+       mov     itmp2, 12(%esp)
+       mov     itmp3, 16(%esp)
+
+       mov     28(%esp), itmp1
+       mov     itmp1, (%esp)
+
+       call    escape_analysis_escape_check
+
+       mov     4(%esp), t0
+       mov     8(%esp), itmp1
+       mov     12(%esp), itmp2
+       mov     16(%esp), itmp3
+
+       add     $24,sp
+       ret
+#endif
+
 
 /* disable exec-stacks ********************************************************/
 
@@ -430,7 +457,6 @@ asm_get_cycle_count:
        .section .note.GNU-stack,"",%progbits
 #endif
 
-
 /*
  * These are local overrides for various environment variables in Emacs.
  * Please do not remove this and leave it at the end of the file, where
index f8507a12652c03163a02a0ed1f810a827947b318..4f47e7d4ce7dad5636aac7cc1fab7d0aa405f161 100644 (file)
@@ -2303,6 +2303,10 @@ bool codegen_emit(jitdata *jd)
                        s1 = emit_load_s1(jd, iptr, REG_ITMP1);
                        emit_nullpointer_check(cd, iptr, s1);
 
+#if defined(ENABLE_ESCAPE_CHECK)
+                       emit_escape_check(cd, s1);
+#endif
+
                        if (INSTRUCTION_IS_UNRESOLVED(iptr)) {
                                uf        = iptr->sx.s23.s3.uf;
                                fieldtype = uf->fieldref->parseddesc.fd->type;
@@ -2960,6 +2964,12 @@ gen_method:
                                        M_MOV_IMM(bte->stub, REG_ITMP1);
                                }
                                M_CALL(REG_ITMP1);
+
+#if defined(ENABLE_ESCAPE_CHECK)
+                               if (bte->opcode == ICMD_NEW || bte->opcode == ICMD_NEWARRAY) {
+                                       emit_esape_annotate_object(cd, m);
+                               }
+#endif
                                break;
 
                        case ICMD_INVOKESPECIAL:
index 1a0be3daee41e4beae3caf5a0241a95fe81a10dc..ae20ab6ebf72bd2f3a121e3236eca8c7e2981969 100644 (file)
@@ -1844,6 +1844,14 @@ void emit_fincstp(codegendata *cd)
        *(cd->mcodeptr++) = 0xf7;
 }
 
+#if defined(ENABLE_ESCAPE_CHECK)
+void emit_escape_check(codegendata *cd, s4 reg) {
+       M_PUSH(reg);
+       M_MOV_IMM(asm_escape_check, REG_ITMP3);
+       M_CALL(REG_ITMP3);
+       M_IADD_IMM(4, REG_SP);
+}
+#endif
 
 /*
  * These are local overrides for various environment variables in Emacs.
index 22b116ff567a890bafda6e719248b76684de167c..5a0c26dd6e8d6f0f49453efef3b60c3851b88b1b 100644 (file)
@@ -294,6 +294,11 @@ void emit_ffree_reg(codegendata *cd, s4 reg);
 void emit_fdecstp(codegendata *cd);
 void emit_fincstp(codegendata *cd);
 
+#if defined(ENABLE_ESCAPE_CHECK)
+void emit_escape_check(codegendata *cd, s4 reg);
+void emit_esape_annotate_object(codegendata *cd, methodinfo *m);
+#endif
+
 #endif /* _EMITFUNCS_H */
 
 
index 71cf200fb4a128fede8e443f2cbdb998ea4eb579..93ad4ab08bad2cc81b2332eaf01afac357980b85 100644 (file)
@@ -980,3 +980,5 @@ void escape_analysis_perform(jitdata *jd) {
        jd->m->flags &= ~ACC_METHOD_EA;
 }
 
+void escape_analysis_escape_check(void *vp) {
+}