* Removed all Id tags.
[cacao.git] / src / vm / jit / inline / inline.c
index 37e827556a669042a7560762e9b4be86a8a94630..773a11f48848d17493ebef33e5be6fbd95486e74 100644 (file)
@@ -1,6 +1,6 @@
 /* src/vm/jit/inline/inline.c - method inlining
 
-   Copyright (C) 1996-2005, 2006 R. Grafl, A. Krall, C. Kruegel,
+   Copyright (C) 1996-2005, 2006, 2007 R. Grafl, A. Krall, C. Kruegel,
    C. Oates, R. Obermaisser, M. Platter, M. Probst, S. Ring,
    E. Steiner, C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich,
    J. Wenninger, Institut f. Computersprachen - TU Wien
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   Contact: cacao@cacaojvm.org
-
-   Authors: Edwin Steiner
-
-   Changes:
-
-   $Id: inline.c 7450 2007-03-04 19:13:29Z edwin $
-
 */
 
-#include "config.h"
 
-#include "vm/types.h"
+#include "config.h"
 
 #include <assert.h>
+#include <limits.h>
 #include <stdio.h>
 #include <string.h>
-#include <limits.h>
+
+#include "vm/types.h"
 
 #include "mm/memory.h"
+
+#include "threads/lock-common.h"
+#include "threads/threads-common.h"
+
 #include "toolbox/logging.h"
+
 #include "vm/builtin.h"
 #include "vm/global.h"
-#include "vmcore/options.h"
-#include "vmcore/statistics.h"
-#include "vm/jit/jit.h"
-#include "vm/jit/parse.h"
-#include "vm/jit/inline/inline.h"
-#include "vm/jit/loop/loop.h"
-
-#include "vmcore/class.h"
 #include "vm/initialize.h"
-#include "vmcore/method.h"
-#include "vm/jit/jit.h"
-#include "vm/jit/show.h"
 
+#include "vm/jit/jit.h"
+#include "vm/jit/parse.h"
 #include "vm/jit/reg.h"
+#include "vm/jit/show.h"
 #include "vm/jit/stack.h"
 
+#include "vm/jit/inline/inline.h"
+#include "vm/jit/loop/loop.h"
+
 #include "vm/jit/verify/typecheck.h"
 
-#if defined(ENABLE_THREADS)
-# include "threads/native/threads.h"
-#endif
+#include "vmcore/class.h"
+#include "vmcore/method.h"
+#include "vmcore/options.h"
+#include "vmcore/statistics.h"
 
 
 /* algorithm tuning constants *************************************************/
@@ -343,10 +337,9 @@ static bool inline_jit_compile(inline_node *iln)
        m = iln->m;
        assert(m);
 
-#if defined(ENABLE_THREADS)
        /* enter a monitor on the method */
-       lock_monitor_enter((java_objectheader *) m);
-#endif
+
+       LOCK_MONITOR_ENTER(m);
 
        /* allocate jitdata structure and fill it */
 
@@ -364,7 +357,6 @@ static bool inline_jit_compile(inline_node *iln)
        /* XXX do a pseudo setup */
        jd->cd = DNEW(codegendata);
        MZERO(jd->cd, codegendata, 1);
-       jd->cd->maxstack = m->maxstack;
        jd->cd->method = m;
        /* XXX uses too much dump memory codegen_setup(jd); */
 
@@ -388,10 +380,9 @@ static bool inline_jit_compile(inline_node *iln)
 
 #endif
 
-#if defined(ENABLE_THREADS)
        /* leave the monitor */
-       lock_monitor_exit((java_objectheader *) m );
-#endif
+
+       LOCK_MONITOR_EXIT(m);
 
        return r;
 }
@@ -608,8 +599,8 @@ static s4 *create_variable_map(inline_node *callee)
 {
        s4 *varmap;
        s4 i, t;
-       s4 idx;
-       s4 n_idx;
+       s4 varindex;
+       s4 n_javaindex;
        s4 avail;
        varinfo *v;
 
@@ -623,38 +614,38 @@ static s4 *create_variable_map(inline_node *callee)
 
        for (i=0; i<callee->m->maxlocals; ++i) {
                for (t=0; t<5; ++t) {
-                       idx = callee->jd->local_map[5*i + t];
-                       if (idx == UNUSED)
+                       varindex = callee->jd->local_map[5*i + t];
+                       if (varindex == UNUSED)
                                continue;
 
-                       v = &(callee->jd->var[idx]);
+                       v = &(callee->jd->var[varindex]);
                        assert(v->type == t || v->type == TYPE_VOID); /* XXX stack leaves VOID */
                        v->type = t; /* XXX restore if it is TYPE_VOID */
 
                        avail = callee->ctx->resultjd->local_map[5*(callee->localsoffset + i) + t];
 
                        if (avail == UNUSED) {
-                               avail = inline_new_variable_clone(callee->ctx->resultjd, callee->jd, idx);
+                               avail = inline_new_variable_clone(callee->ctx->resultjd, callee->jd, varindex);
                                callee->ctx->resultjd->local_map[5*(callee->localsoffset + i) + t] = avail;
                        }
 
-                       varmap[idx] = avail;
+                       varmap[varindex] = avail;
                }
        }
 
        /* for synchronized instance methods we need an extra local */
 
        if (callee->synchronize && !(callee->m->flags & ACC_STATIC)) {
-               n_idx = callee->localsoffset - 1;
-               assert(n_idx >= 0);
+               n_javaindex = callee->localsoffset - 1;
+               assert(n_javaindex >= 0);
                assert(callee->parent);
-               assert(n_idx == callee->parent->localsoffset + callee->parent->m->maxlocals);
+               assert(n_javaindex == callee->parent->localsoffset + callee->parent->m->maxlocals);
 
-               avail = callee->ctx->resultjd->local_map[5*n_idx + TYPE_ADR];
+               avail = callee->ctx->resultjd->local_map[5*n_javaindex + TYPE_ADR];
 
                if (avail == UNUSED) {
                        avail = inline_new_variable(callee->ctx->resultjd, TYPE_ADR, 0);
-                       callee->ctx->resultjd->local_map[5*n_idx + TYPE_ADR] = avail;
+                       callee->ctx->resultjd->local_map[5*n_javaindex + TYPE_ADR] = avail;
                }
 
                callee->synclocal = avail;
@@ -672,8 +663,6 @@ static s4 *create_variable_map(inline_node *callee)
 #define INLINE_RETURN_REFERENCE(callee)  \
        ( (basicblock *) (ptrint) (0x333 + (callee)->depth) )
 
-#define RETADDRNR_FROM_BLOCK(bptr)  (UNUSED - 1 - (bptr)->nr)
-
 
 static void inline_add_block_reference(inline_node *iln, basicblock **blockp)
 {
@@ -753,8 +742,8 @@ static void inline_resolve_block_refs(inline_target_ref **refs,
        prev = NULL;
        for (ref = *refs; ref != NULL; ref = ref->next) {
                if (ref->isnumber && !returnref) {
-                       if (*(ref->ref.nr) == RETADDRNR_FROM_BLOCK(o_bptr)) {
-                               *(ref->ref.nr) = RETADDRNR_FROM_BLOCK(n_bptr);
+                       if (*(ref->ref.nr) == JAVALOCAL_FROM_RETADDR(o_bptr->nr)) {
+                               *(ref->ref.nr) = JAVALOCAL_FROM_RETADDR(n_bptr->nr);
                                goto remove_ref;
                        }
                }
@@ -1118,7 +1107,7 @@ static s4 emit_inlining_prolog(inline_node *iln,
        int type;
        instruction *n_ins;
        insinfo_inline *insinfo;
-       s4 argvar;
+       s4 varindex;
 
        assert(iln && callee && o_iptr);
 
@@ -1175,12 +1164,12 @@ static s4 emit_inlining_prolog(inline_node *iln,
 
                /* translate the argument variable */
 
-               argvar = varmap[o_iptr->sx.s23.s2.args[i]];
-               assert(argvar != UNUSED);
+               varindex = varmap[o_iptr->sx.s23.s2.args[i]];
+               assert(varindex != UNUSED);
 
                /* remove preallocation from the argument variable */
 
-               iln->ctx->resultjd->var[argvar].flags &= ~(PREALLOC | INMEMORY);
+               iln->ctx->resultjd->var[varindex].flags &= ~(PREALLOC | INMEMORY);
 
                /* check the instance slot against NULL */
                /* we don't need that for <init> methods, as the verifier  */
@@ -1190,7 +1179,7 @@ static s4 emit_inlining_prolog(inline_node *iln,
                if (!callee->isstatic && i == 0 && calleem->name != utf_init) {
                        assert(type == TYPE_ADR);
                        n_ins = inline_instruction(iln, ICMD_CHECKNULL, o_iptr);
-                       n_ins->s1.varindex = argvar;
+                       n_ins->s1.varindex = varindex;
                        n_ins->dst.varindex = n_ins->s1.varindex;
                }
 
@@ -1209,7 +1198,7 @@ static s4 emit_inlining_prolog(inline_node *iln,
                                n_ins = inline_instruction(iln, ICMD_ISTORE + type, o_iptr);
                                n_ins->sx.s23.s3.javaindex = UNUSED;
                        }
-                       n_ins->s1.varindex = argvar;
+                       n_ins->s1.varindex = varindex;
                        n_ins->dst.varindex = iln->ctx->resultjd->local_map[5*localindex + type];
                        assert(n_ins->dst.varindex != UNUSED);
                }
@@ -1225,7 +1214,7 @@ static s4 emit_inlining_prolog(inline_node *iln,
                        /* this value is not used, pop it */
 
                        n_ins = inline_instruction(iln, ICMD_POP, o_iptr);
-                       n_ins->s1.varindex = argvar;
+                       n_ins->s1.varindex = varindex;
                }
 
                DOLOG( printf("%sprolog: ", iln->indent);
@@ -2025,7 +2014,7 @@ static bool inline_transform(inline_node *iln, jitdata *jd)
 #if defined(INLINE_VERIFY_RESULT)
        static int debug_verify_inlined_code = 1;
 #endif
-#if defined(ENABLE_INLINING_DEBUG)
+#if defined(ENABLE_INLINING_DEBUG) || !defined(NDEBUG)
        static int debug_counter = 0;
 #endif
 
@@ -2096,7 +2085,6 @@ static bool inline_transform(inline_node *iln, jitdata *jd)
        /* store created code in jitdata */
 
        n_jd->basicblocks = iln->inlined_basicblocks;
-       n_jd->basicblockindex = NULL;
        n_jd->instructioncount = iln->cumul_instructioncount;
        n_jd->instructions = iln->inlined_iinstr;