1 /* vm/jit/show.c - showing the intermediate representation
3 Copyright (C) 1996-2005, 2006 R. Grafl, A. Krall, C. Kruegel,
4 C. Oates, R. Obermaisser, M. Platter, M. Probst, S. Ring,
5 E. Steiner, C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich,
6 J. Wenninger, Institut f. Computersprachen - TU Wien
8 This file is part of CACAO.
10 This program is free software; you can redistribute it and/or
11 modify it under the terms of the GNU General Public License as
12 published by the Free Software Foundation; either version 2, or (at
13 your option) any later version.
15 This program is distributed in the hope that it will be useful, but
16 WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 General Public License for more details.
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
25 Contact: cacao@cacaojvm.org
27 Authors: Andreas Krall
29 Changes: Edwin Steiner
43 #include "mm/memory.h"
44 #include "vm/global.h"
45 #include "vm/options.h"
46 #include "vm/builtin.h"
47 #include "vm/stringlocal.h"
48 #include "vm/jit/jit.h"
49 #include "vm/jit/show.h"
50 #include "vm/jit/disass.h"
52 #if defined(ENABLE_THREADS)
53 #include "threads/native/lock.h"
56 /* global variables ***********************************************************/
58 #if defined(ENABLE_THREADS) && !defined(NDEBUG)
59 static java_objectheader *show_global_lock;
63 /* show_init *******************************************************************
65 Initialized the show subsystem (called by jit_init).
67 *******************************************************************************/
72 #if defined(ENABLE_THREADS)
73 /* initialize the show lock */
75 show_global_lock = NEW(java_objectheader);
77 lock_init_object_lock(show_global_lock);
87 /* show_print_stack ************************************************************
89 Print the stack representation starting with the given top stackptr.
91 NOTE: Currently this function may only be called after register allocation!
93 *******************************************************************************/
96 static void show_print_stack(codegendata *cd, stackptr s)
108 j = cd->maxstack - i;
114 if (s->flags & SAVEDVAR)
115 switch (s->varkind) {
117 if (s->flags & INMEMORY)
118 printf(" M%02d", s->regoff);
119 #ifdef HAS_ADDRESS_REGISTER_FILE
120 else if (s->type == TYPE_ADR)
121 printf(" R%02d", s->regoff);
123 else if (IS_FLT_DBL_TYPE(s->type))
124 printf(" F%02d", s->regoff);
126 #if defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
127 if (IS_2_WORD_TYPE(s->type)) {
128 # if defined(ENABLE_JIT) && defined(ENABLE_DISASSEMBLER)
129 # if defined(ENABLE_INTRP)
131 printf(" %3d/%3d", GET_LOW_REG(s->regoff),
132 GET_HIGH_REG(s->regoff));
135 printf(" %3s/%3s", regs[GET_LOW_REG(s->regoff)],
136 regs[GET_HIGH_REG(s->regoff)]);
138 printf(" %3d/%3d", GET_LOW_REG(s->regoff),
139 GET_HIGH_REG(s->regoff));
143 #endif /* defined(SUPPORT_COMBINE_INTEGER_REGISTERS) */
145 #if defined(ENABLE_JIT) && defined(ENABLE_DISASSEMBLER)
146 # if defined(ENABLE_INTRP)
148 printf(" %3d", s->regoff);
151 printf(" %3s", regs[s->regoff]);
153 printf(" %3d", s->regoff);
159 printf(" I%02d", s->varnum);
162 printf(" L%02d", s->varnum);
165 if (s->varnum == -1) {
167 /* varkind ARGVAR "misused for this special case */
170 else /* "normal" Argvar */
171 printf(" A%02d", s->varnum);
177 switch (s->varkind) {
179 if (s->flags & INMEMORY)
180 printf(" m%02d", s->regoff);
181 #ifdef HAS_ADDRESS_REGISTER_FILE
182 else if (s->type == TYPE_ADR)
183 printf(" r%02d", s->regoff);
185 else if (IS_FLT_DBL_TYPE(s->type))
186 printf(" f%02d", s->regoff);
188 #if defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
189 if (IS_2_WORD_TYPE(s->type)) {
190 # if defined(ENABLE_JIT) && defined(ENABLE_DISASSEMBLER)
191 # if defined(ENABLE_INTRP)
193 printf(" %3d/%3d", GET_LOW_REG(s->regoff),
194 GET_HIGH_REG(s->regoff));
197 printf(" %3s/%3s", regs[GET_LOW_REG(s->regoff)],
198 regs[GET_HIGH_REG(s->regoff)]);
200 printf(" %3d/%3d", GET_LOW_REG(s->regoff),
201 GET_HIGH_REG(s->regoff));
205 #endif /* defined(SUPPORT_COMBINE_INTEGER_REGISTERS) */
207 #if defined(ENABLE_JIT) && defined(ENABLE_DISASSEMBLER)
208 # if defined(ENABLE_INTRP)
210 printf(" %3d", s->regoff);
213 printf(" %3s", regs[s->regoff]);
215 printf(" %3d", s->regoff);
221 printf(" i%02d", s->varnum);
224 printf(" l%02d", s->varnum);
227 if (s->varnum == -1) {
229 /* varkind ARGVAR "misused for this special case */
232 else /* "normal" Argvar */
233 printf(" a%02d", s->varnum);
241 #endif /* !defined(NDEBUG) */
245 static void print_reg(stackptr s) {
247 if (s->flags & SAVEDVAR)
248 switch (s->varkind) {
250 if (s->flags & INMEMORY)
251 printf(" tm%02d", s->regoff);
253 printf(" tr%02d", s->regoff);
256 printf(" s %02d", s->varnum);
259 printf(" l %02d", s->varnum);
262 printf(" a %02d", s->varnum);
265 printf(" ! %02d", s->varnum);
268 switch (s->varkind) {
270 if (s->flags & INMEMORY)
271 printf(" Tm%02d", s->regoff);
273 printf(" Tr%02d", s->regoff);
276 printf(" S %02d", s->varnum);
279 printf(" L %02d", s->varnum);
282 printf(" A %02d", s->varnum);
285 printf(" ? %02d", s->varnum);
296 static char *jit_type[] = {
306 /* show_method *****************************************************************
308 Print the intermediate representation of a method.
310 NOTE: Currently this function may only be called after register allocation!
312 *******************************************************************************/
315 void show_method(jitdata *jd)
326 /* get required compiler data */
333 #if defined(ENABLE_THREADS)
334 /* We need to enter a lock here, since the binutils disassembler
335 is not reentrant-able and we could not read functions printed
338 builtin_monitorenter(show_global_lock);
345 printf("\nBasic blocks: %d\n", m->basicblockcount);
346 printf("Max locals: %d\n", cd->maxlocals);
347 printf("Max stack: %d\n", cd->maxstack);
348 printf("Line number table length: %d\n", m->linenumbercount);
350 printf("Exceptions (Number: %d):\n", cd->exceptiontablelength);
351 for (ex = cd->exceptiontable; ex != NULL; ex = ex->down) {
352 printf(" L%03d ... ", ex->start->debug_nr );
353 printf("L%03d = ", ex->end->debug_nr);
354 printf("L%03d", ex->handler->debug_nr);
355 printf(" (catchtype: ");
356 if (ex->catchtype.any)
357 if (IS_CLASSREF(ex->catchtype))
358 utf_display_printable_ascii_classname(ex->catchtype.ref->name);
360 utf_display_printable_ascii_classname(ex->catchtype.cls->name);
366 printf("Local Table:\n");
367 for (i = 0; i < cd->maxlocals; i++) {
370 #if defined(ENABLE_JIT) && defined(ENABLE_DISASSEMBLER)
371 for (j = TYPE_INT; j <= TYPE_ADR; j++) {
372 # if defined(ENABLE_INTRP)
375 if (rd->locals[i][j].type >= 0) {
376 printf(" (%s) ", jit_type[j]);
377 if (rd->locals[i][j].flags & INMEMORY)
378 printf("m%2d", rd->locals[i][j].regoff);
379 # ifdef HAS_ADDRESS_REGISTER_FILE
380 else if (j == TYPE_ADR)
381 printf("r%02d", rd->locals[i][j].regoff);
383 else if ((j == TYPE_FLT) || (j == TYPE_DBL))
384 printf("f%02d", rd->locals[i][j].regoff);
386 # if defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
387 if (IS_2_WORD_TYPE(j))
389 regs[GET_LOW_REG(rd->locals[i][j].regoff)],
390 regs[GET_HIGH_REG(rd->locals[i][j].regoff)]);
393 printf("%3s", regs[rd->locals[i][j].regoff]);
396 # if defined(ENABLE_INTRP)
400 #endif /* defined(ENABLE_JIT) && defined(ENABLE_DISASSEMBLER) */
406 #if defined(ENABLE_LSRA)
409 #if defined(ENABLE_INTRP)
412 printf("Interface Table:\n");
413 for (i = 0; i < cd->maxstack; i++) {
414 if ((rd->interfaces[i][0].type >= 0) ||
415 (rd->interfaces[i][1].type >= 0) ||
416 (rd->interfaces[i][2].type >= 0) ||
417 (rd->interfaces[i][3].type >= 0) ||
418 (rd->interfaces[i][4].type >= 0)) {
421 #if defined(ENABLE_JIT) && defined(ENABLE_DISASSEMBLER)
422 # if defined(ENABLE_INTRP)
425 for (j = TYPE_INT; j <= TYPE_ADR; j++) {
426 if (rd->interfaces[i][j].type >= 0) {
427 printf(" (%s) ", jit_type[j]);
428 if (rd->interfaces[i][j].flags & SAVEDVAR) {
429 if (rd->interfaces[i][j].flags & INMEMORY)
430 printf("M%2d", rd->interfaces[i][j].regoff);
431 #ifdef HAS_ADDRESS_REGISTER_FILE
432 else if (j == TYPE_ADR)
433 printf("R%02d", rd->interfaces[i][j].regoff);
435 else if ((j == TYPE_FLT) || (j == TYPE_DBL))
436 printf("F%02d", rd->interfaces[i][j].regoff);
438 #if defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
439 if (IS_2_WORD_TYPE(j))
441 regs[GET_LOW_REG(rd->interfaces[i][j].regoff)],
442 regs[GET_HIGH_REG(rd->interfaces[i][j].regoff)]);
445 printf("%3s",regs[rd->interfaces[i][j].regoff]);
449 if (rd->interfaces[i][j].flags & INMEMORY)
450 printf("m%2d", rd->interfaces[i][j].regoff);
451 #ifdef HAS_ADDRESS_REGISTER_FILE
452 else if (j == TYPE_ADR)
453 printf("r%02d", rd->interfaces[i][j].regoff);
455 else if ((j == TYPE_FLT) || (j == TYPE_DBL))
456 printf("f%02d", rd->interfaces[i][j].regoff);
458 #if defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
459 if (IS_2_WORD_TYPE(j))
461 regs[GET_LOW_REG(rd->interfaces[i][j].regoff)],
462 regs[GET_HIGH_REG(rd->interfaces[i][j].regoff)]);
465 printf("%3s",regs[rd->interfaces[i][j].regoff]);
471 # if defined(ENABLE_INTRP)
474 #endif /* defined(ENABLE_JIT) && defined(ENABLE_DISASSEMBLER) */
480 #if defined(ENABLE_INTRP)
483 #if defined(ENABLE_LSRA)
487 if (code->rplpoints) {
488 printf("Replacement Points:\n");
489 replace_show_replacement_points(code);
493 #if defined(ENABLE_DISASSEMBLER)
494 /* show code before first basic block */
496 if (opt_showdisassemble) {
497 u1ptr = (u1 *) ((ptrint) code->mcode + cd->dseglen);
499 for (; u1ptr < (u1 *) ((ptrint) code->mcode + cd->dseglen + m->basicblocks[0].mpc);)
506 /* show code of all basic blocks */
508 for (bptr = m->basicblocks; bptr != NULL; bptr = bptr->next)
509 show_basicblock(jd, bptr);
511 #if defined(ENABLE_DISASSEMBLER)
512 /* show stubs code */
514 if (opt_showdisassemble && opt_showexceptionstubs) {
515 printf("\nException stubs code:\n");
516 printf("Length: %d\n\n", (s4) (code->mcodelength -
517 ((ptrint) cd->dseglen +
518 m->basicblocks[m->basicblockcount].mpc)));
520 u1ptr = (u1 *) ((ptrint) code->mcode + cd->dseglen +
521 m->basicblocks[m->basicblockcount].mpc);
523 for (; (ptrint) u1ptr < ((ptrint) code->mcode + code->mcodelength);)
530 #if defined(ENABLE_THREADS)
531 builtin_monitorexit(show_global_lock);
534 /* finally flush the output */
538 #endif /* !defined(NDEBUG) */
541 /* show_basicblock *************************************************************
543 Print the intermediate representation of a basic block.
545 NOTE: Currently this function may only be called after register allocation!
547 *******************************************************************************/
550 void show_basicblock(jitdata *jd, basicblock *bptr)
560 /* get required compiler data */
566 if (bptr->flags != BBDELETED) {
567 deadcode = bptr->flags <= BBREACHED;
572 for (j = cd->maxstack; j > 0; j--)
575 show_print_stack(cd, bptr->instack);
577 printf("] %sL%03d(flags: %d, bitflags: %01x, next: %d, type: ",
578 (bptr->bitflags & BBFLAG_REPLACEMENT) ? "<REPLACE> " : "",
579 bptr->debug_nr, bptr->flags, bptr->bitflags,
580 (bptr->next) ? (bptr->next->debug_nr) : -1);
582 switch (bptr->type) {
594 printf(", instruction count: %d, predecessors: %d):\n",
595 bptr->icount, bptr->pre_count);
599 for (i = 0; i < bptr->icount; i++, iptr++) {
603 for (j = cd->maxstack; j > 0; j--)
606 show_print_stack(cd, iptr->dst);
608 printf("] %5d (line: %5d) ", i, iptr->line);
610 show_icmd(iptr, deadcode);
614 #if defined(ENABLE_DISASSEMBLER)
615 if (opt_showdisassemble && (!deadcode)) {
617 u1ptr = (u1 *) ((ptrint) code->mcode + cd->dseglen + bptr->mpc);
619 if (bptr->next != NULL) {
620 for (; u1ptr < (u1 *) ((ptrint) code->mcode + cd->dseglen + bptr->next->mpc);)
625 for (; u1ptr < (u1 *) ((ptrint) code->mcode + code->mcodelength);)
633 #endif /* !defined(NDEBUG) */
636 /* show_icmd *******************************************************************
638 Print the intermediate representation of an instruction.
640 NOTE: Currently this function may only be called after register allocation!
642 *******************************************************************************/
645 void show_icmd(instruction *iptr, bool deadcode)
654 constant_classref *cr;
655 unresolved_field *uf;
657 /* get the opcode and the condition */
659 opcode = iptr->opc & ICMD_OPCODE_MASK;
660 condition = (iptr->opc & ICMD_CONDITION_MASK) >> 8;
662 printf("%s", icmd_names[opcode]);
664 /* Print the condition for conditional instructions. */
667 printf(" (condition: %s)", icmd_names[condition]);
681 case ICMD_IUSHRCONST:
684 case ICMD_LUSHRCONST:
686 case ICMD_IASTORECONST:
687 case ICMD_BASTORECONST:
688 case ICMD_CASTORECONST:
689 case ICMD_SASTORECONST:
690 printf(" %d (0x%08x)", iptr->val.i, iptr->val.i);
693 case ICMD_IFEQ_ICONST:
694 case ICMD_IFNE_ICONST:
695 case ICMD_IFLT_ICONST:
696 case ICMD_IFGE_ICONST:
697 case ICMD_IFGT_ICONST:
698 case ICMD_IFLE_ICONST:
699 printf(" %d, %d (0x%08x)", iptr[1].op1, iptr->val.i, iptr->val.i);
702 case ICMD_ELSE_ICONST:
703 printf(" %d (0x%08x)", iptr->val.i, iptr->val.i);
716 case ICMD_LASTORECONST:
717 #if SIZEOF_VOID_P == 4
718 printf(" %lld (0x%016llx)", iptr->val.l, iptr->val.l);
720 printf(" %ld (0x%016lx)", iptr->val.l, iptr->val.l);
725 printf(" %f (0x%08x)", iptr->val.f, iptr->val.i);
729 #if SIZEOF_VOID_P == 4
730 printf(" %g (0x%016llx)", iptr->val.d, iptr->val.l);
732 printf(" %g (0x%016lx)", iptr->val.d, iptr->val.l);
737 case ICMD_AASTORECONST:
738 /* check if this is a constant string or a class reference */
740 if (ICMD_ACONST_IS_CLASS(iptr)) {
741 if (INSTRUCTION_IS_UNRESOLVED(iptr)) {
742 printf(" (NOT RESOLVED) classref = ");
743 class_classref_print(ICMD_ACONST_UNRESOLVED_CLASSREF(iptr));
747 class_print(ICMD_ACONST_RESOLVED_CLASSINFO(iptr));
751 printf(" %p", iptr->val.a);
754 printf(", String = \"");
755 utf_display_printable_ascii(javastring_toutf(iptr->val.a, false));
763 if (INSTRUCTION_IS_UNRESOLVED(iptr)) {
764 uf = INSTRUCTION_UNRESOLVED_FIELD(iptr);
765 printf(" (NOT RESOLVED) ");
767 field_fieldref_print(uf->fieldref);
770 f = INSTRUCTION_RESOLVED_FIELDINFO(iptr);
771 printf(" %d, ", f->offset);
779 if (INSTRUCTION_IS_UNRESOLVED(iptr)) {
780 uf = INSTRUCTION_UNRESOLVED_FIELD(iptr);
781 printf(" (NOT RESOLVED) ");
783 field_fieldref_print(uf->fieldref);
786 f = INSTRUCTION_RESOLVED_FIELDINFO(iptr);
787 if (!CLASS_IS_OR_ALMOST_INITIALIZED(f->class))
788 printf(" (NOT INITIALIZED) ");
796 case ICMD_PUTSTATICCONST:
797 case ICMD_PUTFIELDCONST:
798 switch (iptr[1].op1) {
800 printf(" %d (0x%08x),", iptr->val.i, iptr->val.i);
803 #if SIZEOF_VOID_P == 4
804 printf(" %lld (0x%016llx),", iptr->val.l, iptr->val.l);
806 printf(" %ld (0x%016lx),", iptr->val.l, iptr->val.l);
810 printf(" %p,", iptr->val.a);
813 printf(" %g (0x%08x),", iptr->val.f, iptr->val.i);
816 #if SIZEOF_VOID_P == 4
817 printf(" %g (0x%016llx),", iptr->val.d, iptr->val.l);
819 printf(" %g (0x%016lx),", iptr->val.d, iptr->val.l);
824 if (INSTRUCTION_IS_UNRESOLVED(iptr + 1)) {
825 uf = INSTRUCTION_UNRESOLVED_FIELD(iptr + 1);
826 printf(" (NOT RESOLVED) ");
827 field_fieldref_print(uf->fieldref);
830 f = INSTRUCTION_RESOLVED_FIELDINFO(iptr + 1);
831 if ((iptr->opc == ICMD_PUTSTATICCONST) &&
832 !CLASS_IS_OR_ALMOST_INITIALIZED(f->class))
833 printf(" (NOT INITIALIZED), ");
835 printf(" %d, ", f->offset);
841 printf(" %d + %d", iptr->op1, iptr->val.i);
876 printf(" %d", iptr->op1);
882 utf_display_printable_ascii_classname(c->name);
918 utf_display_printable_ascii_classname(c->name);
922 case ICMD_MULTIANEWARRAY:
927 printf(" (NOT RESOLVED) %d ", iptr->op1);
928 utf_display_printable_ascii(cr->name);
931 printf(" %d ", iptr->op1);
932 utf_display_printable_ascii_classname(c->name);
937 case ICMD_INSTANCEOF:
942 if (c->flags & ACC_INTERFACE)
943 printf(" (INTERFACE) ");
945 printf(" (CLASS,%3d) ", c->vftbl->diffval);
947 printf(" (NOT RESOLVED) ");
948 utf_display_printable_ascii_classname(cr->name);
951 case ICMD_INLINE_START:
952 case ICMD_INLINE_END:
954 insinfo_inline *insinfo = (insinfo_inline *) iptr->target;
956 method_print(insinfo->method);
961 printf(" %s", ((builtintable_entry *) iptr->val.a)->name);
964 case ICMD_INVOKEVIRTUAL:
965 case ICMD_INVOKESPECIAL:
966 case ICMD_INVOKESTATIC:
967 case ICMD_INVOKEINTERFACE:
969 constant_FMIref *mref;
971 if (INSTRUCTION_IS_UNRESOLVED(iptr)) {
972 printf(" (NOT RESOLVED) ");
973 mref = INSTRUCTION_UNRESOLVED_METHOD(iptr)->methodref;
977 mref = INSTRUCTION_RESOLVED_FMIREF(iptr);
979 method_methodref_print(mref);
989 printf(" %d (0x%08x)", iptr->val.i, iptr->val.i);
991 if ((iptr->opc & ICMD_CONDITION_MASK) == 0) {
992 if (deadcode || !iptr->target)
993 printf(" op1=%d", iptr->op1);
995 printf(" L%03d (%p)", ((basicblock *) iptr->target)->debug_nr, iptr->target);
1005 #if SIZEOF_VOID_P == 4
1006 printf(" %lld (%016llx)", iptr->val.l, iptr->val.l);
1008 printf(" %ld (%016lx)", iptr->val.l, iptr->val.l);
1011 if ((iptr->opc & ICMD_CONDITION_MASK) == 0) {
1012 if (deadcode || !iptr->target)
1013 printf(" op1=%d", iptr->op1);
1015 printf(" L%03d", ((basicblock *) iptr->target)->debug_nr);
1021 case ICMD_INLINE_GOTO:
1022 if (deadcode || !iptr->target)
1023 printf(" op1=%d", iptr->op1);
1025 printf(" L%03d (%p)", ((basicblock *) iptr->target)->debug_nr,iptr->target);
1029 case ICMD_IFNONNULL:
1030 case ICMD_IF_ICMPEQ:
1031 case ICMD_IF_ICMPNE:
1032 case ICMD_IF_ICMPLT:
1033 case ICMD_IF_ICMPGE:
1034 case ICMD_IF_ICMPGT:
1035 case ICMD_IF_ICMPLE:
1037 case ICMD_IF_LCMPEQ:
1038 case ICMD_IF_LCMPNE:
1039 case ICMD_IF_LCMPLT:
1040 case ICMD_IF_LCMPGE:
1041 case ICMD_IF_LCMPGT:
1042 case ICMD_IF_LCMPLE:
1044 case ICMD_IF_FCMPEQ:
1045 case ICMD_IF_FCMPNE:
1047 case ICMD_IF_FCMPL_LT:
1048 case ICMD_IF_FCMPL_GE:
1049 case ICMD_IF_FCMPL_GT:
1050 case ICMD_IF_FCMPL_LE:
1052 case ICMD_IF_FCMPG_LT:
1053 case ICMD_IF_FCMPG_GE:
1054 case ICMD_IF_FCMPG_GT:
1055 case ICMD_IF_FCMPG_LE:
1057 case ICMD_IF_DCMPEQ:
1058 case ICMD_IF_DCMPNE:
1060 case ICMD_IF_DCMPL_LT:
1061 case ICMD_IF_DCMPL_GE:
1062 case ICMD_IF_DCMPL_GT:
1063 case ICMD_IF_DCMPL_LE:
1065 case ICMD_IF_DCMPG_LT:
1066 case ICMD_IF_DCMPG_GE:
1067 case ICMD_IF_DCMPG_GT:
1068 case ICMD_IF_DCMPG_LE:
1070 case ICMD_IF_ACMPEQ:
1071 case ICMD_IF_ACMPNE:
1072 if (!(iptr->opc & ICMD_CONDITION_MASK)) {
1073 if (deadcode || !iptr->target)
1074 printf(" op1=%d", iptr->op1);
1076 printf(" L%03d (%p)", ((basicblock *) iptr->target)->debug_nr,iptr->target);
1080 case ICMD_TABLESWITCH:
1081 s4ptr = (s4*)iptr->val.a;
1083 if (deadcode || !iptr->target) {
1084 printf(" %d;", *s4ptr);
1087 tptr = (void **) iptr->target;
1088 printf(" L%03d;", ((basicblock *) *tptr)->debug_nr);
1092 s4ptr++; /* skip default */
1093 j = *s4ptr++; /* low */
1094 j = *s4ptr++ - j; /* high */
1096 if (deadcode || !*tptr)
1097 printf(" %d", *s4ptr++);
1099 printf(" L%03d", ((basicblock *) *tptr)->debug_nr);
1106 case ICMD_LOOKUPSWITCH:
1107 s4ptr = (s4*)iptr->val.a;
1109 if (deadcode || !iptr->target) {
1110 printf(" %d;", *s4ptr);
1113 tptr = (void **) iptr->target;
1114 printf(" L%03d;", ((basicblock *) *tptr)->debug_nr);
1117 s4ptr++; /* default */
1118 j = *s4ptr++; /* count */
1121 if (deadcode || !*tptr) {
1122 s4ptr++; /* skip value */
1123 printf(" %d",*s4ptr++);
1126 printf(" L%03d", ((basicblock *) *tptr)->debug_nr);
1134 printf(" (NOT RESOLVED) Class = \"");
1135 utf_display_printable_ascii(((unresolved_class *) iptr->val.a)->classref->name);
1140 #endif /* !defined(NDEBUG) */
1143 * These are local overrides for various environment variables in Emacs.
1144 * Please do not remove this and leave it at the end of the file, where
1145 * Emacs will automagically detect them.
1146 * ---------------------------------------------------------------------
1149 * indent-tabs-mode: t
1153 * vim:noexpandtab:sw=4:ts=4: