* src/vm/jit/parse.cpp,
[cacao.git] / src / vm / jit / intrp / codegen.c
index 56f5d03b3aea3540f33ff65225eb56f4645e0409..4fbca4a70d15856dfe575b7af0675374fcef8cea 100644 (file)
@@ -1,9 +1,7 @@
 /* src/vm/jit/intrp/codegen.c - code generator for Interpreter
 
-   Copyright (C) 1996-2005, 2006 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
+   Copyright (C) 1996-2005, 2006, 2007, 2008
+   CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
 
    This file is part of CACAO.
 
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   Contact: cacao@cacaojvm.org
-
-   Authors: Christian Thalinger
-            Anton Ertl
-                       
-   Changes: Edwin Steiner
-
-   $Id: codegen.c 5682 2006-10-04 23:05:15Z edwin $
-
 */
 
 
 #include "vm/jit/intrp/codegen.h"
 #include "vm/jit/intrp/intrp.h"
 
-#include "native/native.h"
-#include "vm/builtin.h"
-#include "vm/class.h"
-#include "vm/exceptions.h"
+#include "mm/memory.h"
+
+#include "native/native.hpp"
+
+#include "vm/jit/builtin.hpp"
+#include "vm/class.hpp"
+#include "vm/exceptions.hpp"
 #include "vm/global.h"
 #include "vm/options.h"
-#include "vm/stringlocal.h"
-#include "vm/vm.h"
+#include "vm/vm.hpp"
+
 #include "vm/jit/asmpart.h"
-#include "vm/jit/codegen-common.h"
+#include "vm/jit/codegen-common.hpp"
 #include "vm/jit/dseg.h"
-#include "vm/jit/jit.h"
-#include "vm/jit/parse.h"
+#include "vm/jit/jit.hpp"
+#include "vm/jit/parse.hpp"
 #include "vm/jit/patcher.h"
 #include "vm/jit/stack.h"
+#include "vm/jit/stacktrace.hpp"
 
 
 #define gen_branch(_inst) { \
@@ -215,7 +208,8 @@ void genarg_avftbl(codegendata *cd1, vftbl_t *a)
 
 /* include the interpreter generation functions *******************************/
 
-#include "vm/jit/intrp/java-gen.i"
+/* Do not use "java-gen.i", it does not work with builddir. */
+#include <java-gen.i>
 
 
 typedef void (*genfunctionptr) (codegendata *);
@@ -292,7 +286,6 @@ bool intrp_codegen(jitdata *jd)
        s4                  i, len, s1, s2, d;
        basicblock         *bptr;
        instruction        *iptr;
-       exceptiontable     *ex;
        u2                  currentline;
        methodinfo         *lm;             /* local methodinfo for ICMD_INVOKE*  */
        unresolved_method  *um;
@@ -315,34 +308,33 @@ bool intrp_codegen(jitdata *jd)
        lm = NULL;
        bte = NULL;
 
-       /* create method header */
+       /* determine stackframe size (in units of ptrint slots) */
 
-       (void) dseg_addaddress(cd, jd->code);                  /* CodeinfoPointer */
-       (void) dseg_adds4(cd, m->maxlocals * SIZEOF_VOID_P);    /* FrameSize      */
+       cd->stackframesize = m->maxlocals;
 
 #if defined(ENABLE_THREADS)
-       if (checksync && (m->flags & ACC_SYNCHRONIZED))
-               (void) dseg_adds4(cd, 1);                           /* IsSync         */
-       else
+       if (checksync && code_is_synchronized(code))
+               cd->stackframesize += 1;
 #endif
-               (void) dseg_adds4(cd, 0);                           /* IsSync         */
-                                              
-       (void) dseg_adds4(cd, 0);                               /* IsLeaf         */
-       (void) dseg_adds4(cd, 0);                               /* IntSave        */
-       (void) dseg_adds4(cd, 0);                               /* FltSave        */
 
-       dseg_addlinenumbertablesize(cd);
+       /* create method header */
 
-       (void) dseg_adds4(cd, cd->exceptiontablelength);        /* ExTableSize    */
+       (void) dseg_add_unique_address(cd, jd->code);
+       (void) dseg_add_unique_s4(cd, cd->stackframesize * SIZEOF_VOID_P);
 
-       /* create exception table */
+       code->synchronizedoffset = rd->memuse * 8;
 
-       for (ex = cd->exceptiontable; ex != NULL; ex = ex->down) {
-               dseg_addtarget(cd, ex->start);
-               dseg_addtarget(cd, ex->end);
-               dseg_addtarget(cd, ex->handler);
-               (void) dseg_addaddress(cd, ex->catchtype.any);
-       }
+       /* REMOVEME: We still need it for exception handling in assembler. */
+
+       if (code_is_leafmethod(code))
+               (void) dseg_add_unique_s4(cd, 1);
+       else
+               (void) dseg_add_unique_s4(cd, 0);
+
+       (void) dseg_add_unique_s4(cd, 0);
+       (void) dseg_add_unique_s4(cd, 0);
+
+       dseg_addlinenumbertablesize(cd);
 
 #if 0  
        /* initialize mcode variables */
@@ -354,11 +346,15 @@ bool intrp_codegen(jitdata *jd)
        gen_BBSTART;
 
 #if defined(ENABLE_THREADS)
-       if (checksync && (m->flags & ACC_SYNCHRONIZED)) {
-               if (m->flags & ACC_STATIC)
-                       gen_ACONST(cd, (java_objectheader *) m->class);
-               else
+       if (checksync && code_is_synchronized(code)) {
+               if (m->flags & ACC_STATIC) {
+                       gen_ACONST(cd, (java_objectheader *) m->clazz);
+               }
+               else {
                        gen_ALOAD(cd, 0);
+                       gen_DUP(cd);
+                       gen_ASTORE(cd, index2offset(m->maxlocals));
+               }
                
                gen_MONITORENTER(cd);
        }                       
@@ -413,7 +409,7 @@ switch_again:
 
                        /* optimize ICONST (2^x) .. IREM --> IREMPOW2 (const) */
 
-                       if (len >= 1 && iptr[1].opc == ICMD_IREM) {
+                       if (len >= 2 && iptr[1].opc == ICMD_IREM) {
                                switch (iptr[0].sx.val.i) {
        case 0x00000001: case 0x00000002: case 0x00000004: case 0x00000008:
        case 0x00000010: case 0x00000020: case 0x00000040: case 0x00000080:
@@ -432,7 +428,7 @@ switch_again:
 
                        /* optimize ICONST (2^x) .. IDIV --> IDIVPOW2 (const) */
 
-                       if (len >= 1 && iptr[1].opc == ICMD_IDIV) {
+                       if (len >= 2 && iptr[1].opc == ICMD_IDIV) {
                                switch (iptr[0].sx.val.i) {
                               case 0x00000002: I( 1) case 0x00000004: I( 2) case 0x00000008: I( 3)
        case 0x00000010: I( 4) case 0x00000020: I( 5) case 0x00000040: I( 6) case 0x00000080: I( 7)
@@ -452,7 +448,7 @@ dont_opt_IDIVPOW2:
 
                        /* optimize ICONST .. IF_ICMPxx --> IFxx (const) */
 
-                       if (len >= 1) {
+                       if (len >= 2) {
                                switch (iptr[1].opc) {
                                        case ICMD_IF_ICMPEQ: iptr[0].opc = ICMD_IFEQ; break;
                                        case ICMD_IF_ICMPNE: iptr[0].opc = ICMD_IFNE; break;
@@ -476,7 +472,7 @@ dont_opt_IFxx:
 
                        /* optimize LCONST (2^x) .. LREM --> LREMPOW2 (const) */
 
-                       if (len >= 1 && iptr[1].opc == ICMD_LREM) {
+                       if (len >= 2 && iptr[1].opc == ICMD_LREM) {
                                switch (iptr[0].sx.val.l) {
        case 0x00000001: case 0x00000002: case 0x00000004: case 0x00000008:
        case 0x00000010: case 0x00000020: case 0x00000040: case 0x00000080:
@@ -495,7 +491,7 @@ dont_opt_IFxx:
 
                        /* optimize LCONST (2^x) .. LDIV --> LDIVPOW2 (const) */
 
-                       if (len >= 1 && iptr[1].opc == ICMD_LDIV) {
+                       if (len >= 2 && iptr[1].opc == ICMD_LDIV) {
                                switch (iptr[0].sx.val.l) {
                               case 0x00000002: I( 1) case 0x00000004: I( 2) case 0x00000008: I( 3)
        case 0x00000010: I( 4) case 0x00000020: I( 5) case 0x00000040: I( 6) case 0x00000080: I( 7)
@@ -515,7 +511,7 @@ dont_opt_LDIVPOW2:
 
                        /* optimize LCONST .. LCMP .. IFxx (0) --> IF_Lxx */
 
-                       if (len >= 2 && iptr[1].opc == ICMD_LCMP && iptr[2].sx.val.i == 0) {
+                       if (len >= 3 && iptr[1].opc == ICMD_LCMP && iptr[2].sx.val.i == 0) {
                                switch (iptr[2].opc) {
                                        case ICMD_IFEQ: iptr[0].opc = ICMD_IF_LEQ; break;
                                        case ICMD_IFNE: iptr[0].opc = ICMD_IF_LNE; break;
@@ -851,7 +847,7 @@ dont_opt_IF_Lxx:
 
                        /* optimize LCMP .. IFxx (0) --> IF_LCMPxx */
 
-                       if (len >= 1 && iptr[1].sx.val.i == 0) {
+                       if (len >= 2 && iptr[1].sx.val.i == 0) {
                                switch (iptr[1].opc) {
                                        case ICMD_IFEQ: iptr[0].opc = ICMD_IF_LCMPEQ; break;
                                        case ICMD_IFNE: iptr[0].opc = ICMD_IF_LCMPNE; break;
@@ -1098,6 +1094,7 @@ dont_opt_IF_LCMPxx:
                        }
                        else {
                                fi        = iptr->sx.s23.s3.fmiref->p.field;
+                               uf        = NULL;
                                fieldtype = fi->type;
                        }
 
@@ -1105,7 +1102,7 @@ dont_opt_IF_LCMPxx:
                        case TYPE_INT:
                                if (fi == NULL)
                                        gen_PATCHER_GETSTATIC_INT(cd, 0, uf);
-                               else if (!CLASS_IS_OR_ALMOST_INITIALIZED(fi->class))
+                               else if (!CLASS_IS_OR_ALMOST_INITIALIZED(fi->clazz))
                                        gen_PATCHER_GETSTATIC_CLINIT_INT(cd, 0, fi);
                                else
                                        gen_GETSTATIC_INT(cd, (u1 *) &(fi->value.i), fi);
@@ -1113,7 +1110,7 @@ dont_opt_IF_LCMPxx:
                        case TYPE_FLT:
                                if (fi == NULL)
                                        gen_PATCHER_GETSTATIC_FLOAT(cd, 0, uf);
-                               else if (!CLASS_IS_OR_ALMOST_INITIALIZED(fi->class))
+                               else if (!CLASS_IS_OR_ALMOST_INITIALIZED(fi->clazz))
                                        gen_PATCHER_GETSTATIC_CLINIT_FLOAT(cd, 0, fi);
                                else
                                        gen_GETSTATIC_FLOAT(cd, (u1 *) &(fi->value.i), fi);
@@ -1122,7 +1119,7 @@ dont_opt_IF_LCMPxx:
                        case TYPE_DBL:
                                if (fi == NULL)
                                        gen_PATCHER_GETSTATIC_LONG(cd, 0, uf);
-                               else if (!CLASS_IS_OR_ALMOST_INITIALIZED(fi->class))
+                               else if (!CLASS_IS_OR_ALMOST_INITIALIZED(fi->clazz))
                                        gen_PATCHER_GETSTATIC_CLINIT_LONG(cd, 0, fi);
                                else
                                        gen_GETSTATIC_LONG(cd, (u1 *) &(fi->value.l), fi);
@@ -1130,7 +1127,7 @@ dont_opt_IF_LCMPxx:
                        case TYPE_ADR:
                                if (fi == NULL)
                                        gen_PATCHER_GETSTATIC_CELL(cd, 0, uf);
-                               else if (!CLASS_IS_OR_ALMOST_INITIALIZED(fi->class))
+                               else if (!CLASS_IS_OR_ALMOST_INITIALIZED(fi->clazz))
                                        gen_PATCHER_GETSTATIC_CLINIT_CELL(cd, 0, fi);
                                else
                                        gen_GETSTATIC_CELL(cd, (u1 *) &(fi->value.a), fi);
@@ -1148,6 +1145,7 @@ dont_opt_IF_LCMPxx:
                        }
                        else {
                                fi        = iptr->sx.s23.s3.fmiref->p.field;
+                               uf        = NULL;
                                fieldtype = fi->type;
                        }
 
@@ -1155,7 +1153,7 @@ dont_opt_IF_LCMPxx:
                        case TYPE_INT:
                                if (fi == NULL)
                                        gen_PATCHER_PUTSTATIC_INT(cd, 0, uf);
-                               else if (!CLASS_IS_OR_ALMOST_INITIALIZED(fi->class))
+                               else if (!CLASS_IS_OR_ALMOST_INITIALIZED(fi->clazz))
                                        gen_PATCHER_PUTSTATIC_CLINIT_INT(cd, 0, fi);
                                else
                                        gen_PUTSTATIC_INT(cd, (u1 *) &(fi->value.i), fi);
@@ -1163,7 +1161,7 @@ dont_opt_IF_LCMPxx:
                        case TYPE_FLT:
                                if (fi == NULL)
                                        gen_PATCHER_PUTSTATIC_FLOAT(cd, 0, uf);
-                               else if (!CLASS_IS_OR_ALMOST_INITIALIZED(fi->class))
+                               else if (!CLASS_IS_OR_ALMOST_INITIALIZED(fi->clazz))
                                        gen_PATCHER_PUTSTATIC_CLINIT_FLOAT(cd, 0, fi);
                                else
                                        gen_PUTSTATIC_FLOAT(cd, (u1 *) &(fi->value.i), fi);
@@ -1172,7 +1170,7 @@ dont_opt_IF_LCMPxx:
                        case TYPE_DBL:
                                if (fi == NULL)
                                        gen_PATCHER_PUTSTATIC_LONG(cd, 0, uf);
-                               else if (!CLASS_IS_OR_ALMOST_INITIALIZED(fi->class))
+                               else if (!CLASS_IS_OR_ALMOST_INITIALIZED(fi->clazz))
                                        gen_PATCHER_PUTSTATIC_CLINIT_LONG(cd, 0, fi);
                                else
                                        gen_PUTSTATIC_LONG(cd, (u1 *) &(fi->value.l), fi);
@@ -1180,7 +1178,7 @@ dont_opt_IF_LCMPxx:
                        case TYPE_ADR:
                                if (fi == NULL)
                                        gen_PATCHER_PUTSTATIC_CELL(cd, 0, uf);
-                               else if (!CLASS_IS_OR_ALMOST_INITIALIZED(fi->class))
+                               else if (!CLASS_IS_OR_ALMOST_INITIALIZED(fi->clazz))
                                        gen_PATCHER_PUTSTATIC_CLINIT_CELL(cd, 0, fi);
                                else
                                        gen_PUTSTATIC_CELL(cd, (u1 *) &(fi->value.a), fi);
@@ -1199,6 +1197,7 @@ dont_opt_IF_LCMPxx:
                        }
                        else {
                                fi        = iptr->sx.s23.s3.fmiref->p.field;
+                               uf        = NULL;
                                fieldtype = fi->type;
                        }
 
@@ -1241,6 +1240,7 @@ dont_opt_IF_LCMPxx:
                        }
                        else {
                                fi        = iptr->sx.s23.s3.fmiref->p.field;
+                               uf        = NULL;
                                fieldtype = fi->type;
                        }
 
@@ -1511,11 +1511,11 @@ dont_opt_IF_LCMPxx:
                case ICMD_FRETURN:      /* ..., retvalue ==> ...                      */
 
 #if defined(ENABLE_THREADS)
-                       if (checksync && (m->flags & ACC_SYNCHRONIZED)) {
+                       if (checksync && code_is_synchronized(code)) {
                                if (m->flags & ACC_STATIC) {
-                                       gen_ACONST(cd, (java_objectheader *) m->class);
+                                       gen_ACONST(cd, (java_objectheader *) m->clazz);
                                } else {
-                                       gen_ALOAD(cd, 0);
+                                       gen_ALOAD(cd, index2offset(m->maxlocals));
                                }
                                gen_MONITOREXIT(cd);
                        }
@@ -1523,18 +1523,18 @@ dont_opt_IF_LCMPxx:
                        if (opt_verbosecall)
                                gen_TRACERETURN(cd, m);
 
-                       gen_IRETURN(cd, index2offset(cd->maxlocals));
+                       gen_IRETURN(cd, index2offset(cd->stackframesize));
                        break;
 
                case ICMD_LRETURN:      /* ..., retvalue ==> ...                      */
                case ICMD_DRETURN:      /* ..., retvalue ==> ...                      */
 
 #if defined(ENABLE_THREADS)
-                       if (checksync && (m->flags & ACC_SYNCHRONIZED)) {
+                       if (checksync && code_is_synchronized(code)) {
                                if (m->flags & ACC_STATIC) {
-                                       gen_ACONST(cd, (java_objectheader *) m->class);
+                                       gen_ACONST(cd, (java_objectheader *) m->clazz);
                                } else {
-                                       gen_ALOAD(cd, 0);
+                                       gen_ALOAD(cd, index2offset(m->maxlocals));
                                }
                                gen_MONITOREXIT(cd);
                        }
@@ -1542,17 +1542,17 @@ dont_opt_IF_LCMPxx:
                        if (opt_verbosecall)
                                gen_TRACELRETURN(cd, m);
 
-                       gen_LRETURN(cd, index2offset(cd->maxlocals));
+                       gen_LRETURN(cd, index2offset(cd->stackframesize));
                        break;
 
                case ICMD_RETURN:       /* ...  ==> ...                               */
 
 #if defined(ENABLE_THREADS)
-                       if (checksync && (m->flags & ACC_SYNCHRONIZED)) {
+                       if (checksync && code_is_synchronized(code)) {
                                if (m->flags & ACC_STATIC) {
-                                       gen_ACONST(cd, (java_objectheader *) m->class);
+                                       gen_ACONST(cd, (java_objectheader *) m->clazz);
                                } else {
-                                       gen_ALOAD(cd, 0);
+                                       gen_ALOAD(cd, index2offset(m->maxlocals));
                                }
                                gen_MONITOREXIT(cd);
                        }
@@ -1560,7 +1560,7 @@ dont_opt_IF_LCMPxx:
                        if (opt_verbosecall)
                                gen_TRACERETURN(cd, m);
 
-                       gen_RETURN(cd, index2offset(cd->maxlocals));
+                       gen_RETURN(cd, index2offset(cd->stackframesize));
                        break;
 
 
@@ -1594,12 +1594,12 @@ dont_opt_IF_LCMPxx:
                        table += i;
 
                        while (--i >= 0) {
-                               dseg_addtarget(cd, BLOCK_OF(table->insindex)); 
+                               dseg_add_target(cd, BLOCK_OF(table->insindex)); 
                                --table;
                        }
                        }
 
-                       /* length of dataseg after last dseg_addtarget is used by load */
+                       /* length of dataseg after last dseg_add_target is used by load */
                        ((ptrint *)(cd->mcodeptr))[-2] = (ptrint) -(cd->dseglen);
                        break;
 
@@ -1626,15 +1626,15 @@ dont_opt_IF_LCMPxx:
                        /* build jump table top down and use address of lowest entry */
 
                        while (--i >= 0) {
-                               dseg_addtarget(cd, BLOCK_OF(lookup->target.insindex)); 
-                               dseg_addaddress(cd, lookup->value);
+                               dseg_add_target(cd, BLOCK_OF(lookup->target.insindex)); 
+                               dseg_add_unique_address(cd, lookup->value);
                                lookup++;
                        }
 
                        codegen_addreference(cd, BLOCK_OF(iptr->sx.s23.s3.lookupdefault.insindex));
                        }
 
-                       /* length of dataseg after last dseg_addtarget is used by load */
+                       /* length of dataseg after last dseg_add_target is used by load */
                        ((ptrint *)(cd->mcodeptr))[-2] = (ptrint) -(cd->dseglen);
                        break;
 
@@ -1715,9 +1715,9 @@ dont_opt_IF_LCMPxx:
                                md = lm->parseddesc;
 
                                s1 = OFFSET(vftbl_t, interfacetable[0]) -
-                                       sizeof(methodptr*) * lm->class->index;
+                                       sizeof(methodptr*) * lm->clazz->index;
 
-                               s2 = sizeof(methodptr) * (lm - lm->class->methods);
+                               s2 = sizeof(methodptr) * (lm - lm->clazz->methods);
 
                                gen_INVOKEINTERFACE(cd, s1, s2, md->paramslots, lm);
                        }
@@ -1762,7 +1762,8 @@ dont_opt_IF_LCMPxx:
                        break;
 
                default:
-                       *exceptionptr = new_internalerror("Unknown ICMD %d", iptr->opc);
+                       exceptions_throw_internalerror("Unknown ICMD %d during code generation",
+                                                                                  iptr->opc);
                        return false;
        } /* switch */
                
@@ -1809,7 +1810,7 @@ dont_opt_IF_LCMPxx:
    +-------------+ <-- stub
    | codeptr     |
    +-------------+
-   | maxlocals   |
+   | framesize   |  (in ptrint units, does not include return address)
    +-------------+
    | TRANSLATE   |
    +-------------+
@@ -1822,7 +1823,7 @@ dont_opt_IF_LCMPxx:
 
 *******************************************************************************/
 
-#define COMPILERSTUB_DATASIZE    1
+#define COMPILERSTUB_DATASIZE    2
 #define COMPILERSTUB_CODESIZE    4
 
 #define COMPILERSTUB_SIZE        COMPILERSTUB_DATASIZE + COMPILERSTUB_CODESIZE
@@ -1833,8 +1834,8 @@ u1 *intrp_createcompilerstub(methodinfo *m)
        Inst        *s;
        Inst        *d;
        codegendata *cd;
-       codeinfo    *code;
-       s4           dumpsize;
+       s4           stackframesize;
+       int32_t      dumpmarker;
 
        s = CNEW(Inst, COMPILERSTUB_SIZE);
 
@@ -1843,15 +1844,15 @@ u1 *intrp_createcompilerstub(methodinfo *m)
        d = s;
        s = s + COMPILERSTUB_DATASIZE;
 
-       /* Store the codeinfo pointer in the same place as in the
-          methodheader for compiled methods. */
+       /* The codeinfo pointer is actually a pointer to the
+          methodinfo. This fakes a codeinfo structure. */
 
-       code = code_codeinfo_new(m);
-       d[0] = (Inst *) code;
+       d[0] = (Inst *) m;
+       d[1] = (Inst *) &d[0];                                    /* fake code->m */
 
        /* mark start of dump memory area */
 
-       dumpsize = dump_size();
+       DMARKER;
        
        cd = DNEW(codegendata);
     cd->mcodeptr = (u1 *) s;
@@ -1861,11 +1862,19 @@ u1 *intrp_createcompilerstub(methodinfo *m)
        genarg_ainst(cd, s + 2);
 
        if (m->flags & ACC_NATIVE) {
-               genarg_i(cd, m->parseddesc->paramslots);
-       } else {
-               genarg_i(cd, m->maxlocals);
+               stackframesize = m->parseddesc->paramslots;
+       } 
+       else {
+               stackframesize = m->maxlocals;
+
+#if defined(ENABLE_THREADS)
+               if (checksync && code_is_synchronized(code))
+                       stackframesize += 1;
+#endif
        }
 
+       genarg_i(cd, stackframesize);
+
        gen_BBSTART;
        gen_TRANSLATE(cd, m);
        gen_BBEND;
@@ -1881,7 +1890,7 @@ u1 *intrp_createcompilerstub(methodinfo *m)
 
        /* release dump area */
 
-       dump_release(dumpsize);
+       DRELEASE;
        
        return (u1 *) s;
 }
@@ -1970,28 +1979,29 @@ u1 *intrp_createnativestub(functionptr f, jitdata *jd, methoddesc *nmd)
 #else
        u1      *cif;
 #endif
+       s4            stackframesize;
 
        /* get required compiler data */
 
-       m  = jd->m;
-       cd = jd->cd;
-       rd = jd->rd;
+       m    = jd->m;
+       code = jd->code;
+       cd   = jd->cd;
+       rd   = jd->rd;
 
-       /* create method header */
+       /* determine stackframe size (in units of ptrint) */
 
-       /* Store the codeinfo pointer in the same place as in the
-          methodheader for compiled methods. */
+       stackframesize = nmd->paramslots;
 
-       code = code_codeinfo_new(m);
+       /* create method header */
 
-       (void) dseg_addaddress(cd, code);                      /* CodeinfoPointer */
-       (void) dseg_adds4(cd, nmd->paramslots * SIZEOF_VOID_P); /* FrameSize      */
-       (void) dseg_adds4(cd, 0);                               /* IsSync         */
-       (void) dseg_adds4(cd, 0);                               /* IsLeaf         */
-       (void) dseg_adds4(cd, 0);                               /* IntSave        */
-       (void) dseg_adds4(cd, 0);                               /* FltSave        */
+       (void) dseg_add_unique_address(cd, code);              /* CodeinfoPointer */
+       (void) dseg_add_unique_s4(cd, stackframesize * SIZEOF_VOID_P); /*FrameSize*/
+       (void) dseg_add_unique_s4(cd, 0);                       /* IsSync         */
+       (void) dseg_add_unique_s4(cd, 0);                       /* IsLeaf         */
+       (void) dseg_add_unique_s4(cd, 0);                       /* IntSave        */
+       (void) dseg_add_unique_s4(cd, 0);                       /* FltSave        */
        dseg_addlinenumbertablesize(cd);
-       (void) dseg_adds4(cd, 0);                               /* ExTableSize    */
+       (void) dseg_add_unique_s4(cd, 0);                       /* ExTableSize    */
 
 #if defined(WITH_FFI)
        /* prepare ffi cif structure */
@@ -2073,10 +2083,10 @@ Cell *nativecall(functionptr f, methodinfo *m, Cell *sp, Inst *ra, Cell *fp, u1
                assert(false);
        }
 
-       av_ptr(alist, _Jv_JNIEnv *, _Jv_env);
+       av_ptr(alist, _Jv_JNIEnv *, VM_get_jnienv());
 
        if (m->flags & ACC_STATIC)
-               av_ptr(alist, classinfo *, m->class);
+               av_ptr(alist, classinfo *, m->clazz);
 
        for (i = 0, p = sp + md->paramslots; i < md->paramcount; i++) {
                switch (md->paramtypes[i].type) {
@@ -2138,13 +2148,13 @@ Cell *nativecall(functionptr f, methodinfo *m, Cell *sp, Inst *ra, Cell *fp, u1
 
        /* pass env pointer */
 
-       penv = (_Jv_JNIEnv *) _Jv_env;
+       penv = (_Jv_JNIEnv *) VM_get_jnienv();
        *pvalues++ = &penv;
 
        /* for static methods, pass class pointer */
 
        if (m->flags & ACC_STATIC)
-               *pvalues++ = &m->class;
+               *pvalues++ = &m->clazz;
 
        /* pass parameter to native function */
 
@@ -2189,12 +2199,12 @@ u1 *createcalljavafunction(methodinfo *m)
        jitdata            *jd;
        codegendata        *cd;
        registerdata       *rd;
-       s4                  dumpsize;
        methoddesc         *md;
+       int32_t             dumpmarker;
 
        /* mark dump memory */
 
-       dumpsize = dump_size();
+       DMARKER;
 
        /* allocate memory */
 
@@ -2223,14 +2233,14 @@ u1 *createcalljavafunction(methodinfo *m)
 
        /* create method header */
 
-       (void) dseg_addaddress(cd, NULL);                      /* CodeinfoPointer */
-       (void) dseg_adds4(cd, md->paramslots * SIZEOF_VOID_P);  /* FrameSize      */
-       (void) dseg_adds4(cd, 0);                               /* IsSync         */
-       (void) dseg_adds4(cd, 0);                               /* IsLeaf         */
-       (void) dseg_adds4(cd, 0);                               /* IntSave        */
-       (void) dseg_adds4(cd, 0);                               /* FltSave        */
+       (void) dseg_add_unique_address(cd, NULL);              /* CodeinfoPointer */
+       (void) dseg_add_unique_s4(cd, md->paramslots * SIZEOF_VOID_P);/* FrameSize*/
+       (void) dseg_add_unique_s4(cd, 0);                       /* IsSync         */
+       (void) dseg_add_unique_s4(cd, 0);                       /* IsLeaf         */
+       (void) dseg_add_unique_s4(cd, 0);                       /* IntSave        */
+       (void) dseg_add_unique_s4(cd, 0);                       /* FltSave        */
        dseg_addlinenumbertablesize(cd);
-       (void) dseg_adds4(cd, 0);                               /* ExTableSize    */
+       (void) dseg_add_unique_s4(cd, 0);                       /* ExTableSize    */
 
 
        /* generate code */
@@ -2250,7 +2260,7 @@ u1 *createcalljavafunction(methodinfo *m)
 
        /* release memory */
 
-       dump_release(dumpsize);
+       DRELEASE;
 
        return entrypoint;
 }