* src/vm/jit/jit.h (jitdata): Removed isleafmethod.
authorChristian Thalinger <twisti@complang.tuwien.ac.at>
Fri, 12 Oct 2007 22:31:49 +0000 (00:31 +0200)
committerChristian Thalinger <twisti@complang.tuwien.ac.at>
Fri, 12 Oct 2007 22:31:49 +0000 (00:31 +0200)
* src/vm/jit/allocator/lsra.c,
src/vm/jit/allocator/simplereg.c,
src/vm/jit/alpha/codegen.c,
src/vm/jit/alpha/emit.c,
src/vm/jit/arm/codegen.c,
src/vm/jit/arm/md-abi.c,
src/vm/jit/i386/codegen.c,
src/vm/jit/i386/emit.c,
src/vm/jit/inline/inline.c,
src/vm/jit/jit.c,
src/vm/jit/m68k/codegen.c,
src/vm/jit/mips/codegen.c,
src/vm/jit/mips/emit.c,
src/vm/jit/optimizing/lsra.c,
src/vm/jit/optimizing/ssa.c,
src/vm/jit/parse.c,
src/vm/jit/parse.h,
src/vm/jit/powerpc/codegen.c,
src/vm/jit/powerpc/darwin/md-abi.c,
src/vm/jit/powerpc/linux/md-abi.c,
src/vm/jit/powerpc64/codegen.c,
src/vm/jit/powerpc64/linux/md-abi.c,
src/vm/jit/replace.c,
src/vm/jit/s390/codegen.c,
src/vm/jit/s390/emit.c,
src/vm/jit/s390/md-abi.c,
src/vm/jit/show.c,
src/vm/jit/sparc64/codegen.c,
src/vm/jit/sparc64/emit.c,
src/vm/jit/stack.c,
src/vm/jit/x86_64/codegen.c,
src/vm/jit/x86_64/emit.c,
src/vm/jit/x86_64/md-abi.c: Replaced jd->isleafmethod with
code_is_leafmethod.

34 files changed:
src/vm/jit/allocator/lsra.c
src/vm/jit/allocator/simplereg.c
src/vm/jit/alpha/codegen.c
src/vm/jit/alpha/emit.c
src/vm/jit/arm/codegen.c
src/vm/jit/arm/md-abi.c
src/vm/jit/i386/codegen.c
src/vm/jit/i386/emit.c
src/vm/jit/inline/inline.c
src/vm/jit/jit.c
src/vm/jit/jit.h
src/vm/jit/m68k/codegen.c
src/vm/jit/mips/codegen.c
src/vm/jit/mips/emit.c
src/vm/jit/optimizing/lsra.c
src/vm/jit/optimizing/ssa.c
src/vm/jit/parse.c
src/vm/jit/parse.h
src/vm/jit/powerpc/codegen.c
src/vm/jit/powerpc/darwin/md-abi.c
src/vm/jit/powerpc/linux/md-abi.c
src/vm/jit/powerpc64/codegen.c
src/vm/jit/powerpc64/linux/md-abi.c
src/vm/jit/replace.c
src/vm/jit/s390/codegen.c
src/vm/jit/s390/emit.c
src/vm/jit/s390/md-abi.c
src/vm/jit/show.c
src/vm/jit/sparc64/codegen.c
src/vm/jit/sparc64/emit.c
src/vm/jit/stack.c
src/vm/jit/x86_64/codegen.c
src/vm/jit/x86_64/emit.c
src/vm/jit/x86_64/md-abi.c

index 84eca5251681a764f157b5c62217fc906bd2fd52..d3a949cf51a740d53c8d95a69ac381fa3964920c 100644 (file)
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   Contact: cacao@cacaojvm.org
-
-   Authors: Christian Ullrich
-            Christian Thalinger
-            Edwin Steiner
-
 */
 
 
@@ -1051,7 +1045,7 @@ void lsra_reg_setup(jitdata *jd, struct lsra_register *int_reg,
 
        int_reg->nregdesc = nregdescint;
        flt_reg->nregdesc = nregdescfloat;
-       if (jd->isleafmethod) { 
+       if (code_is_leafmethod(code)) { 
                /* Temp and Argumentregister can be used as saved registers */
 
                int_reg->sav_top = INT_ARG_CNT + INT_TMP_CNT + INT_SAV_CNT;
@@ -1489,7 +1483,7 @@ void _lsra_main(jitdata *jd, int *lifet, int lifetimecount,
                lsra_expire_old_intervalls(jd, lt, reg);
                reg_index = -1;
                temp = false;
-               if (lt->savedvar || jd->isleafmethod) {
+               if (lt->savedvar || code_is_leafmethod(code)) {
                        /* use Saved Reg (in case of leafmethod all regs are saved regs) */
                        if (reg->sav_top > regsneeded) {
 #if defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
@@ -1568,7 +1562,7 @@ void _lsra_expire_old_intervalls(jitdata *jd, struct lifetime *lt,
                if (active[i]->i_end > lt->i_start) break;
 
                /* make active[i]->reg available again */
-               if (jd->isleafmethod) { 
+               if (code_is_leafmethod(code)) { 
                        /* leafmethod -> don't care about type -> put all again into */
                        /* reg->sav_reg */
 #if defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
@@ -1612,7 +1606,7 @@ void _lsra_expire_old_intervalls(jitdata *jd, struct lifetime *lt,
 
 void spill_at_intervall(jitdata *jd, struct lifetime *lt )
 {
-       if (lt->savedvar || jd->isleafmethod) {
+       if (lt->savedvar || code_is_leafmethod(code)) {
                _spill_at_intervall(lt, jd->ls->active_sav, &(jd->ls->active_sav_top));
        } else {
                _spill_at_intervall(lt, jd->ls->active_tmp, &(jd->ls->active_tmp_top));
index bc8cd1add5aedd4dfc980319a576c916e584f8e3..be17bd03753e8f770eb9204a09a90eb432bc9a1d 100644 (file)
@@ -317,6 +317,7 @@ bool regalloc(jitdata *jd)
 static void simplereg_allocate_interfaces(jitdata *jd)
 {
        methodinfo   *m;
+       codeinfo     *code;
        codegendata  *cd;
        registerdata *rd;
 
@@ -334,9 +335,10 @@ static void simplereg_allocate_interfaces(jitdata *jd)
 
        /* 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;
 
        /* rd->memuse was already set in stack.c to allocate stack space
           for passing arguments to called methods. */
@@ -349,7 +351,7 @@ static void simplereg_allocate_interfaces(jitdata *jd)
        }
 #endif
 
-       if (jd->isleafmethod) {
+       if (code_is_leafmethod(code)) {
                /* Reserve argument register, which will be used for Locals acting */
                /* as Parameters */
                if (rd->argintreguse < m->parseddesc->argintreguse)
@@ -396,7 +398,7 @@ static void simplereg_allocate_interfaces(jitdata *jd)
                        if (!saved) {
 #if defined(HAS_ADDRESS_REGISTER_FILE)
                                if (IS_ADR_TYPE(t)) {
-                                       if (!jd->isleafmethod && AVAIL_ARG_ADR) {
+                                       if (!code_is_leafmethod(code) && AVAIL_ARG_ADR) {
                                                flags |= ARGREG;
                                                TAKE_ARG_ADR(regoff);
                                        } 
@@ -775,6 +777,7 @@ static void simplereg_allocate_locals_leafmethod(jitdata *jd)
        
 static void simplereg_allocate_locals(jitdata *jd)
 {
+       codeinfo     *code;
        codegendata  *cd;
        registerdata *rd;
 
@@ -789,10 +792,11 @@ static void simplereg_allocate_locals(jitdata *jd)
 
        /* get required compiler data */
 
-       cd = jd->cd;
-       rd = jd->rd;
+       code = jd->code;
+       cd   = jd->cd;
+       rd   = jd->rd;
 
-       if (jd->isleafmethod) {
+       if (code_is_leafmethod(code)) {
                simplereg_allocate_locals_leafmethod(jd);
                return;
        }
index 63fa5d293ee16b7a7b7696f2a875f51cdd4f05b8..f352bdb59925d1b78ecd923cb1671f3dc61aff9f 100644 (file)
@@ -118,7 +118,7 @@ bool codegen_emit(jitdata *jd)
        s4 i, p, t, l;
        s4 savedregs_num;
 
-       savedregs_num = (jd->isleafmethod) ? 0 : 1;       /* space to save the RA */
+       savedregs_num = code_is_leafmethod(code) ? 0 : 1; /* space to save the RA */
 
        /* space to save used callee saved registers */
 
@@ -154,7 +154,13 @@ bool codegen_emit(jitdata *jd)
 #endif
                (void) dseg_add_unique_s4(cd, 0);                          /* IsSync  */
 
-       (void) dseg_add_unique_s4(cd, jd->isleafmethod);               /* IsLeaf  */
+       /* 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, INT_SAV_CNT - rd->savintreguse); /* IntSave */
        (void) dseg_add_unique_s4(cd, FLT_SAV_CNT - rd->savfltreguse); /* FltSave */
 
@@ -179,7 +185,7 @@ bool codegen_emit(jitdata *jd)
        /* save return address and used callee saved registers */
 
        p = cd->stackframesize;
-       if (!jd->isleafmethod) {
+       if (!code_is_leafmethod(code)) {
                p--; M_AST(REG_RA, REG_SP, p * 8);
        }
        for (i = INT_SAV_CNT - 1; i >= rd->savintreguse; i--) {
@@ -2423,7 +2429,7 @@ nowperformreturn:
 
                        /* restore return address                                         */
 
-                       if (!jd->isleafmethod) {
+                       if (!code_is_leafmethod(code)) {
                                p--; M_LLD(REG_RA, REG_SP, p * 8);
                        }
 
index c100dfce61d917d3a12a11f1e84078b5f5acf04e..63f1fbab4c6dc194525b4f96f80bedfd04456bc0 100644 (file)
@@ -469,6 +469,7 @@ uint32_t emit_trap(codegendata *cd)
 void emit_verbosecall_enter(jitdata *jd)
 {
        methodinfo   *m;
+       codeinfo     *code;
        codegendata  *cd;
        registerdata *rd;
        methoddesc   *md;
@@ -478,9 +479,10 @@ void emit_verbosecall_enter(jitdata *jd)
 
        /* 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;
 
        md = m->parseddesc;
 
@@ -495,7 +497,7 @@ void emit_verbosecall_enter(jitdata *jd)
 
        /* save all argument and temporary registers for leaf methods */
 
-       if (jd->isleafmethod) {
+       if (code_is_leafmethod(code)) {
                j = 1 + md->paramcount;
 
                for (i = 0; i < INT_ARG_CNT; i++, j++)
@@ -565,7 +567,7 @@ void emit_verbosecall_enter(jitdata *jd)
 
        /* restore all argument and temporary registers for leaf methods */
 
-       if (jd->isleafmethod) {
+       if (code_is_leafmethod(code)) {
                j = 1 + md->paramcount;
 
                for (i = 0; i < INT_ARG_CNT; i++, j++)
index cd883d23eb7fdf846b8b66e530d587a12f3d7bda..7146e0581e30ae8ae36123c102affbea599a363a 100644 (file)
@@ -120,7 +120,8 @@ bool codegen_emit(jitdata *jd)
        
        /* space to save used callee saved registers */
 
-       savedregs_num = (jd->isleafmethod) ? 0 : 1;       /* space to save the LR */
+       savedregs_num = code_is_leafmethod(code) ? 0 : 1; /* space to save the LR */
+
        savedregs_num += (INT_SAV_CNT - rd->savintreguse);
        /*savedregs_num += (FLT_SAV_CNT - rd->savfltreguse);*/
        assert((FLT_SAV_CNT - rd->savfltreguse) == 0);
@@ -159,7 +160,13 @@ bool codegen_emit(jitdata *jd)
 #endif
                (void) dseg_add_unique_s4(cd, 0);                  /* IsSync          */
 
-       (void) dseg_add_unique_s4(cd, jd->isleafmethod);       /* IsLeaf          */
+       /* 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, INT_SAV_CNT - rd->savintreguse); /* IntSave */
        (void) dseg_add_unique_s4(cd, FLT_SAV_CNT - rd->savfltreguse); /* FltSave */
        (void) dseg_addlinenumbertablesize(cd);
@@ -178,7 +185,7 @@ bool codegen_emit(jitdata *jd)
 
        savedregs_bitmask = 0;
 
-       if (!jd->isleafmethod)
+       if (!code_is_leafmethod(code))
                savedregs_bitmask = (1<<REG_LR);
 
        for (i = INT_SAV_CNT - 1; i >= rd->savintreguse; i--)
@@ -2165,7 +2172,7 @@ bool codegen_emit(jitdata *jd)
                        /* restore callee saved registers + do return */
 
                        if (savedregs_bitmask) {
-                               if (!jd->isleafmethod) {
+                               if (!code_is_leafmethod(code)) {
                                        savedregs_bitmask &= ~(1<<REG_LR);
                                        savedregs_bitmask |= (1<<REG_PC);
                                }
@@ -2174,7 +2181,7 @@ bool codegen_emit(jitdata *jd)
 
                        /* if LR was not on stack, we need to return manually */
 
-                       if (jd->isleafmethod)
+                       if (code_is_leafmethod(code))
                                M_MOV(REG_PC, REG_LR);
                        break;
 
index 8ba32c8ad90c2bb7a0866ac2d68d9a9b3ddd101d..12d4110b0803db867ddc776f8fb4d36754087b18 100644 (file)
@@ -353,13 +353,15 @@ void md_param_alloc_native(methoddesc *md)
 void md_return_alloc(jitdata *jd, stackptr stackslot)
 {
        methodinfo   *m;
+       codeinfo     *code;
        registerdata *rd;
        methoddesc   *md;
 
        /* get required compiler data */
 
-       m  = jd->m;
-       rd = jd->rd;
+       m    = jd->m;
+       code = jd->code;
+       rd   = jd->rd;
 
        md = m->parseddesc;
 
@@ -367,7 +369,7 @@ void md_return_alloc(jitdata *jd, stackptr stackslot)
           their argument register -> so leafmethods with paramcount > 0
           could already use R0 == a00! */
 
-       if (!jd->isleafmethod || (md->paramcount == 0)) {
+       if (!code_is_leafmethod(code) || (md->paramcount == 0)) {
                /* Only precolor the stackslot, if it is not a SAVEDVAR <->
                   has not to survive method invokations. */
 
index b8701b93552b88f420dd5b6a95f882af67579a9e..c8c4db5b420af724ae2c5fe06b8887661dca3ca8 100644 (file)
@@ -148,7 +148,7 @@ bool codegen_emit(jitdata *jd)
 
     /* Keep stack of non-leaf functions 16-byte aligned. */
 
-       if (!jd->isleafmethod) {
+       if (!code_is_leafmethod(code)) {
                ALIGN_ODD(cd->stackframesize);    /* XXX this is wrong, +4 is missing */
        }
 
@@ -168,7 +168,11 @@ bool codegen_emit(jitdata *jd)
 #endif
                (void) dseg_add_unique_s4(cd, 0);                  /* IsSync          */
                                               
-       (void) dseg_add_unique_s4(cd, jd->isleafmethod);       /* IsLeaf          */
+       if (code_is_leafmethod(code))
+               (void) dseg_add_unique_s4(cd, 1);                  /* IsLeaf          */
+       else
+               (void) dseg_add_unique_s4(cd, 0);                  /* IsLeaf          */
+
        (void) dseg_add_unique_s4(cd, INT_SAV_CNT - rd->savintreguse); /* IntSave */
        (void) dseg_add_unique_s4(cd, FLT_SAV_CNT - rd->savfltreguse); /* FltSave */
 
index c86071753cb371fee7557f4ac53af7c8982665a8..e35f99c292c549a9fd9a4d5def1fed9f21e85d85 100644 (file)
@@ -556,6 +556,7 @@ uint32_t emit_trap(codegendata *cd)
 void emit_verbosecall_enter(jitdata *jd)
 {
        methodinfo   *m;
+       codeinfo     *code;
        codegendata  *cd;
        registerdata *rd;
        methoddesc   *md;
@@ -567,9 +568,10 @@ void emit_verbosecall_enter(jitdata *jd)
 
        /* 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;
 
        md = m->parseddesc;
 
@@ -586,7 +588,7 @@ void emit_verbosecall_enter(jitdata *jd)
 
        /* save temporary registers for leaf methods */
 
-       if (jd->isleafmethod) {
+       if (code_is_leafmethod(code)) {
                for (i = 0; i < INT_TMP_CNT; i++)
                        M_IST(rd->tmpintregs[i], REG_SP, (2 + i) * 8);
        }
@@ -604,7 +606,7 @@ void emit_verbosecall_enter(jitdata *jd)
 
        /* restore temporary registers for leaf methods */
 
-       if (jd->isleafmethod) {
+       if (code_is_leafmethod(code)) {
                for (i = 0; i < INT_TMP_CNT; i++)
                        M_ILD(rd->tmpintregs[i], REG_SP, (2 + i) * 8);
        }
index 06fc9c727877d302af649cd0dcdab0167a41fa10..23e23184f19e39d5cb2baa74e7fb9d747e09f36b 100644 (file)
@@ -3024,6 +3024,7 @@ static void inline_gather_statistics(inline_node *iln)
 
 static void inline_post_process(jitdata *jd)
 {
+       codeinfo   *code;
        basicblock *bptr;
        instruction *iptr;
        instruction *iend;
@@ -3033,6 +3034,10 @@ static void inline_post_process(jitdata *jd)
        methoddesc *md;
        builtintable_entry *bte;
 
+       /* Get required compiler data. */
+
+       code = jd->code;
+
        /* reset the SAVEDVAR flag of all variables */
 
        for (i=0; i<jd->vartop; ++i)
@@ -3070,7 +3075,7 @@ static void inline_post_process(jitdata *jd)
                                        POSTPROCESS_SRCOP(s1);
                                case DF_0_TO_0:
                                        if (icmdt->flags & ICMDTABLE_CALLS) {
-                                               jd->isleafmethod = false;
+                                               code_unflag_leafmethod(code);
                                                MARK_ALL_SAVED;
                                        }
                                        break;
@@ -3082,7 +3087,7 @@ static void inline_post_process(jitdata *jd)
                                        POSTPROCESS_SRCOP(s1);
                                case DF_0_TO_1:
                                        if (icmdt->flags & ICMDTABLE_CALLS) {
-                                               jd->isleafmethod = false;
+                                               code_unflag_leafmethod(code);
                                                MARK_ALL_SAVED;
                                        }
                                case DF_COPY:
@@ -3094,7 +3099,7 @@ static void inline_post_process(jitdata *jd)
                                                POSTPROCESS_SRC(iptr->sx.s23.s2.args[i]);
                                        }
                                        if (icmdt->flags & ICMDTABLE_CALLS) {
-                                               jd->isleafmethod = false;
+                                               code_unflag_leafmethod(code);
                                                MARK_ALL_SAVED;
                                        }
                                        POSTPROCESS_DSTOP(dst);
@@ -3103,7 +3108,7 @@ static void inline_post_process(jitdata *jd)
                                case DF_INVOKE:
                                        INSTRUCTION_GET_METHODDESC(iptr, md);
                post_process_call:
-                                       jd->isleafmethod = false;
+                                       code_unflag_leafmethod(code);
                                        for (i=0; i<md->paramcount; ++i) {
                                                POSTPROCESS_SRC(iptr->sx.s23.s2.args[i]);
                                        }
index e240380056c2bd3eb351b78a25d900475ebeb151..05cfe6faa109fbd563bfe62a9ef7e9f1b2dbd381 100644 (file)
@@ -950,7 +950,8 @@ static u1 *do_nothing_function(void)
 
 jitdata *jit_jitdata_new(methodinfo *m)
 {
-       jitdata *jd;
+       jitdata  *jd;
+       codeinfo *code;
 
        /* allocate jitdata structure and fill it */
 
@@ -965,10 +966,23 @@ jitdata *jit_jitdata_new(methodinfo *m)
 
        /* Allocate codeinfo memory from the heap as we need to keep them. */
 
-       jd->code  = code_codeinfo_new(m);
+       code = code_codeinfo_new(m);
+
+       /* Set codeinfo flags. */
+
+#if defined(ENABLE_THREADS)
+       if (checksync && (m->flags & ACC_SYNCHRONIZED))
+               code_flag_synchronized(code);
+
+       if (checksync && (m->flags & ACC_SYNCHRONIZED))
+               code_unflag_leafmethod(code);
+#endif
+       else
+               code_flag_leafmethod(code);
 
        /* initialize variables */
 
+       jd->code                 = code;
        jd->flags                = 0;
        jd->exceptiontable       = NULL;
        jd->exceptiontablelength = 0;
@@ -979,13 +993,6 @@ jitdata *jit_jitdata_new(methodinfo *m)
        jd->returnblock          = NULL;
        jd->maxlocals            = m->maxlocals;
 
-#if defined(ENABLE_THREADS)
-       if (checksync && (m->flags & ACC_SYNCHRONIZED))
-               jd->isleafmethod = false;
-       else
-#endif
-               jd->isleafmethod = true;
-
        return jd;
 }
 
index c381b6e40357b4e21c72c3ad22d5bcd588a845f9..a2ba257f27c4b267a628577c7881eea125db38db 100644 (file)
@@ -125,7 +125,6 @@ struct jitdata {
 #endif
 
        u4               flags;           /* contains JIT compiler flags          */
-       bool             isleafmethod;    /* true, if no subroutines are called   */
 
        instruction     *instructions;    /* ICMDs, valid between parse and stack */
        basicblock      *basicblocks;     /* start of basic block list            */
index 706619b6574dfa41bf8aba85d76dea38b5ade4c2..636bfab795d43306debe2a5527abf3b9de61ea10 100644 (file)
@@ -145,7 +145,13 @@ bool codegen_emit(jitdata *jd)
                else
 #endif
                (void) dseg_add_unique_s4(cd, 0);                      /* IsSync          */
-               (void) dseg_add_unique_s4(cd, jd->isleafmethod);       /* IsLeaf          */
+
+               /* 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);
 
                /* XXX we use the IntSave a split field for the adr now */
                (void) dseg_add_unique_s4(cd, (ADR_SAV_CNT - rd->savadrreguse) << 16 | (INT_SAV_CNT - rd->savintreguse)); /* IntSave */
@@ -1950,7 +1956,7 @@ nowperformreturn:
 
                        /* restore return address                                         */
 #if 0
-                       if (!jd->isleafmethod) {
+                       if (!code_is_leafmethod(code)) {
                                /* ATTENTION: Don't use REG_ZERO (r0) here, as M_ALD
                                   may have a displacement overflow. */
 
index 84b1b8af59348e7f9501f257e2557d404035f056..4bf2d0552a01e412c838f7393dc63171fe73086e 100644 (file)
@@ -118,7 +118,7 @@ bool codegen_emit(jitdata *jd)
        s4 i, p, t, l;
        s4 savedregs_num;
 
-       savedregs_num = (jd->isleafmethod) ? 0 : 1;       /* space to save the RA */
+       savedregs_num = code_is_leafmethod(code) ? 0 : 1; /* space to save the RA */
 
        /* space to save used callee saved registers */
 
@@ -163,7 +163,13 @@ bool codegen_emit(jitdata *jd)
 #endif
                (void) dseg_add_unique_s4(cd, 0);                  /* IsSync          */
                                               
-       (void) dseg_add_unique_s4(cd, jd->isleafmethod);       /* IsLeaf          */
+       /* 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, INT_SAV_CNT - rd->savintreguse); /* IntSave */
        (void) dseg_add_unique_s4(cd, FLT_SAV_CNT - rd->savfltreguse); /* FltSave */
        dseg_addlinenumbertablesize(cd);
@@ -186,7 +192,7 @@ bool codegen_emit(jitdata *jd)
        /* save return address and used callee saved registers */
 
        p = cd->stackframesize;
-       if (!jd->isleafmethod) {
+       if (!code_is_leafmethod(code)) {
                p--; M_AST(REG_RA, REG_SP, p * 8);
        }
        for (i = INT_SAV_CNT - 1; i >= rd->savintreguse; i--) {
@@ -2893,7 +2899,7 @@ nowperformreturn:
 
                        /* restore return address                                         */
 
-                       if (!jd->isleafmethod) {
+                       if (!code_is_leafmethod(code)) {
                                p--; M_ALD(REG_RA, REG_SP, p * 8);
                        }
 
index 287e7ef48a3482c8565ae405a273181565dbd998..5bfc98b7870ce1e284ecbf6eed3fe2ee325fcc56 100644 (file)
@@ -630,6 +630,7 @@ uint32_t emit_trap(codegendata *cd)
 void emit_verbosecall_enter(jitdata *jd)
 {
        methodinfo   *m;
+       codeinfo     *code;
        codegendata  *cd;
        registerdata *rd;
        methoddesc   *md;
@@ -638,9 +639,10 @@ void emit_verbosecall_enter(jitdata *jd)
 
        /* 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;
 
        md = m->parseddesc;
 
@@ -662,7 +664,7 @@ void emit_verbosecall_enter(jitdata *jd)
 
        /* save temporary registers for leaf methods */
 
-       if (jd->isleafmethod) {
+       if (code_is_leafmethod(code)) {
                for (i = 0; i < INT_TMP_CNT; i++)
                        M_AST(rd->tmpintregs[i], REG_SP, PA_SIZE + (2 + ARG_CNT + i) * 8);
 
@@ -730,7 +732,7 @@ void emit_verbosecall_enter(jitdata *jd)
 
        /* restore temporary registers for leaf methods */
 
-       if (jd->isleafmethod) {
+       if (code_is_leafmethod(code)) {
                for (i = 0; i < INT_TMP_CNT; i++)
                        M_ALD(rd->tmpintregs[i], REG_SP, PA_SIZE + (2 + ARG_CNT + i) * 8);
 
index 1f04a1cba65cb53506a8c460ddfb6dd63218c771..10c17f657f37030e474de27e6a162d60104dc83b 100644 (file)
@@ -1,6 +1,6 @@
 /* src/vm/jit/optimizing/lsra.inc - linear scan register allocator
 
-   Copyright (C) 2005, 2006 R. Grafl, A. Krall, C. Kruegel, C. Oates,
+   Copyright (C) 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., 59 Temple Place - Suite 330, Boston, MA
    02111-1307, USA.
 
-   Contact: cacao@complang.tuwien.ac.at
-
-   Authors: Christian Ullrich
+*/
 
 
-*/
 #include "config.h"
 
 #include <stdio.h>
@@ -153,7 +150,7 @@ void lsra(jitdata *jd) {
 #if defined(LSRA_DEBUG_VERBOSE)
        if (compileverbose) {
                printf("%s %s ",m->class->name->text, m->name->text);
-               if (jd->isleafmethod)
+               if (code_is_leafmethod(code))
                        printf("**Leafmethod**");
                printf("\n");
        }
@@ -275,7 +272,7 @@ void lsra_reg_setup(jitdata *jd,
 
        int_reg->nregdesc = nregdescint;
        flt_reg->nregdesc = nregdescfloat;
-       if (jd->isleafmethod) { 
+       if (code_is_leafmethod(code)) { 
                /* Temp and Argumentregister can be used as saved registers */
 
                int_reg->sav_top = INT_ARG_CNT + INT_TMP_CNT + INT_SAV_CNT;
@@ -707,7 +704,7 @@ void _lsra_main( jitdata *jd, int *lifet, int lifetimecount,
 #ifdef LSRA_SAVEDVAR
                lt->savedvar = SAVEDVAR;
 #endif
-               if (lt->savedvar || jd->isleafmethod) {
+               if (lt->savedvar || code_is_leafmethod(code)) {
                        /* use Saved Reg (in case of leafmethod all regs are saved regs) */
                        if (reg->sav_top > regsneeded) {
 #if defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
@@ -790,7 +787,7 @@ void _lsra_expire_old_intervalls(jitdata *jd, struct lifetime *lt,
                if (active[i]->i_end > lt->i_start) break;
 
                /* make active[i]->reg available again */
-               if (jd->isleafmethod) { 
+               if (code_is_leafmethod(code)) { 
                        /* leafmethod -> don't care about type -> put all again into */
                        /* reg->sav_reg */
 #if defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
@@ -838,7 +835,7 @@ void spill_at_intervall(jitdata *jd, struct lifetime *lt )
 
        ls = jd->ls;
 
-       if (lt->savedvar || jd->isleafmethod) {
+       if (lt->savedvar || code_is_leafmethod(code)) {
                _spill_at_intervall(lt, ls->active_sav, &(ls->active_sav_top));
        } else {
                _spill_at_intervall(lt, ls->active_tmp, &(ls->active_tmp_top));
index a785ba42944791ac73e273b17679d5f5f66836ce..73df8dea60114a5ee10f15ed48af0bfee2bb20e1 100644 (file)
@@ -1,6 +1,6 @@
 /* src/vm/jit/optimizing/ssa.c - static single-assignment form
 
-   Copyright (C) 2005, 2006 R. Grafl, A. Krall, C. Kruegel, C. Oates,
+   Copyright (C) 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., 59 Temple Place - Suite 330, Boston, MA
    02111-1307, USA.
 
-   Contact: cacao@complang.tuwien.ac.at
+*/
 
-   Authors: Christian Ullrich
 
+#include "config.h"
 
-*/
 #include <stdio.h>
 #include <stdlib.h>
 
@@ -235,7 +234,7 @@ void ssa_init(jitdata *jd) {
 # if defined(SSA_DEBUG_VERBOSE)
        if (compileverbose) {
                printf("%s %s ",m->class->name->text, m->name->text);
-               if (jd->isleafmethod)
+               if (code_is_leafmethod(code))
                        printf("**Leafmethod**");
                printf("\n");
        }
@@ -750,7 +749,7 @@ void ssa_rename(jitdata *jd, graphdata *gd, dominatordata *dd)
 # if defined(SSA_DEBUG_VERBOSE)
        if (compileverbose) {
                printf("%s %s ",jd->m->class->name->text, jd->m->name->text);
-               if (jd->isleafmethod)
+               if (code_is_leafmethod(code))
                        printf("**Leafmethod**");
                printf("\n");
        }
index 068dc65afed4e81e1d102e31ffbf3505206554c9..b2c74ccd7ec09230b1a99f19cc09c09d7ca79a5e 100644 (file)
@@ -371,6 +371,7 @@ static bool parse_resolve_exception_table(jitdata *jd, parsedata_t *pd)
 bool parse(jitdata *jd)
 {
        methodinfo  *m;                     /* method being parsed                */
+       codeinfo    *code;
        parsedata_t  pd;
        instruction *iptr;                  /* current ptr into instruction array */
 
@@ -412,7 +413,8 @@ bool parse(jitdata *jd)
 
        /* get required compiler data */
 
-       m = jd->m;
+       m    = jd->m;
+       code = jd->code;
 
        /* allocate buffers for local variable renaming */
 
@@ -908,7 +910,6 @@ fetch_opcode:
                        break;
 
                case JAVA_MULTIANEWARRAY:
-                       jd->isleafmethod = false;
                        i = SUCK_BE_U2(m->jcode + bcindex + 1);
                        j = SUCK_BE_U1(m->jcode + bcindex + 3);
   
@@ -923,6 +924,7 @@ fetch_opcode:
   
                        iptr->s1.argcount = j;
                        OP_S3_CLASSINFO_OR_CLASSREF(opcode, c, cr, INS_FLAG_CHECK);
+                       code_unflag_leafmethod(code);
                        break;
 
                /* control flow instructions ******************************************/
@@ -1148,7 +1150,7 @@ jsr_tail:
 
                case JAVA_AASTORE:
                        OP(opcode);
-                       jd->isleafmethod = false;
+                       code_unflag_leafmethod(code);
                        break;
 
                case JAVA_GETSTATIC:
@@ -1244,7 +1246,7 @@ invoke_nonstatic_method:
                                        return false;
 
 invoke_method:
-                       jd->isleafmethod = false;
+                       code_unflag_leafmethod(code);
 
                        iptr->sx.s23.s3.fmiref = fmi;
 
@@ -1325,7 +1327,7 @@ invoke_method:
                        if (cr->name->text[0] == '[') {
                                /* array type cast-check */
                                flags = INS_FLAG_CHECK | INS_FLAG_ARRAY;
-                               jd->isleafmethod = false;
+                               code_unflag_leafmethod(code);
                        }
                        else {
                                /* object type cast-check */
index 4b791301bf56f75c77820af0c93ee2f6788bf7b4..55917d6a27db984ffbef144c7c108d196ad0699d 100644 (file)
     } while (0)
 
 #define OP_BUILTIN_CHECK_EXCEPTION(bte)                              \
-    jd->isleafmethod         = false;                                \
+    code_unflag_leafmethod(code);                                    \
     OP_PREPARE_FLAGS(ICMD_BUILTIN, INS_FLAG_CHECK);                  \
     iptr->sx.s23.s3.bte      = (bte);                                \
     PINC
 
 #define OP_BUILTIN_NO_EXCEPTION(bte)                                 \
-    jd->isleafmethod         = false;                                \
+    code_unflag_leafmethod(code);                                    \
     OP_PREPARE_ZEROFLAGS(ICMD_BUILTIN);                              \
     iptr->sx.s23.s3.bte      = (bte);                                \
     PINC
 
 #define OP_BUILTIN_ARITHMETIC(opcode, bte)                           \
-    jd->isleafmethod         = false;                                \
+    code_unflag_leafmethod(code);                                    \
     OP_PREPARE_FLAGS(opcode, INS_FLAG_CHECK);                        \
     iptr->sx.s23.s3.bte      = (bte);                                \
     PINC
index c6aa70ea43651007c4ffebf39534e4f3750a742a..96faa9adaf3ed3a18aaded3693a509d1dc152088 100644 (file)
@@ -145,10 +145,10 @@ bool codegen_emit(jitdata *jd)
 
        /* align stack to 16-bytes */
 
-       if (!jd->isleafmethod || JITDATA_HAS_FLAG_VERBOSECALL(jd))
+       if (!code_is_leafmethod(code) || JITDATA_HAS_FLAG_VERBOSECALL(jd))
                ALIGN_2(cd->stackframesize);
 
-       else if (jd->isleafmethod && (cd->stackframesize == LA_SIZE_IN_POINTERS))
+       else if (code_is_leafmethod(code) && (cd->stackframesize == LA_SIZE_IN_POINTERS))
                cd->stackframesize = 0;
 
        (void) dseg_add_unique_address(cd, code);              /* CodeinfoPointer */
@@ -167,7 +167,13 @@ bool codegen_emit(jitdata *jd)
 #endif
                (void) dseg_add_unique_s4(cd, 0);                  /* IsSync          */
                                               
-       (void) dseg_add_unique_s4(cd, jd->isleafmethod);       /* IsLeaf          */
+       /* 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, INT_SAV_CNT - rd->savintreguse); /* IntSave */
        (void) dseg_add_unique_s4(cd, FLT_SAV_CNT - rd->savfltreguse); /* FltSave */
 
@@ -201,7 +207,7 @@ bool codegen_emit(jitdata *jd)
 
        /* create stack frame (if necessary) */
 
-       if (!jd->isleafmethod) {
+       if (!code_is_leafmethod(code)) {
                M_MFLR(REG_ZERO);
                M_AST(REG_ZERO, REG_SP, LA_LR_OFFSET);
        }
@@ -1714,13 +1720,13 @@ bool codegen_emit(jitdata *jd)
                        M_ALD(REG_ITMP2, REG_PV, disp);
                        M_MTCTR(REG_ITMP2);
 
-                       if (jd->isleafmethod)
+                       if (code_is_leafmethod(code))
                                M_MFLR(REG_ITMP3);                          /* save LR        */
 
                        M_BL(0);                                        /* get current PC */
                        M_MFLR(REG_ITMP2_XPC);
 
-                       if (jd->isleafmethod)
+                       if (code_is_leafmethod(code))
                                M_MTLR(REG_ITMP3);                          /* restore LR     */
 
                        M_RTS;                                          /* jump to CTR    */
@@ -2121,7 +2127,7 @@ nowperformreturn:
 
                        /* restore return address                                         */
 
-                       if (!jd->isleafmethod) {
+                       if (!code_is_leafmethod(code)) {
                                /* ATTENTION: Don't use REG_ZERO (r0) here, as M_ALD
                                   may have a displacement overflow. */
 
index 4d6d08f94269f69b5879c8ada4ec840b2990ffea..529b69354f9cfd38bf29db2fac765f18d1f3046b 100644 (file)
@@ -397,13 +397,15 @@ void md_param_alloc_native(methoddesc *md)
 void md_return_alloc(jitdata *jd, stackptr stackslot)
 {
        methodinfo   *m;
+       codeinfo     *code;
        registerdata *rd;
        methoddesc   *md;
 
        /* get required compiler data */
 
-       m  = jd->m;
-       rd = jd->rd;
+       m    = jd->m;
+       code = jd->code;
+       rd   = jd->rd;
 
        md = m->parseddesc;
 
@@ -411,7 +413,7 @@ void md_return_alloc(jitdata *jd, stackptr stackslot)
           their argument register -> so leafmethods with paramcount > 0
           could already use R3 == a00! */
 
-       if (!jd->isleafmethod || (md->paramcount == 0)) {
+       if (!code_is_leafmethod(code) || (md->paramcount == 0)) {
                /* Only precolor the stackslot, if it is not a SAVEDVAR <->
                   has not to survive method invokations. */
 
index b57a0815d57ddd4d5a177f12b576901c36918507..fb7d8ae1e4fc93c8d7bb680eee104e75c030aa60 100644 (file)
@@ -405,13 +405,15 @@ void md_param_alloc_native(methoddesc *md)
 void md_return_alloc(jitdata *jd, stackptr stackslot)
 {
        methodinfo   *m;
+       codeinfo     *code;
        registerdata *rd;
        methoddesc   *md;
 
        /* get required compiler data */
 
-       m  = jd->m;
-       rd = jd->rd;
+       m    = jd->m;
+       code = jd->code;
+       rd   = jd->rd;
 
        md = m->parseddesc;
 
@@ -419,7 +421,7 @@ void md_return_alloc(jitdata *jd, stackptr stackslot)
           their argument register -> so leafmethods with paramcount > 0
           could already use R3 == a00! */
 
-       if (!jd->isleafmethod || (md->paramcount == 0)) {
+       if (!code_is_leafmethod(code) || (md->paramcount == 0)) {
                /* Only precolor the stackslot, if it is not a SAVEDVAR <->
                   has not to survive method invokations. */
 
index 0707d74896b111447885af7fedff2e0311fce749..11eba8b4b0809218dbfae83fb2d2cd4f27a468e1 100644 (file)
@@ -168,8 +168,15 @@ bool codegen_emit(jitdata *jd)
        else
 #endif
                (void) dseg_add_unique_s4(cd, 0);                          /* IsSync          */
+
                                               
-       (void) dseg_add_unique_s4(cd, jd->isleafmethod);                /* IsLeaf          */
+       /* 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, INT_SAV_CNT - rd->savintreguse); /* IntSave         */
        (void) dseg_add_unique_s4(cd, FLT_SAV_CNT - rd->savfltreguse); /* FltSave         */
 
@@ -188,7 +195,7 @@ bool codegen_emit(jitdata *jd)
        
        /* create stack frame (if necessary) */
 
-       if (!jd->isleafmethod) {
+       if (!code_is_leafmethod(code)) {
                M_MFLR(REG_ZERO);
                M_AST(REG_ZERO, REG_SP, LA_LR_OFFSET);
        }
@@ -1660,12 +1667,16 @@ bool codegen_emit(jitdata *jd)
                        M_ALD(REG_ITMP2, REG_PV, disp);
                        M_MTCTR(REG_ITMP2);
 
-                       if (jd->isleafmethod) M_MFLR(REG_ITMP3);         /* save LR        */
+                       if (code_is_leafmethod(code))
+                               M_MFLR(REG_ITMP3);                          /* save LR        */
+
                        M_BL(0);                                        /* get current PC */
                        M_MFLR(REG_ITMP2_XPC);
-                       if (jd->isleafmethod) M_MTLR(REG_ITMP3);         /* restore LR     */
-                       M_RTS;                                          /* jump to CTR    */
 
+                       if (code_is_leafmethod(code))
+                               M_MTLR(REG_ITMP3);                          /* restore LR     */
+
+                       M_RTS;                                          /* jump to CTR    */
                        ALIGNCODENOP;
                        break;
 
@@ -1904,7 +1915,7 @@ nowperformreturn:
 
                        /* restore return address                                         */
 
-                       if (!jd->isleafmethod) {
+                       if (!code_is_leafmethod(code)) {
                                /* ATTENTION: Don't use REG_ZERO (r0) here, as M_ALD
                                   may have a displacement overflow. */
 
index 4349b45bddd594e987069e01f7c565be59c50bf9..3cb624189caa9c49636bd1fc73005cdac79b00ed 100644 (file)
@@ -292,16 +292,16 @@ void md_param_alloc_native(methoddesc *md)
 
 void md_return_alloc(jitdata *jd, stackptr stackslot)
 {
-       methodinfo *m;
-       codeinfo *code;
+       methodinfo   *m;
+       codeinfo     *code;
        registerdata *rd;
-       methoddesc *md;
+       methoddesc   *md;
 
        /* get required compiler data */
 
-       m = jd->m;
+       m    = jd->m;
        code = jd->code;
-       rd = jd->rd;
+       rd   = jd->rd;
 
        md = m->parseddesc;
        
@@ -309,7 +309,7 @@ void md_return_alloc(jitdata *jd, stackptr stackslot)
           their argument register -> so leafmethods with paramcount > 0
           could already use R3 == a00! */
 
-       if (!jd->isleafmethod || (md->paramcount == 0)) {
+       if (!code_is_leafmethod(code) || (md->paramcount == 0)) {
                /* Only precolor the stackslot, if it is not a SAVEDVAR <->
                   has not to survive method invokations. */
 
index 4e24cca5cb6c68e9186f9ea789de8eaddef8031b..328c7b514133df27acfab1a2d2ead052d11f4ee5 100644 (file)
@@ -430,9 +430,8 @@ bool replace_create_replacement_points(jitdata *jd)
        m = code->m;
 
        /* set codeinfo flags */
-       /* REMOVE ME */
-       if (jd->isleafmethod)
-               code_flag_leafmethod(code);
+
+       code_flag_leafmethod(code);
 
        /* in instance methods, we may need a rplpoint at the method entry */
 
index e5ebb14d37637161843d35bf192a88ce97fa8faa..7b2c7dd644e9440afcb30c15593ee726e7de3b9f 100644 (file)
@@ -197,7 +197,7 @@ bool codegen_emit(jitdata *jd)
           native code e.g. libc or jni (alignment problems with
           movaps). */
 
-       if (!jd->isleafmethod || opt_verbosecall )
+       if (!code_is_leafmethod(code) || opt_verbosecall )
                /* TODO really 16 bytes ? */
                cd->stackframesize = (cd->stackframesize + 2) & ~2;
 
@@ -219,7 +219,13 @@ bool codegen_emit(jitdata *jd)
 #endif
                (void) dseg_add_unique_s4(cd, 0);                    /* IsSync          */
 
-       (void) dseg_add_unique_s4(cd, jd->isleafmethod);               /* IsLeaf  */
+       /* 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, INT_SAV_CNT - rd->savintreguse); /* IntSave */
        (void) dseg_add_unique_s4(cd, FLT_SAV_CNT - rd->savfltreguse); /* FltSave */
 
index f0f9ba0c6f6b875c46c2c6f2008c1326c10d1f52..c7d5c0bf5281f85e2db75408c833fb47c941b8ef 100644 (file)
@@ -245,14 +245,17 @@ uint32_t emit_trap(codegendata *cd)
 void emit_verbosecall_enter(jitdata *jd)
 {
        methodinfo   *m;
+       codeinfo     *code;
        codegendata  *cd;
        methoddesc   *md;
        s4            stackframesize;
        s4            i, off, disp, s;
 
-       m  = jd->m;
-       cd = jd->cd;
-       md = m->parseddesc;
+       m    = jd->m;
+       code = jd->code;
+       cd   = jd->cd;
+
+       md   = m->parseddesc;
 
        /* mark trace code */
 
@@ -264,7 +267,7 @@ void emit_verbosecall_enter(jitdata *jd)
 
        /* for leaf methods we need to store unused argument and temporary registers */
 
-       if (jd->isleafmethod) {
+       if (code_is_leafmethod(code)) {
                stackframesize += (ARG_CNT + TMP_CNT) * 8;
        }
 
@@ -301,7 +304,7 @@ void emit_verbosecall_enter(jitdata *jd)
        /* save unused (currently all) argument registers for leaf methods */
        /* save temporary registers for leaf methods */
 
-       if (jd->isleafmethod) {
+       if (code_is_leafmethod(code)) {
 
                for (i = 0; i < INT_ARG_CNT; ++i, off += 8) {
                        M_IST(abi_registers_integer_argument[i], REG_SP, off);
@@ -340,7 +343,7 @@ void emit_verbosecall_enter(jitdata *jd)
        /* restore used argument registers */
        /* for leaf methods restore all argument and temporary registers */
 
-       if (jd->isleafmethod) {
+       if (code_is_leafmethod(code)) {
                off = 96 + (8 * md->paramcount);
 
                for (i = 0; i < INT_ARG_CNT; ++i, off += 8) {
index f962f5cb982b4977b5d926bc246ca7781d658a88..fc9d3ac5fae2606eff7875da300e6214fb44aebf 100644 (file)
@@ -270,13 +270,15 @@ void md_param_alloc_native(methoddesc *md)
 void md_return_alloc(jitdata *jd, stackptr stackslot)
 {
        methodinfo   *m;
+       codeinfo     *code;
        registerdata *rd;
        methoddesc   *md;
 
        /* get required compiler data */
 
-       m  = jd->m;
-       rd = jd->rd;
+       m    = jd->m;
+       code = jd->code;
+       rd   = jd->rd;
 
        md = m->parseddesc;
 
@@ -284,7 +286,7 @@ void md_return_alloc(jitdata *jd, stackptr stackslot)
           their argument register -> so leafmethods with paramcount > 0
           could already use R3 == a00! */
 
-       if (!jd->isleafmethod || (md->paramcount == 0)) {
+       if (!code_is_leafmethod(code) || (md->paramcount == 0)) {
                /* Only precolor the stackslot, if it is not a SAVEDVAR <->
                   has not to survive method invokations. */
 
index 0a108f6206067a30ef3c1b6795b107d614866bf1..41d77a156c93e7e81371c11873e8c66e1191e4fd 100644 (file)
@@ -179,7 +179,7 @@ void show_method(jitdata *jd, int stage)
 
        method_println(m);
 
-       if (jd->isleafmethod)
+       if (code_is_leafmethod(code))
                printf("LEAFMETHOD\n");
 
        printf("\nBasic blocks: %d\n", jd->basicblockcount);
index e968ffb49d7e1dec66e3e82882a544aa74c69067..c9ccc76e4ba44e7ec0ce4aca53809c92b2f93c73 100644 (file)
@@ -162,7 +162,7 @@ bool codegen_emit(jitdata *jd)
        s4 framesize_disp;
 
 #if 0 /* no leaf optimization yet */
-       savedregs_num = (jd->isleafmethod) ? 0 : 1;       /* space to save the RA */
+       savedregs_num = (code_is_leafmethod(code)) ? 0 : 1;       /* space to save the RA */
 #endif
        savedregs_num = WINSAVE_CNT + ABIPARAMS_CNT; /* register-window save area */ 
 
@@ -202,7 +202,13 @@ bool codegen_emit(jitdata *jd)
 #endif
                (void) dseg_add_unique_s4(cd, 0);                  /* IsSync          */
                                               
-       (void) dseg_add_unique_s4(cd, jd->isleafmethod);       /* IsLeaf          */
+       /* 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, INT_SAV_CNT - rd->savintreguse); /* IntSave */
        (void) dseg_add_unique_s4(cd, FLT_SAV_CNT - rd->savfltreguse); /* FltSave */
        dseg_addlinenumbertablesize(cd);
index 98ce9af806ed764c4dddfcd94a6d7234e7f854e8..28a2240560fb04875536bfc5a93abd7a94c08839 100644 (file)
@@ -759,7 +759,7 @@ void emit_verbosecall_enter(jitdata *jd)
 
        /* save temporary registers for leaf methods */
 /* XXX no leaf optimization yet
-       if (jd->isleafmethod) {
+       if (code_is_leafmethod(code)) {
                for (i = 0; i < INT_TMP_CNT; i++)
                        M_LST(rd->tmpintregs[i], REG_SP, (2 + ARG_CNT + i) * 8);
 
@@ -830,7 +830,7 @@ void emit_verbosecall_enter(jitdata *jd)
 
        /* restore temporary registers for leaf methods */
 /* XXX no leaf optimization yet
-       if (jd->isleafmethod) {
+       if (code_is_leafmethod(code)) {
                for (i = 0; i < INT_TMP_CNT; i++)
                        M_LLD(rd->tmpintregs[i], REG_SP, (2 + ARG_CNT + i) * 8);
 
index be75749519078d9967315c273beff0703532503a..3825a0821bda23584e1d5339c4e6856ef0acfa8f 100644 (file)
@@ -2010,6 +2010,7 @@ static void stack_init_javalocals(stackdata_t *sd)
 bool stack_analyse(jitdata *jd)
 {
        methodinfo   *m;              /* method being analyzed                    */
+       codeinfo     *code;
        registerdata *rd;
        stackdata_t   sd;
        int           stackdepth;
@@ -2052,6 +2053,7 @@ bool stack_analyse(jitdata *jd)
        /* get required compiler data - initialization */
 
        m    = jd->m;
+       code = jd->code;
        rd   = jd->rd;
 
        /* initialize the stackdata_t struct */
@@ -2287,7 +2289,7 @@ bool stack_analyse(jitdata *jd)
                                                iptr->flags.bits    &= INS_FLAG_ID_MASK;
                                                iptr->sx.s23.s3.bte  = bte;
                                                /* iptr->line is already set */
-                                               jd->isleafmethod     = false;
+                                               code_unflag_leafmethod(code);
                                                goto icmd_BUILTIN;
                                        }
 
index 75de5aa030187d57b10cd15e8a71ead6b2a3989b..d33fc79548d8af72ef1cc6ac26a6dd3b5e240de7 100644 (file)
@@ -29,6 +29,7 @@
 
 #include <assert.h>
 #include <stdio.h>
+#include <stdint.h>
 
 #include "vm/types.h"
 
@@ -54,6 +55,7 @@
 
 #include "vm/jit/abi.h"
 #include "vm/jit/asmpart.h"
+#include "vm/jit/code.h"
 #include "vm/jit/codegen-common.h"
 #include "vm/jit/dseg.h"
 #include "vm/jit/emit-common.h"
@@ -142,7 +144,7 @@ bool codegen_emit(jitdata *jd)
           native code e.g. libc or jni (alignment problems with
           movaps). */
 
-       if (!jd->isleafmethod || opt_verbosecall)
+       if (!code_is_leafmethod(code) || opt_verbosecall)
                cd->stackframesize |= 0x1;
 
        /* create method header */
@@ -163,7 +165,11 @@ bool codegen_emit(jitdata *jd)
 #endif
                (void) dseg_add_unique_s4(cd, 0);                  /* IsSync          */
                                               
-       (void) dseg_add_unique_s4(cd, jd->isleafmethod);               /* IsLeaf  */
+       if (code_is_leafmethod(code))
+               (void) dseg_add_unique_s4(cd, 1);                  /* IsLeaf          */
+       else
+               (void) dseg_add_unique_s4(cd, 0);                  /* IsLeaf          */
+
        (void) dseg_add_unique_s4(cd, INT_SAV_CNT - rd->savintreguse); /* IntSave */
        (void) dseg_add_unique_s4(cd, FLT_SAV_CNT - rd->savfltreguse); /* FltSave */
 
index fc920ffac57c36eed7442dd4d4d62ca7baf98b15..6ce0eb3a3a4bc87c77bee2977932abece1314850 100644 (file)
@@ -481,6 +481,7 @@ uint32_t emit_trap(codegendata *cd)
 void emit_verbosecall_enter(jitdata *jd)
 {
        methodinfo   *m;
+       codeinfo     *code;
        codegendata  *cd;
        registerdata *rd;
        methoddesc   *md;
@@ -489,9 +490,10 @@ void emit_verbosecall_enter(jitdata *jd)
 
        /* 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;
 
        md = m->parseddesc;
 
@@ -528,7 +530,7 @@ void emit_verbosecall_enter(jitdata *jd)
 
        /* save all argument and temporary registers for leaf methods */
 
-       if (jd->isleafmethod) {
+       if (code_is_leafmethod(code)) {
                for (i = 0; i < INT_ARG_CNT; i++)
                        M_LST(abi_registers_integer_argument[i], REG_SP, (md->paramcount + i) * 8);
 
@@ -572,7 +574,7 @@ void emit_verbosecall_enter(jitdata *jd)
 
        /* restore all argument and temporary registers for leaf methods */
 
-       if (jd->isleafmethod) {
+       if (code_is_leafmethod(code)) {
                for (i = 0; i < INT_ARG_CNT; i++)
                        M_LLD(abi_registers_integer_argument[i], REG_SP, (md->paramcount + i) * 8);
 
index 34bc9e4f7bd063d93c20a5a13876b480dba8c564..f5c3ab0d12174d21c402025014006e352ad996af 100644 (file)
@@ -229,13 +229,15 @@ void md_param_alloc_native(methoddesc *md)
 void md_return_alloc(jitdata *jd, stackptr stackslot)
 {
        methodinfo   *m;
+       codeinfo     *code;
        registerdata *rd;
        methoddesc   *md;
 
        /* get required compiler data */
 
-       m  = jd->m;
-       rd = jd->rd;
+       m    = jd->m;
+       code = jd->code;
+       rd   = jd->rd;
 
        md = m->parseddesc;
 
@@ -249,7 +251,7 @@ void md_return_alloc(jitdata *jd, stackptr stackslot)
                   to their argument register -> so leafmethods with
                   paramcount > 0 could already use a00! */
 
-               if (!jd->isleafmethod || (md->paramcount == 0)) {
+               if (!code_is_leafmethod(code) || (md->paramcount == 0)) {
                        /* Only precolor the stackslot, if it is not a SAVEDVAR
                           <-> has not to survive method invokations */