*******************************************************************************/
+#define CLEAR_javalocals(array, method) \
+ do { \
+ for (i=0; i<(method)->maxlocals; ++i) \
+ (array)[i] = UNUSED; \
+ } while (0)
+
+#define COUNT_javalocals(array, method, counter) \
+ do { \
+ for (i=0; i<(method)->maxlocals; ++i) \
+ if ((array)[i] != UNUSED) \
+ (counter)++; \
+ } while (0)
+
bool replace_create_replacement_points(jitdata *jd)
{
codeinfo *code;
if (bptr->javalocals)
MCOPY(javalocals, bptr->javalocals, s4, m->maxlocals);
else
- for (i=0; i<m->maxlocals; ++i)
- javalocals[i] = UNUSED;
+ CLEAR_javalocals(javalocals, m);
/* iterate over the instructions */
case ICMD_INVOKEINTERFACE:
INSTRUCTION_GET_METHODDESC(iptr, md);
count++;
- for (i=0; i<m->maxlocals; ++i)
- if (javalocals[i] != UNUSED)
- alloccount++;
+ COUNT_javalocals(javalocals, m, alloccount);
alloccount += iptr->s1.argcount;
if (iinfo)
alloccount -= iinfo->throughcount;
case ICMD_FSTORE:
case ICMD_DSTORE:
case ICMD_ASTORE:
- /* XXX share code with stack.c */
- j = iptr->dst.varindex;
- i = iptr->sx.s23.s3.javaindex;
- if (i != UNUSED) {
- if (iptr->flags.bits & INS_FLAG_RETADDR)
- javalocals[i] = iptr->sx.s23.s2.retaddrnr;
- else
- javalocals[i] = j;
- if (iptr->flags.bits & INS_FLAG_KILL_PREV)
- javalocals[i-1] = UNUSED;
- if (iptr->flags.bits & INS_FLAG_KILL_NEXT)
- javalocals[i+1] = UNUSED;
- }
+ stack_javalocals_store(iptr, javalocals);
break;
case ICMD_IRETURN:
iinfo = iptr->sx.s23.s3.inlineinfo;
count++;
- for (i=0; i<m->maxlocals; ++i)
- if (javalocals[i] != UNUSED)
- alloccount++;
+ COUNT_javalocals(javalocals, m, alloccount);
alloccount += iinfo->stackvarscount;
if (iinfo->synclocal != UNUSED)
alloccount++;
#if !defined(NDEBUG)
else
/* javalocals will be set at next block start */
- for (i=0; i<m->maxlocals; ++i)
- javalocals[i] = UNUSED;
+ CLEAR_javalocals(javalocals, m);
#endif
break;
jl = bptr->next->javalocals;
}
count++;
- for (i=0; i<m->maxlocals; ++i)
- if (jl[i] != UNUSED)
- alloccount++;
+ COUNT_javalocals(jl, m, alloccount);
break;
case ICMD_INLINE_END:
if (bptr->inlineinfo)
alloccount -= bptr->inlineinfo->throughcount;
- for (i=0; i<bptr->method->maxlocals; ++i)
- if (bptr->javalocals[i] != UNUSED)
- alloccount++;
+ COUNT_javalocals(bptr->javalocals, bptr->method, alloccount);
}
}
if (bptr->javalocals)
MCOPY(javalocals, bptr->javalocals, s4, m->maxlocals);
else
- for (i=0; i<m->maxlocals; ++i)
- javalocals[i] = UNUSED;
+ CLEAR_javalocals(javalocals, m);
/* create replacement points at targets of backward branches */
case ICMD_FSTORE:
case ICMD_DSTORE:
case ICMD_ASTORE:
- /* XXX share code with stack.c */
- j = iptr->dst.varindex;
- i = iptr->sx.s23.s3.javaindex;
- if (i != UNUSED) {
- if (iptr->flags.bits & INS_FLAG_RETADDR)
- javalocals[i] = iptr->sx.s23.s2.retaddrnr;
- else
- javalocals[i] = j;
- if (iptr->flags.bits & INS_FLAG_KILL_PREV)
- javalocals[i-1] = UNUSED;
- if (iptr->flags.bits & INS_FLAG_KILL_NEXT)
- javalocals[i+1] = UNUSED;
- }
+ stack_javalocals_store(iptr, javalocals);
break;
case ICMD_IRETURN:
#if !defined(NDEBUG)
else
/* javalocals will be set at next block start */
- for (i=0; i<m->maxlocals; ++i)
- javalocals[i] = UNUSED;
+ CLEAR_javalocals(javalocals, m);
#endif
break;
Christian Thalinger
Christian Ullrich
- $Id: stack.c 6055 2006-11-27 14:39:58Z edwin $
+ $Id: stack.c 6062 2006-11-27 15:15:54Z edwin $
*/
}
+/* stack_javalocals_store ******************************************************
+
+ Model the effect of a ?STORE instruction upon the given javalocals array.
+
+ IN:
+ iptr.............the ?STORE instruction
+ javalocals.......the javalocals array to modify
+
+*******************************************************************************/
+
+void stack_javalocals_store(instruction *iptr, s4 *javalocals)
+{
+ s4 idx; /* index into the jd->var array */
+ s4 j; /* java local index */
+
+ idx = iptr->dst.varindex;
+ j = iptr->sx.s23.s3.javaindex;
+
+ if (j != UNUSED) {
+ if (iptr->flags.bits & INS_FLAG_RETADDR)
+ javalocals[j] = iptr->sx.s23.s2.retaddrnr;
+ else
+ javalocals[j] = idx;
+
+ if (iptr->flags.bits & INS_FLAG_KILL_PREV)
+ javalocals[j-1] = UNUSED;
+
+ if (iptr->flags.bits & INS_FLAG_KILL_NEXT)
+ javalocals[j+1] = UNUSED;
+ }
+}
+
+
/* functions for verbose stack analysis output ********************************/
#if defined(STACK_VERBOSE)