X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=src%2Fvm%2Fjit%2Fstack.c;h=d6cd89aaa4cfc69a7f250562f02c421d99e5eb91;hb=bccee68a74e6205d3ed40502953693b49b7ec3aa;hp=83dfd0640c6acf4a65cf5a5846025cefa1bb87fe;hpb=71397a3202d7021c52efa7f00f6b86fa5090ae70;p=cacao.git diff --git a/src/vm/jit/stack.c b/src/vm/jit/stack.c index 83dfd0640..d6cd89aaa 100644 --- a/src/vm/jit/stack.c +++ b/src/vm/jit/stack.c @@ -28,23 +28,25 @@ Changes: Edwin Steiner - $Id: stack.c 951 2004-03-11 17:30:03Z jowenn $ + $Id: stack.c 1318 2004-07-16 13:30:51Z twisti $ */ #include #include -#include "stack.h" #include "global.h" -#include "main.h" -#include "jit.h" +#include "native.h" #include "builtin.h" #include "disass.h" -#include "reg.h" #include "tables.h" #include "types.h" -#include "toolbox/loging.h" +#include "options.h" +#include "statistics.h" +#include "jit/jit.h" +#include "jit/stack.h" +#include "jit/reg.h" +#include "toolbox/logging.h" #include "toolbox/memory.h" @@ -69,35 +71,63 @@ extern int dseglen; /* SIGNALING ERRORS */ /*--------------------------------------------------*/ -#define TYPEPANIC {show_icmd_method();panic("Stack type mismatch");} -#define UNDERFLOW {show_icmd_method();panic("Operand stack underflow");} -#define OVERFLOW {show_icmd_method();panic("Operand stack overflow");} +#define TYPEPANIC {panic("Stack type mismatch");} + /*--------------------------------------------------*/ /* STACK UNDERFLOW/OVERFLOW CHECKS */ /*--------------------------------------------------*/ /* underflow checks */ -#define REQUIRE(num) do { if (stackdepth<(num)) {UNDERFLOW;} } while(0) + +#define REQUIRE(num) \ + do { \ + if (stackdepth < (num)) { \ + sprintf(msg, "(class: "); \ + utf_sprint(msg + strlen(msg), m->class->name); \ + sprintf(msg + strlen(msg), ", method: "); \ + utf_sprint(msg + strlen(msg), m->name); \ + sprintf(msg + strlen(msg), ", signature: "); \ + utf_sprint(msg + strlen(msg), m->descriptor); \ + sprintf(msg + strlen(msg), ") Unable to pop operand off an empty stack"); \ + *exceptionptr = \ + new_exception_message(string_java_lang_VerifyError, msg); \ + return NULL; \ + } \ + } while(0) + #define REQUIRE_1 REQUIRE(1) #define REQUIRE_2 REQUIRE(2) #define REQUIRE_3 REQUIRE(3) #define REQUIRE_4 REQUIRE(4) + /* overflow check */ /* We allow ACONST instructions inserted as arguments to builtin * functions to exceed the maximum stack depth. Maybe we should check * against maximum stack depth only at block boundaries? */ -#define CHECKOVERFLOW \ - do { \ - if (stackdepth > maxstack) { \ - if (iptr[0].opc != ICMD_ACONST \ - || iptr[0].op1 == 0) \ - {OVERFLOW;} \ - } \ + +#define CHECKOVERFLOW \ + do { \ + if (stackdepth > m->maxstack) { \ + if (iptr[0].opc != ICMD_ACONST \ + || iptr[0].op1 == 0) { \ + sprintf(msg, "(class: "); \ + utf_sprint_classname(msg + strlen(msg), m->class->name); \ + sprintf(msg + strlen(msg), ", method: "); \ + utf_sprint(msg + strlen(msg), m->name); \ + sprintf(msg + strlen(msg), ", signature: "); \ + utf_sprint(msg + strlen(msg), m->descriptor); \ + sprintf(msg + strlen(msg), ") Stack size too large"); \ + *exceptionptr = \ + new_exception_message(string_java_lang_VerifyError, msg); \ + return NULL; \ + } \ + } \ } while(0) + /*--------------------------------------------------*/ /* ALLOCATING STACK SLOTS */ /*--------------------------------------------------*/ @@ -110,6 +140,7 @@ extern int dseglen; /* allocate the input stack for an exception handler */ #define NEWXSTACK {NEWSTACK(TYPE_ADR,STACKVAR,0);curstack=0;} + /*--------------------------------------------------*/ /* STACK MANIPULATION */ /*--------------------------------------------------*/ @@ -129,6 +160,7 @@ extern int dseglen; #define COPY(s,d) {(d)->flags=0;(d)->type=(s)->type;\ (d)->varkind=(s)->varkind;(d)->varnum=(s)->varnum;} + /*--------------------------------------------------*/ /* STACK OPERATIONS MODELING */ /*--------------------------------------------------*/ @@ -190,6 +222,7 @@ extern int dseglen; new[4].prev=new+3;new[5].prev=new+4;\ curstack=new+5;new+=6;SETDST;stackdepth+=2;} + /*--------------------------------------------------*/ /* MACROS FOR HANDLING BASIC BLOCKS */ /*--------------------------------------------------*/ @@ -229,30 +262,30 @@ extern int dseglen; * instruction of the block has been processed). */ -#define BBEND(s,i){\ - i=stackdepth-1;\ - copy=s;\ - while(copy){\ - if((copy->varkind==STACKVAR)&&(copy->varnum>i))\ - copy->varkind=TEMPVAR;\ - else {\ - copy->varkind=STACKVAR;\ - copy->varnum=i;\ - }\ - interfaces[i][copy->type].type = copy->type;\ - interfaces[i][copy->type].flags |= copy->flags;\ - i--;copy=copy->prev;\ - }\ - i=bptr->indepth-1;\ - copy=bptr->instack;\ - while(copy){\ - interfaces[i][copy->type].type = copy->type;\ - if(copy->varkind==STACKVAR){\ - if (copy->flags & SAVEDVAR)\ - interfaces[i][copy->type].flags |= SAVEDVAR;\ - }\ - i--;copy=copy->prev;\ - }\ +#define BBEND(s,i){ \ + i = stackdepth - 1; \ + copy = s; \ + while (copy) { \ + if ((copy->varkind == STACKVAR) && (copy->varnum > i)) \ + copy->varkind = TEMPVAR; \ + else { \ + copy->varkind = STACKVAR; \ + copy->varnum = i;\ + } \ + m->registerdata->interfaces[i][copy->type].type = copy->type; \ + m->registerdata->interfaces[i][copy->type].flags |= copy->flags; \ + i--; copy = copy->prev; \ + } \ + i = bptr->indepth - 1; \ + copy = bptr->instack; \ + while (copy) { \ + m->registerdata->interfaces[i][copy->type].type = copy->type; \ + if (copy->varkind == STACKVAR) { \ + if (copy->flags & SAVEDVAR) \ + m->registerdata->interfaces[i][copy->type].flags |= SAVEDVAR; \ + } \ + i--; copy = copy->prev; \ + } \ } @@ -269,7 +302,7 @@ extern int dseglen; {COPYCURSTACK(c);b->flags=0;b->instack=c;b->indepth=stackdepth;} \ else {stackptr s=curstack;stackptr t=b->instack; \ if(b->indepth!=stackdepth) \ - {show_icmd_method();panic("Stack depth mismatch");} \ + {show_icmd_method(m);panic("Stack depth mismatch");} \ while(s){if (s->type!=t->type) \ TYPEPANIC \ s=s->prev;t=t->prev; \ @@ -303,7 +336,7 @@ extern int dseglen; * types are not discerned. */ -void analyse_stack() +methodinfo *analyse_stack(methodinfo *m) { int b_count; int b_index; @@ -319,31 +352,22 @@ void analyse_stack() s4 *s4ptr; void* *tptr; int *argren; + char msg[MAXLOGTEXT]; /* maybe we get an exception */ - if (compileverbose) { - char logtext[MAXLOGTEXT]; - sprintf(logtext, "Analysing: "); - utf_sprint(logtext+strlen(logtext), method->class->name); - strcpy(logtext+strlen(logtext), "."); - utf_sprint(logtext+strlen(logtext), method->name); - utf_sprint(logtext+strlen(logtext), method->descriptor); - log_text(logtext); - } - - argren = DMNEW(int, maxlocals); - /*int *argren = (int *)alloca(maxlocals * sizeof(int));*/ /* table for argument renaming */ - for (i = 0; i < maxlocals; i++) + argren = DMNEW(int, m->maxlocals); + /*int *argren = (int *)alloca(m->maxlocals * sizeof(int));*/ /* table for argument renaming */ + for (i = 0; i < m->maxlocals; i++) argren[i] = i; - arguments_num = 0; - new = stack; + m->registerdata->arguments_num = 0; + new = m->stack; loops = 0; - block[0].flags = BBREACHED; - block[0].instack = 0; - block[0].indepth = 0; + m->basicblocks[0].flags = BBREACHED; + m->basicblocks[0].instack = 0; + m->basicblocks[0].indepth = 0; - for (i = 0; i < exceptiontablelength; i++) { - bptr = &block[block_index[extable[i].handlerpc]]; + for (i = 0; i < m->exceptiontablelength; i++) { + bptr = &m->basicblocks[m->basicblockindex[m->exceptiontable[i].handlerpc]]; bptr->flags = BBREACHED; bptr->type = BBTYPE_EXH; bptr->instack = new; @@ -354,8 +378,8 @@ void analyse_stack() } #ifdef CONDITIONAL_LOADCONST - b_count = block_count; - bptr = block; + b_count = m->basicblockcount; + bptr = m->basicblocks; while (--b_count >= 0) { if (bptr->icount != 0) { iptr = bptr->iinstr + bptr->icount - 1; @@ -391,25 +415,25 @@ void analyse_stack() case ICMD_IF_ACMPNE: bptr[1].pre_count++; case ICMD_GOTO: - block[block_index[iptr->op1]].pre_count++; + m->basicblocks[m->basicblockindex[iptr->op1]].pre_count++; break; case ICMD_TABLESWITCH: s4ptr = iptr->val.a; - block[block_index[*s4ptr++]].pre_count++; /* default */ + m->basicblocks[m->basicblockindex[*s4ptr++]].pre_count++; i = *s4ptr++; /* low */ i = *s4ptr++ - i + 1; /* high */ while (--i >= 0) { - block[block_index[*s4ptr++]].pre_count++; + m->basicblocks[m->basicblockindex[*s4ptr++]].pre_count++; } break; case ICMD_LOOKUPSWITCH: s4ptr = iptr->val.a; - block[block_index[*s4ptr++]].pre_count++; /* default */ + m->basicblocks[m->basicblockindex[*s4ptr++]].pre_count++; i = *s4ptr++; /* count */ while (--i >= 0) { - block[block_index[s4ptr[1]]].pre_count++; + m->basicblocks[m->basicblockindex[s4ptr[1]]].pre_count++; s4ptr += 2; } break; @@ -425,8 +449,8 @@ void analyse_stack() do { loops++; - b_count = block_count; - bptr = block; + b_count = m->basicblockcount; + bptr = m->basicblocks; superblockend = true; repeat = false; STACKRESET; @@ -446,7 +470,7 @@ void analyse_stack() bptr->indepth = stackdepth; } else if (bptr->indepth != stackdepth) { - show_icmd_method(); + show_icmd_method(m); panic("Stack depth mismatch"); } @@ -456,12 +480,12 @@ void analyse_stack() bptr->flags = BBFINISHED; len = bptr->icount; iptr = bptr->iinstr; - b_index = bptr - block; + b_index = bptr - m->basicblocks; while (--len >= 0) { opcode = iptr->opc; iptr->target = NULL; - /* DEBUG */ /* dolog("p:%04d op: %s",iptr-instr,icmd_names[opcode]); */ +/* dolog("p: %04d op: %s stack: %p", iptr - instr, icmd_names[opcode], curstack); */ #ifdef USEBUILTINTABLE { @@ -473,7 +497,7 @@ void analyse_stack() iptr[0].opc = breplace->icmd; iptr[0].op1 = breplace->type_d; iptr[0].val.a = breplace->builtin; - isleafmethod = false; + m->isleafmethod = false; switch (breplace->icmd) { case ICMD_BUILTIN1: goto builtin1; @@ -489,7 +513,7 @@ void analyse_stack() iptr[0].opc = breplace->icmd; iptr[0].op1 = breplace->type_d; iptr[0].val.a = breplace->builtin; - isleafmethod = false; + m->isleafmethod = false; switch (breplace->icmd) { case ICMD_BUILTIN1: goto builtin1; @@ -506,6 +530,7 @@ void analyse_stack() case ICMD_NOP: case ICMD_CHECKASIZE: + case ICMD_CHECKEXCEPTION: case ICMD_IFEQ_ICONST: case ICMD_IFNE_ICONST: @@ -518,7 +543,7 @@ void analyse_stack() break; case ICMD_RET: - locals[iptr->op1][TYPE_ADR].type = TYPE_ADR; + m->registerdata->locals[iptr->op1][TYPE_ADR].type = TYPE_ADR; case ICMD_RETURN: COUNT(count_pcmd_return); SETDST; @@ -614,12 +639,6 @@ void analyse_stack() iptr[0].opc = ICMD_IDIVPOW2; goto icmd_iconst_tail; case ICMD_IREM: -#if !defined(NO_DIV_OPT) - if (iptr[0].val.i == 0x10001) { - iptr[0].opc = ICMD_IREM0X10001; - goto icmd_iconst_tail; - } -#endif if ((iptr[0].val.i == 0x00000002) || (iptr[0].val.i == 0x00000004) || (iptr[0].val.i == 0x00000008) || @@ -653,6 +672,9 @@ void analyse_stack() (iptr[0].val.i == 0x80000000)) { iptr[0].opc = ICMD_IREMPOW2; iptr[0].val.i -= 1; +#if defined(__I386__) + method_uses_ecx = true; +#endif goto icmd_iconst_tail; } PUSHCONST(TYPE_INT); @@ -678,12 +700,21 @@ void analyse_stack() #if SUPPORT_LONG_SHIFT case ICMD_LSHL: iptr[0].opc = ICMD_LSHLCONST; +#if defined(__I386__) + method_uses_ecx = true; +#endif goto icmd_lconst_tail; case ICMD_LSHR: iptr[0].opc = ICMD_LSHRCONST; +#if defined(__I386__) + method_uses_ecx = true; +#endif goto icmd_lconst_tail; case ICMD_LUSHR: iptr[0].opc = ICMD_LUSHRCONST; +#if defined(__I386__) + method_uses_ecx = true; +#endif goto icmd_lconst_tail; #endif case ICMD_IF_ICMPEQ: @@ -694,7 +725,7 @@ void analyse_stack() len--; /* iptr[1].opc = ICMD_NOP; */ OP1_0(TYPE_INT); - tbptr = block + block_index[iptr->op1]; + tbptr = m->basicblocks + m->basicblockindex[iptr->op1]; iptr[0].target = (void *) tbptr; @@ -716,6 +747,40 @@ void analyse_stack() case ICMD_IF_ICMPGE: iptr[0].opc = ICMD_IFGE; goto icmd_if_icmp_tail; + +#if SUPPORT_CONST_ASTORE + case ICMD_IASTORE: + case ICMD_BASTORE: + case ICMD_CASTORE: + case ICMD_SASTORE: +#if SUPPORT_ONLY_ZERO_ASTORE + if (iptr[0].val.i == 0) { +#endif /* SUPPORT_ONLY_ZERO_ASTORE */ + switch (iptr[1].opc) { + case ICMD_IASTORE: + iptr[0].opc = ICMD_IASTORECONST; + break; + case ICMD_BASTORE: + iptr[0].opc = ICMD_BASTORECONST; + break; + case ICMD_CASTORE: + iptr[0].opc = ICMD_CASTORECONST; + break; + case ICMD_SASTORE: + iptr[0].opc = ICMD_SASTORECONST; + break; + } + + iptr[1].opc = ICMD_NOP; + OPTT2_0(TYPE_INT, TYPE_ADR); + COUNT(count_pcmd_op); +#if SUPPORT_ONLY_ZERO_ASTORE + } else + PUSHCONST(TYPE_INT); +#endif /* SUPPORT_ONLY_ZERO_ASTORE */ + break; +#endif /* SUPPORT_CONST_ASTORE */ + default: PUSHCONST(TYPE_INT); } @@ -723,6 +788,7 @@ void analyse_stack() else PUSHCONST(TYPE_INT); break; + case ICMD_LCONST: COUNT(count_pcmd_load); if (len > 0) { @@ -743,6 +809,7 @@ void analyse_stack() case ICMD_LMUL: iptr[0].opc = ICMD_LMULCONST; #if defined(__I386__) + method_uses_ecx = true; method_uses_edx = true; #endif goto icmd_lconst_tail; @@ -816,14 +883,11 @@ void analyse_stack() break; } iptr[0].opc = ICMD_LDIVPOW2; +#if defined(__I386__) + method_uses_ecx = true; +#endif goto icmd_lconst_tail; case ICMD_LREM: -#if !defined(NO_DIV_OPT) - if (iptr[0].val.l == 0x10001) { - iptr[0].opc = ICMD_LREM0X10001; - goto icmd_lconst_tail; - } -#endif if ((iptr[0].val.l == 0x00000002) || (iptr[0].val.l == 0x00000004) || (iptr[0].val.l == 0x00000008) || @@ -857,6 +921,9 @@ void analyse_stack() (iptr[0].val.l == 0x80000000)) { iptr[0].opc = ICMD_LREMPOW2; iptr[0].val.l -= 1; +#if defined(__I386__) + method_uses_ecx = true; +#endif goto icmd_lconst_tail; } PUSHCONST(TYPE_LNG); @@ -879,6 +946,9 @@ void analyse_stack() switch (iptr[2].opc) { case ICMD_IFEQ: iptr[0].opc = ICMD_IF_LEQ; +#if defined(__I386__) + method_uses_ecx = true; +#endif icmd_lconst_lcmp_tail: iptr[0].op1 = iptr[2].op1; bptr->icount -= 2; @@ -886,7 +956,7 @@ void analyse_stack() /* iptr[1].opc = ICMD_NOP; iptr[2].opc = ICMD_NOP; */ OP1_0(TYPE_LNG); - tbptr = block + block_index[iptr->op1]; + tbptr = m->basicblocks + m->basicblockindex[iptr->op1]; iptr[0].target = (void *) tbptr; @@ -896,6 +966,9 @@ void analyse_stack() break; case ICMD_IFNE: iptr[0].opc = ICMD_IF_LNE; +#if defined(__I386__) + method_uses_ecx = true; +#endif goto icmd_lconst_lcmp_tail; case ICMD_IFLT: iptr[0].opc = ICMD_IF_LLT; @@ -917,6 +990,23 @@ void analyse_stack() PUSHCONST(TYPE_LNG); break; #endif + +#if SUPPORT_CONST_ASTORE + case ICMD_LASTORE: +#if SUPPORT_ONLY_ZERO_ASTORE + if (iptr[0].val.l == 0) { +#endif /* SUPPORT_ONLY_ZERO_ASTORE */ + iptr[0].opc = ICMD_LASTORECONST; + iptr[1].opc = ICMD_NOP; + OPTT2_0(TYPE_INT, TYPE_ADR); + COUNT(count_pcmd_op); +#if SUPPORT_ONLY_ZERO_ASTORE + } else + PUSHCONST(TYPE_LNG); +#endif /* SUPPORT_ONLY_ZERO_ASTORE */ + break; +#endif /* SUPPORT_CONST_ASTORE */ + default: PUSHCONST(TYPE_LNG); } @@ -924,17 +1014,35 @@ void analyse_stack() else PUSHCONST(TYPE_LNG); break; + case ICMD_FCONST: COUNT(count_pcmd_load); PUSHCONST(TYPE_FLT); break; + case ICMD_DCONST: COUNT(count_pcmd_load); PUSHCONST(TYPE_DBL); break; + case ICMD_ACONST: COUNT(count_pcmd_load); - PUSHCONST(TYPE_ADR); +#if SUPPORT_CONST_ASTORE + if (len > 0 && iptr->val.a == 0) { + if (iptr[1].opc == ICMD_BUILTIN3 && + iptr[1].val.a == BUILTIN_aastore) { + iptr[0].opc = ICMD_AASTORECONST; + iptr[1].opc = ICMD_NOP; + OPTT2_0(TYPE_INT, TYPE_ADR); + COUNT(count_pcmd_op); + + } else { + PUSHCONST(TYPE_ADR); + } + + } else +#endif /* SUPPORT_CONST_ASTORE */ + PUSHCONST(TYPE_ADR); break; /* pop 0 push 1 load */ @@ -947,7 +1055,7 @@ void analyse_stack() COUNT(count_load_instruction); i = opcode-ICMD_ILOAD; iptr->op1 = argren[iptr->op1]; - locals[iptr->op1][i].type = i; + m->registerdata->locals[iptr->op1][i].type = i; LOAD(i, LOCALVAR, iptr->op1); break; @@ -955,6 +1063,7 @@ void analyse_stack() case ICMD_LALOAD: #if defined(__I386__) + method_uses_ecx = true; method_uses_edx = true; #endif case ICMD_IALOAD: @@ -965,6 +1074,9 @@ void analyse_stack() COUNT(count_check_bound); COUNT(count_pcmd_mem); OP2IAT_1(opcode-ICMD_IALOAD); +#if defined(__I386__) + method_uses_ecx = true; +#endif break; case ICMD_BALOAD: @@ -974,6 +1086,9 @@ void analyse_stack() COUNT(count_check_bound); COUNT(count_pcmd_mem); OP2IAT_1(TYPE_INT); +#if defined(__I386__) + method_uses_ecx = true; +#endif break; /* pop 0 push 0 iinc */ @@ -1011,7 +1126,7 @@ void analyse_stack() REQUIRE_1; i = opcode - ICMD_ISTORE; - locals[iptr->op1][i].type = i; + m->registerdata->locals[iptr->op1][i].type = i; #ifdef STATISTICS count_pcmd_store++; i = new - curstack; @@ -1049,6 +1164,7 @@ void analyse_stack() case ICMD_AASTORE: case ICMD_LASTORE: #if defined(__I386__) + method_uses_ecx = true; method_uses_edx = true; #endif case ICMD_FASTORE: @@ -1067,6 +1183,7 @@ void analyse_stack() COUNT(count_pcmd_mem); OP3TIA_0(TYPE_INT); #if defined(__I386__) + method_uses_ecx = true; method_uses_edx = true; #endif break; @@ -1105,6 +1222,9 @@ void analyse_stack() case ICMD_PUTSTATIC: COUNT(count_pcmd_mem); OP1_0(iptr->op1); +#if defined(__I386__) + method_uses_ecx = true; +#endif break; /* pop 1 push 0 branch */ @@ -1113,7 +1233,7 @@ void analyse_stack() case ICMD_IFNONNULL: COUNT(count_pcmd_bra); OP1_0(TYPE_ADR); - tbptr = block + block_index[iptr->op1]; + tbptr = m->basicblocks + m->basicblockindex[iptr->op1]; iptr[0].target = (void *) tbptr; @@ -1129,13 +1249,13 @@ void analyse_stack() COUNT(count_pcmd_bra); #ifdef CONDITIONAL_LOADCONST { - tbptr = block + b_index; + tbptr = m->basicblocks + b_index; if ((b_count >= 3) && - ((b_index + 2) == block_index[iptr[0].op1]) && + ((b_index + 2) == m->basicblockindex[iptr[0].op1]) && (tbptr[1].pre_count == 1) && (iptr[1].opc == ICMD_ICONST) && (iptr[2].opc == ICMD_GOTO) && - ((b_index + 3) == block_index[iptr[2].op1]) && + ((b_index + 3) == m->basicblockindex[iptr[2].op1]) && (tbptr[2].pre_count == 1) && (iptr[3].opc == ICMD_ICONST)) { OP1_1(TYPE_INT, TYPE_INT); @@ -1185,7 +1305,7 @@ void analyse_stack() } #endif OP1_0(TYPE_INT); - tbptr = block + block_index[iptr->op1]; + tbptr = m->basicblocks + m->basicblockindex[iptr->op1]; iptr[0].target = (void *) tbptr; @@ -1196,7 +1316,7 @@ void analyse_stack() case ICMD_GOTO: COUNT(count_pcmd_bra); - tbptr = block + block_index[iptr->op1]; + tbptr = m->basicblocks + m->basicblockindex[iptr->op1]; iptr[0].target = (void *) tbptr; @@ -1211,7 +1331,7 @@ void analyse_stack() COUNT(count_pcmd_table); OP1_0(TYPE_INT); s4ptr = iptr->val.a; - tbptr = block + block_index[*s4ptr++]; /* default */ + tbptr = m->basicblocks + m->basicblockindex[*s4ptr++]; MARKREACHED(tbptr, copy); i = *s4ptr++; /* low */ i = *s4ptr++ - i + 1; /* high */ @@ -1223,7 +1343,7 @@ void analyse_stack() tptr++; while (--i >= 0) { - tbptr = block + block_index[*s4ptr++]; + tbptr = m->basicblocks + m->basicblockindex[*s4ptr++]; tptr[0] = (void *) tbptr; tptr++; @@ -1232,6 +1352,9 @@ void analyse_stack() } SETDST; superblockend = true; +#if defined(__I386__) + method_uses_ecx = true; +#endif break; /* pop 1 push 0 table branch */ @@ -1240,7 +1363,7 @@ void analyse_stack() COUNT(count_pcmd_table); OP1_0(TYPE_INT); s4ptr = iptr->val.a; - tbptr = block + block_index[*s4ptr++]; /* default */ + tbptr = m->basicblocks + m->basicblockindex[*s4ptr++]; MARKREACHED(tbptr, copy); i = *s4ptr++; /* count */ @@ -1251,7 +1374,7 @@ void analyse_stack() tptr++; while (--i >= 0) { - tbptr = block + block_index[s4ptr[1]]; + tbptr = m->basicblocks + m->basicblockindex[s4ptr[1]]; tptr[0] = (void *) tbptr; tptr++; @@ -1280,7 +1403,7 @@ void analyse_stack() case ICMD_IF_ICMPLE: COUNT(count_pcmd_bra); OP2_0(TYPE_INT); - tbptr = block + block_index[iptr->op1]; + tbptr = m->basicblocks + m->basicblockindex[iptr->op1]; iptr[0].target = (void *) tbptr; @@ -1291,7 +1414,7 @@ void analyse_stack() case ICMD_IF_ACMPNE: COUNT(count_pcmd_bra); OP2_0(TYPE_ADR); - tbptr = block + block_index[iptr->op1]; + tbptr = m->basicblocks + m->basicblockindex[iptr->op1]; iptr[0].target = (void *) tbptr; @@ -1304,6 +1427,9 @@ void analyse_stack() COUNT(count_check_null); COUNT(count_pcmd_mem); OPTT2_0(iptr->op1,TYPE_ADR); +#if defined(__I386__) + method_uses_ecx = true; +#endif break; case ICMD_POP2: @@ -1506,7 +1632,7 @@ void analyse_stack() iptr[0].opc = ICMD_BUILTIN2; iptr[0].op1 = TYPE_INT; iptr[0].val.a = BUILTIN_idiv; - isleafmethod = false; + m->isleafmethod = false; goto builtin2; #endif @@ -1515,10 +1641,11 @@ void analyse_stack() iptr[0].opc = ICMD_BUILTIN2; iptr[0].op1 = TYPE_INT; iptr[0].val.a = BUILTIN_irem; - isleafmethod = false; + m->isleafmethod = false; goto builtin2; #endif #if defined(__I386__) + method_uses_ecx = true; method_uses_edx = true; #endif @@ -1543,7 +1670,7 @@ void analyse_stack() iptr[0].opc = ICMD_BUILTIN2; iptr[0].op1 = TYPE_LNG; iptr[0].val.a = BUILTIN_ldiv; - isleafmethod = false; + m->isleafmethod = false; goto builtin2; #endif @@ -1552,12 +1679,13 @@ void analyse_stack() iptr[0].opc = ICMD_BUILTIN2; iptr[0].op1 = TYPE_LNG; iptr[0].val.a = BUILTIN_lrem; - isleafmethod = false; + m->isleafmethod = false; goto builtin2; #endif case ICMD_LMUL: #if defined(__I386__) + method_uses_ecx = true; method_uses_edx = true; #endif case ICMD_LADD: @@ -1606,13 +1734,16 @@ void analyse_stack() switch (iptr[1].opc) { case ICMD_IFEQ: iptr[0].opc = ICMD_IF_LCMPEQ; +#if defined(__I386__) + method_uses_ecx = true; +#endif icmd_lcmp_if_tail: iptr[0].op1 = iptr[1].op1; len--; bptr->icount--; /* iptr[1].opc = ICMD_NOP; */ OP2_0(TYPE_LNG); - tbptr = block + block_index[iptr->op1]; + tbptr = m->basicblocks + m->basicblockindex[iptr->op1]; iptr[0].target = (void *) tbptr; @@ -1621,6 +1752,9 @@ void analyse_stack() break; case ICMD_IFNE: iptr[0].opc = ICMD_IF_LCMPNE; +#if defined(__I386__) + method_uses_ecx = true; +#endif goto icmd_lcmp_if_tail; case ICMD_IFLT: iptr[0].opc = ICMD_IF_LCMPLT; @@ -1736,12 +1870,14 @@ void analyse_stack() case ICMD_CHECKCAST: OP1_1(TYPE_ADR, TYPE_ADR); #if defined(__I386__) + method_uses_ecx = true; method_uses_edx = true; #endif break; case ICMD_INSTANCEOF: #if defined(__I386__) + method_uses_ecx = true; method_uses_edx = true; #endif case ICMD_ARRAYLENGTH: @@ -1757,6 +1893,9 @@ void analyse_stack() COUNT(count_check_null); COUNT(count_pcmd_mem); OP1_1(TYPE_ADR, iptr->op1); +#if defined(__I386__) + method_uses_ecx = true; +#endif break; /* pop 0 push 1 */ @@ -1764,6 +1903,9 @@ void analyse_stack() case ICMD_GETSTATIC: COUNT(count_pcmd_mem); OP0_1(iptr->op1); +#if defined(__I386__) + method_uses_ecx = true; +#endif break; case ICMD_NEW: @@ -1772,7 +1914,7 @@ void analyse_stack() case ICMD_JSR: OP0_1(TYPE_ADR); - tbptr = block + block_index[iptr->op1]; + tbptr = m->basicblocks + m->basicblockindex[iptr->op1]; iptr[0].target = (void *) tbptr; @@ -1798,19 +1940,22 @@ void analyse_stack() case ICMD_INVOKEINTERFACE: case ICMD_INVOKESTATIC: COUNT(count_pcmd_met); +#if defined(__I386__) + method_uses_ecx = true; +#endif { - methodinfo *m = iptr->val.a; - if (m->flags & ACC_STATIC) + methodinfo *lm = iptr->val.a; + if (lm->flags & ACC_STATIC) {COUNT(count_check_null);} i = iptr->op1; - if (i > arguments_num) - arguments_num = i; + if (i > m->registerdata->arguments_num) + m->registerdata->arguments_num = i; REQUIRE(i); #if defined(__X86_64__) { - int iarg = 0; - int farg = 0; - int stackargs = 0; + s4 iarg = 0; + s4 farg = 0; + s4 stackargs = 0; copy = curstack; while (--i >= 0) { @@ -1818,8 +1963,10 @@ void analyse_stack() copy = copy->prev; } - stackargs += (iarg < intreg_argnum) ? 0 : (iarg - intreg_argnum); - stackargs += (farg < fltreg_argnum) ? 0 : (farg - fltreg_argnum); + stackargs += (iarg < m->registerdata->intreg_argnum) ? + 0 : (iarg - m->registerdata->intreg_argnum); + stackargs += (farg < m->registerdata->fltreg_argnum) ? + 0 : (farg - m->registerdata->fltreg_argnum); i = iptr->op1; copy = curstack; @@ -1827,16 +1974,16 @@ void analyse_stack() if (!(copy->flags & SAVEDVAR)) { copy->varkind = ARGVAR; if (IS_FLT_DBL_TYPE(copy->type)) { - if (--farg < fltreg_argnum) { + if (--farg < m->registerdata->fltreg_argnum) { copy->varnum = farg; } else { - copy->varnum = --stackargs + intreg_argnum; + copy->varnum = --stackargs + m->registerdata->intreg_argnum; } } else { - if (--iarg < intreg_argnum) { + if (--iarg < m->registerdata->intreg_argnum) { copy->varnum = iarg; } else { - copy->varnum = --stackargs + intreg_argnum; + copy->varnum = --stackargs + m->registerdata->intreg_argnum; } } } else { @@ -1861,8 +2008,8 @@ void analyse_stack() } i = iptr->op1; POPMANY(i); - if (m->returntype != TYPE_VOID) { - OP0_1(m->returntype); + if (lm->returntype != TYPE_VOID) { + OP0_1(lm->returntype); } break; } @@ -1874,8 +2021,8 @@ void analyse_stack() curstack->varkind = ARGVAR; curstack->varnum = 2; } - if (3 > arguments_num) { - arguments_num = 3; + if (3 > m->registerdata->arguments_num) { + m->registerdata->arguments_num = 3; } OP1_0ANY; @@ -1887,8 +2034,8 @@ void analyse_stack() curstack->varkind = ARGVAR; curstack->varnum = 1; } - if (2 > arguments_num) { - arguments_num = 2; + if (2 > m->registerdata->arguments_num) { + m->registerdata->arguments_num = 2; } OP1_0ANY; @@ -1900,8 +2047,8 @@ void analyse_stack() curstack->varkind = ARGVAR; curstack->varnum = 0; } - if (1 > arguments_num) { - arguments_num = 1; + if (1 > m->registerdata->arguments_num) { + m->registerdata->arguments_num = 1; } OP1_0ANY; copy = curstack; @@ -1916,14 +2063,14 @@ void analyse_stack() case ICMD_MULTIANEWARRAY: i = iptr->op1; REQUIRE(i); - if ((i + intreg_argnum) > arguments_num) - arguments_num = i + intreg_argnum; + if ((i + m->registerdata->intreg_argnum) > m->registerdata->arguments_num) + m->registerdata->arguments_num = i + m->registerdata->intreg_argnum; copy = curstack; while (--i >= 0) { /* check INT type here? Currently typecheck does this. */ if (! (copy->flags & SAVEDVAR)) { copy->varkind = ARGVAR; - copy->varnum = i + intreg_argnum; + copy->varnum = i + m->registerdata->intreg_argnum; } copy = copy->prev; } @@ -1937,7 +2084,7 @@ void analyse_stack() break; case ICMD_CLEAR_ARGREN: - for (i = iptr->op1; iop1; imaxlocals; i++) argren[i] = i; iptr->opc = opcode = ICMD_NOP; SETDST; @@ -1961,7 +2108,7 @@ void analyse_stack() break; default: - printf("ICMD %d at %d\n", iptr->opc, (int)(iptr-instr)); + printf("ICMD %d at %d\n", iptr->opc, (s4) (iptr - m->instructions)); panic("Missing ICMD code during stack analysis"); } /* switch */ @@ -1981,19 +2128,19 @@ void analyse_stack() } while (repeat && !deadcode); #ifdef STATISTICS - if (block_count > count_max_basic_blocks) - count_max_basic_blocks = block_count; - count_basic_blocks += block_count; - if (instr_count > count_max_javainstr) - count_max_javainstr = instr_count; - count_javainstr += instr_count; - if (stack_count > count_upper_bound_new_stack) - count_upper_bound_new_stack = stack_count; - if ((new - stack) > count_max_new_stack) - count_max_new_stack = (new - stack); - - b_count = block_count; - bptr = block; + if (m->basicblockcount > count_max_basic_blocks) + count_max_basic_blocks = m->basicblockcount; + count_basic_blocks += m->basicblockcount; + if (m->instructioncount > count_max_javainstr) + count_max_javainstr = m->instructioncount; + count_javainstr += m->instructioncount; + if (m->stackcount > count_upper_bound_new_stack) + count_upper_bound_new_stack = m->stackcount; + if ((new - m->stack) > count_max_new_stack) + count_max_new_stack = (new - m->stack); + + b_count = m->basicblockcount; + bptr = m->basicblocks; while (--b_count >= 0) { if (bptr->flags > BBREACHED) { if (bptr->indepth >= 10) @@ -2034,25 +2181,29 @@ void analyse_stack() else count_analyse_iterations[4]++; - if (block_count <= 5) + if (m->basicblockcount <= 5) count_method_bb_distribution[0]++; - else if (block_count <= 10) + else if (m->basicblockcount <= 10) count_method_bb_distribution[1]++; - else if (block_count <= 15) + else if (m->basicblockcount <= 15) count_method_bb_distribution[2]++; - else if (block_count <= 20) + else if (m->basicblockcount <= 20) count_method_bb_distribution[3]++; - else if (block_count <= 30) + else if (m->basicblockcount <= 30) count_method_bb_distribution[4]++; - else if (block_count <= 40) + else if (m->basicblockcount <= 40) count_method_bb_distribution[5]++; - else if (block_count <= 50) + else if (m->basicblockcount <= 50) count_method_bb_distribution[6]++; - else if (block_count <= 75) + else if (m->basicblockcount <= 75) count_method_bb_distribution[7]++; else count_method_bb_distribution[8]++; #endif + + /* just return methodinfo* to signal everything was ok */ + + return m; } @@ -2060,33 +2211,33 @@ void analyse_stack() /* DEBUGGING HELPERS */ /**********************************************************************/ -void icmd_print_stack(stackptr s) +void icmd_print_stack(methodinfo *m, stackptr s) { int i, j; stackptr t; - i = maxstack; + i = m->maxstack; t = s; while (t) { i--; t = t->prev; } - j = maxstack - i; + j = m->maxstack - i; while (--i >= 0) printf(" "); while (s) { j--; - /* DEBUG */ /* printf("(%d)",s->flags); fflush(stdout); */ + /* DEBUG */ /*printf("(%d,%d,%d,%d)",s->varkind,s->flags,s->regoff,s->varnum); fflush(stdout);*/ if (s->flags & SAVEDVAR) switch (s->varkind) { case TEMPVAR: if (s->flags & INMEMORY) - printf((regs_ok) ? " M%02d" : " M??", s->regoff); + printf(" M%02d", s->regoff); else if ((s->type == TYPE_FLT) || (s->type == TYPE_DBL)) - printf((regs_ok) ? " F%02d" : " F??", s->regoff); + printf(" F%02d", s->regoff); else { - if (regs_ok) printf(" %3s",regs[s->regoff]); else printf(" ???"); + printf(" %3s", regs[s->regoff]); } break; case STACKVAR: @@ -2105,11 +2256,11 @@ void icmd_print_stack(stackptr s) switch (s->varkind) { case TEMPVAR: if (s->flags & INMEMORY) - printf((regs_ok) ? " m%02d" : " m??", s->regoff); + printf(" m%02d", s->regoff); else if ((s->type == TYPE_FLT) || (s->type == TYPE_DBL)) - printf((regs_ok) ? " f%02d" : " f??", s->regoff); + printf(" f%02d", s->regoff); else { - if (regs_ok) printf(" %3s",regs[s->regoff]); else printf(" ???"); + printf(" %3s", regs[s->regoff]); } break; case STACKVAR: @@ -2198,43 +2349,41 @@ static char *jit_type[] = { }; -void show_icmd_method() +void show_icmd_method(methodinfo *m) { int i, j; - s4 *s4ptr; /* used */ basicblock *bptr; - xtable *ex; + exceptiontable *ex; printf("\n"); - utf_fprint(stdout, class->name); + utf_fprint_classname(stdout, m->class->name); printf("."); - utf_fprint(stdout, method->name); - printf(" "); - utf_fprint(stdout, method->descriptor); - printf ("\n\nMax locals: %d\n", (int) maxlocals); - printf ("Max stack: %d\n", (int) maxstack); + utf_fprint(stdout, m->name); + utf_fprint_classname(stdout, m->descriptor); + printf ("\n\nMax locals: %d\n", (int) m->maxlocals); + printf ("Max stack: %d\n", (int) m->maxstack); - printf ("Line number table lengt: %d\n",method->linenumbercount); + printf ("Line number table length: %d\n", m->linenumbercount); - printf ("Exceptions (Number: %d):\n", exceptiontablelength); - for (ex = extable; ex != NULL; ex = ex->down) { + printf ("Exceptions (Number: %d):\n", m->exceptiontablelength); + for (ex = m->exceptiontable; ex != NULL; ex = ex->down) { printf(" L%03d ... ", ex->start->debug_nr ); printf("L%03d = ", ex->end->debug_nr); printf("L%03d\n", ex->handler->debug_nr); } printf ("Local Table:\n"); - for (i = 0; i < maxlocals; i++) { + for (i = 0; i < m->maxlocals; i++) { printf(" %3d: ", i); for (j = TYPE_INT; j <= TYPE_ADR; j++) - if (locals[i][j].type >= 0) { + if (m->registerdata->locals[i][j].type >= 0) { printf(" (%s) ", jit_type[j]); - if (locals[i][j].flags & INMEMORY) - printf((regs_ok) ? "m%2d" : "m??", locals[i][j].regoff); + if (m->registerdata->locals[i][j].flags & INMEMORY) + printf("m%2d", m->registerdata->locals[i][j].regoff); else if ((j == TYPE_FLT) || (j == TYPE_DBL)) - printf((regs_ok) ? "f%02d" : "f??", locals[i][j].regoff); + printf("f%02d", m->registerdata->locals[i][j].regoff); else { - if (regs_ok) printf("%3s",regs[locals[i][j].regoff]); else printf("???"); + printf("%3s", regs[m->registerdata->locals[i][j].regoff]); } } printf("\n"); @@ -2242,30 +2391,32 @@ void show_icmd_method() printf("\n"); printf ("Interface Table:\n"); - for (i = 0; i < maxstack; i++) { - if ((interfaces[i][0].type >= 0) || (interfaces[i][1].type >= 0) || - (interfaces[i][2].type >= 0) || (interfaces[i][3].type >= 0) || - (interfaces[i][4].type >= 0)) { + for (i = 0; i < m->maxstack; i++) { + if ((m->registerdata->interfaces[i][0].type >= 0) || + (m->registerdata->interfaces[i][1].type >= 0) || + (m->registerdata->interfaces[i][2].type >= 0) || + (m->registerdata->interfaces[i][3].type >= 0) || + (m->registerdata->interfaces[i][4].type >= 0)) { printf(" %3d: ", i); for (j = TYPE_INT; j <= TYPE_ADR; j++) - if (interfaces[i][j].type >= 0) { + if (m->registerdata->interfaces[i][j].type >= 0) { printf(" (%s) ", jit_type[j]); - if (interfaces[i][j].flags & SAVEDVAR) { - if (interfaces[i][j].flags & INMEMORY) - printf((regs_ok) ? "M%2d" : "M??", interfaces[i][j].regoff); + if (m->registerdata->interfaces[i][j].flags & SAVEDVAR) { + if (m->registerdata->interfaces[i][j].flags & INMEMORY) + printf("M%2d", m->registerdata->interfaces[i][j].regoff); else if ((j == TYPE_FLT) || (j == TYPE_DBL)) - printf((regs_ok) ? "F%02d" : "F??", interfaces[i][j].regoff); + printf("F%02d", m->registerdata->interfaces[i][j].regoff); else { - if (regs_ok) printf("%3s",regs[interfaces[i][j].regoff]); else printf("???"); + printf("%3s", regs[m->registerdata->interfaces[i][j].regoff]); } } else { - if (interfaces[i][j].flags & INMEMORY) - printf((regs_ok) ? "m%2d" : "m??", interfaces[i][j].regoff); + if (m->registerdata->interfaces[i][j].flags & INMEMORY) + printf("m%2d", m->registerdata->interfaces[i][j].regoff); else if ((j == TYPE_FLT) || (j == TYPE_DBL)) - printf((regs_ok) ? "f%02d" : "f??", interfaces[i][j].regoff); + printf("f%02d", m->registerdata->interfaces[i][j].regoff); else { - if (regs_ok) printf("%3s",regs[interfaces[i][j].regoff]); else printf("???"); + printf("%3s", regs[m->registerdata->interfaces[i][j].regoff]); } } } @@ -2277,71 +2428,70 @@ void show_icmd_method() if (showdisassemble) { #if defined(__I386__) || defined(__X86_64__) u1 *u1ptr; - int a; + s4 a; - u1ptr = method->mcode + dseglen; - for (i = 0; i < block[0].mpc; i++, u1ptr++) { + u1ptr = m->mcode + dseglen; + for (i = 0; i < m->basicblocks[0].mpc; i++, u1ptr++) { a = disassinstr(u1ptr, i); i += a; u1ptr += a; } printf("\n"); #else - s4ptr = (s4 *) (method->mcode + dseglen); - for (i = 0; i < block[0].mpc; i += 4, s4ptr++) { - disassinstr(*s4ptr, i); + s4 *s4ptr; + + s4ptr = (s4 *) (m->mcode + dseglen); + for (i = 0; i < m->basicblocks[0].mpc; i += 4, s4ptr++) { + disassinstr(s4ptr, i); } printf("\n"); #endif } - - for (bptr = block; bptr != NULL; bptr = bptr->next) { - show_icmd_block(bptr); + for (bptr = m->basicblocks; bptr != NULL; bptr = bptr->next) { + show_icmd_block(m, bptr); } } -void show_icmd_block(basicblock *bptr) +void show_icmd_block(methodinfo *m, basicblock *bptr) { int i, j; int deadcode; - s4 *s4ptr; /* used */ instruction *iptr; if (bptr->flags != BBDELETED) { deadcode = bptr->flags <= BBREACHED; printf("["); if (deadcode) - for (j = method->maxstack; j > 0; j--) + for (j = m->maxstack; j > 0; j--) printf(" ? "); else - icmd_print_stack(bptr->instack); + icmd_print_stack(m, bptr->instack); printf("] L%03d(%d - %d) flags=%d:\n", bptr->debug_nr, bptr->icount, bptr->pre_count,bptr->flags); iptr = bptr->iinstr; - for (i=0; i < bptr->icount; i++, iptr++) { + for (i = 0; i < bptr->icount; i++, iptr++) { printf("["); if (deadcode) { - for (j = method->maxstack; j > 0; j--) + for (j = m->maxstack; j > 0; j--) printf(" ? "); } else - icmd_print_stack(iptr->dst); + icmd_print_stack(m, iptr->dst); printf("] %4d ", i); - /* DEBUG */ /*fflush(stdout);*/ - show_icmd(iptr,deadcode); + show_icmd(iptr, deadcode); printf("\n"); } if (showdisassemble && (!deadcode)) { #if defined(__I386__) || defined(__X86_64__) u1 *u1ptr; - int a; + s4 a; printf("\n"); i = bptr->mpc; - u1ptr = method->mcode + dseglen + i; + u1ptr = m->mcode + dseglen + i; if (bptr->next != NULL) { for (; i < bptr->next->mpc; i++, u1ptr++) { @@ -2352,7 +2502,7 @@ void show_icmd_block(basicblock *bptr) printf("\n"); } else { - for (; u1ptr < (u1 *) (method->mcode + method->mcodelength); i++, u1ptr++) { + for (; u1ptr < (u1 *) (m->mcode + m->mcodelength); i++, u1ptr++) { a = disassinstr(u1ptr, i); i += a; u1ptr += a; @@ -2360,19 +2510,21 @@ void show_icmd_block(basicblock *bptr) printf("\n"); } #else + s4 *s4ptr; + printf("\n"); i = bptr->mpc; - s4ptr = (s4 *) (method->mcode + dseglen + i); + s4ptr = (s4 *) (m->mcode + dseglen + i); if (bptr->next != NULL) { for (; i < bptr->next->mpc; i += 4, s4ptr++) { - disassinstr(*s4ptr, i); + disassinstr(s4ptr, i); } printf("\n"); } else { - for (; s4ptr < (s4 *) (method->mcode + method->mcodelength); i += 4, s4ptr++) { - disassinstr(*s4ptr, i); + for (; s4ptr < (s4 *) (m->mcode + m->mcodelength); i += 4, s4ptr++) { + disassinstr(s4ptr, i); } printf("\n"); } @@ -2382,11 +2534,11 @@ void show_icmd_block(basicblock *bptr) } -void show_icmd(instruction *iptr,bool deadcode) +void show_icmd(instruction *iptr, bool deadcode) { int j; s4 *s4ptr; - void **tptr; + void **tptr = NULL; printf("%s", icmd_names[iptr->opc]); @@ -2396,7 +2548,6 @@ void show_icmd(instruction *iptr,bool deadcode) case ICMD_IMULCONST: case ICMD_IDIVPOW2: case ICMD_IREMPOW2: - case ICMD_IREM0X10001: case ICMD_IANDCONST: case ICMD_IORCONST: case ICMD_IXORCONST: @@ -2414,6 +2565,10 @@ void show_icmd(instruction *iptr,bool deadcode) case ICMD_IFGE_ICONST: case ICMD_IFGT_ICONST: case ICMD_IFLE_ICONST: + case ICMD_IASTORECONST: + case ICMD_BASTORECONST: + case ICMD_CASTORECONST: + case ICMD_SASTORECONST: printf(" %d", iptr->val.i); break; @@ -2426,6 +2581,7 @@ void show_icmd(instruction *iptr,bool deadcode) case ICMD_LORCONST: case ICMD_LXORCONST: case ICMD_LCONST: + case ICMD_LASTORECONST: #if defined(__I386__) printf(" %lld", iptr->val.l); #else @@ -2442,6 +2598,7 @@ void show_icmd(instruction *iptr,bool deadcode) break; case ICMD_ACONST: + case ICMD_AASTORECONST: printf(" %p", iptr->val.a); break; @@ -2543,9 +2700,9 @@ void show_icmd(instruction *iptr,bool deadcode) case ICMD_MULTIANEWARRAY: { - vftbl *vft; + vftbl_t *vft; printf(" %d ",iptr->op1); - vft = (vftbl *)iptr->val.a; + vft = (vftbl_t *)iptr->val.a; if (vft) utf_fprint(stdout,vft->class->name); else @@ -2602,9 +2759,17 @@ void show_icmd(instruction *iptr,bool deadcode) case ICMD_IF_LGT: case ICMD_IF_LLE: if (deadcode || !iptr->target) +#if defined(__I386__) || defined(__POWERPC__) printf("(%lld) op1=%d", iptr->val.l, iptr->op1); +#else + printf("(%ld) op1=%d", iptr->val.l, iptr->op1); +#endif else +#if defined(__I386__) || defined(__POWERPC__) printf("(%lld) L%03d", iptr->val.l, ((basicblock *) iptr->target)->debug_nr); +#else + printf("(%ld) L%03d", iptr->val.l, ((basicblock *) iptr->target)->debug_nr); +#endif break; case ICMD_JSR: @@ -2683,7 +2848,10 @@ void show_icmd(instruction *iptr,bool deadcode) } break; } - printf(" Line number: %d",iptr->line); + printf(" Line number: %d, method:",iptr->line); + utf_display(iptr->method->class->name); + printf("."); + utf_display(iptr->method->name); }