1 /* src/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"
45 #if defined(ENABLE_THREADS)
46 # include "threads/native/lock.h"
48 # include "threads/none/lock.h"
51 #include "vm/global.h"
52 #include "vm/options.h"
53 #include "vm/builtin.h"
54 #include "vm/stringlocal.h"
55 #include "vm/jit/jit.h"
56 #include "vm/jit/show.h"
57 #include "vm/jit/disass.h"
58 #include "vm/jit/stack.h"
61 /* global variables ***********************************************************/
63 #if defined(ENABLE_THREADS) && !defined(NDEBUG)
64 static java_objectheader *show_global_lock;
68 /* forward declarations *******************************************************/
71 static void new_show_variable_array(jitdata *jd, s4 *vars, int n, int stage);
75 /* show_init *******************************************************************
77 Initialized the show subsystem (called by jit_init).
79 *******************************************************************************/
84 #if defined(ENABLE_THREADS)
85 /* initialize the show lock */
87 show_global_lock = NEW(java_objectheader);
89 lock_init_object_lock(show_global_lock);
100 static char *jit_type[] = {
110 /* show_method *****************************************************************
112 Print the intermediate representation of a method.
114 NOTE: Currently this function may only be called after register allocation!
116 *******************************************************************************/
119 void new_show_method(jitdata *jd, int stage)
126 basicblock *lastbptr;
131 /* get required compiler data */
138 /* We need to enter a lock here, since the binutils disassembler
139 is not reentrant-able and we could not read functions printed
142 LOCK_MONITOR_ENTER(show_global_lock);
144 /* get the last basic block */
146 for (lastbptr = jd->new_basicblocks; lastbptr->next != NULL; lastbptr = lastbptr->next);
152 printf("\n(NEW INSTRUCTION FORMAT)\n");
153 printf("\nBasic blocks: %d\n", jd->new_basicblockcount);
154 if (stage >= SHOW_CODE) {
155 printf("Code length: %d\n", (lastbptr->mpc - jd->new_basicblocks[0].mpc));
156 printf("Data length: %d\n", cd->dseglen);
157 printf("Stub length: %d\n", (s4) (code->mcodelength -
158 ((ptrint) cd->dseglen + lastbptr->mpc)));
160 printf("Max locals: %d\n", cd->maxlocals);
161 printf("Max stack: %d\n", cd->maxstack);
162 printf("Line number table length: %d\n", m->linenumbercount);
164 if (stage >= SHOW_PARSE) {
165 printf("Exceptions (Number: %d):\n", cd->exceptiontablelength);
166 for (ex = cd->exceptiontable; ex != NULL; ex = ex->down) {
167 printf(" L%03d ... ", ex->start->nr );
168 printf("L%03d = ", ex->end->nr);
169 printf("L%03d", ex->handler->nr);
170 printf(" (catchtype: ");
171 if (ex->catchtype.any)
172 if (IS_CLASSREF(ex->catchtype))
173 utf_display_printable_ascii_classname(ex->catchtype.ref->name);
175 utf_display_printable_ascii_classname(ex->catchtype.cls->name);
182 if (stage >= SHOW_PARSE && rd && cd->maxlocals > 0) {
183 printf("Local Table:\n");
184 for (i = 0; i < cd->maxlocals; i++) {
187 #if defined(ENABLE_JIT) && defined(ENABLE_DISASSEMBLER)
188 /* for (j = TYPE_INT; j <= TYPE_ADR; j++) { */
189 # if defined(ENABLE_INTRP)
192 /* if (rd->locals[i][j].type >= 0) { */
193 printf(" (%s) ", jit_type[jd->var[i].type]);
194 if (stage >= SHOW_REGS) {
195 if (jd->var[i].flags & INMEMORY)
196 printf("m%2d", jd->var[i].regoff);
197 # ifdef HAS_ADDRESS_REGISTER_FILE
198 else if (jd->var[i].type == TYPE_ADR)
199 printf("r%02d", jd->var[i].regoff);
201 else if ((jd->var[i].type == TYPE_FLT) ||
202 (jd->var[i].type == TYPE_DBL))
203 printf("f%02d", jd->var[i].regoff);
205 # if defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
206 if (IS_2_WORD_TYPE(j))
208 regs[GET_LOW_REG(jd->var[i].regoff)],
209 regs[GET_HIGH_REG(jd->var[i].regoff)]);
212 printf("%3s", regs[jd->var[i].regoff]);
216 # if defined(ENABLE_INTRP)
220 #endif /* defined(ENABLE_JIT) && defined(ENABLE_DISASSEMBLER) */
227 if (cd->maxlocals > 0) {
228 printf("Local Map:\n");
230 for (j = 0; j < cd->maxlocals; j++) {
234 for (i = 0; i < 5; i++) {
235 printf(" %5s ",jit_type[i]);
236 for (j = 0; j < cd->maxlocals; j++) {
237 if (jd->local_map[j*5+i] == UNUSED)
240 printf("%4i ",jd->local_map[j*5+i]);
247 if (cd->maxstack > 0 && jd->interface_map) {
249 s4 *mapptr = jd->interface_map;
251 /* look if there exist any IN/OUTVARS */
252 for (i = 0; (i < (5 * cd->maxstack)) && !exist; i++, mapptr++)
253 exist = (*mapptr != UNUSED);
256 printf("Interface Table: (In/Outvars)\n");
258 for (j = 0; j < cd->maxstack; j++) {
263 for (i = 0; i < 5; i++) {
264 printf(" %5s ",jit_type[i]);
265 for (j = 0; j < cd->maxstack; j++) {
266 if (jd->interface_map[j*5+i] == UNUSED)
269 printf("%4i ", jd->interface_map[j*5+i]);
277 if (code->rplpoints) {
278 printf("Replacement Points:\n");
279 replace_show_replacement_points(code);
283 #if defined(ENABLE_DISASSEMBLER)
284 /* show code before first basic block */
286 if ((stage >= SHOW_CODE) && JITDATA_HAS_FLAG_SHOWDISASSEMBLE(jd)) {
287 u1ptr = (u1 *) ((ptrint) code->mcode + cd->dseglen);
289 for (; u1ptr < (u1 *) ((ptrint) code->mcode + cd->dseglen + jd->new_basicblocks[0].mpc);)
296 /* show code of all basic blocks */
298 for (bptr = jd->new_basicblocks; bptr != NULL; bptr = bptr->next)
299 new_show_basicblock(jd, bptr, stage);
301 #if defined(ENABLE_DISASSEMBLER)
302 /* show stubs code */
304 if (stage >= SHOW_CODE && opt_showdisassemble && opt_showexceptionstubs) {
305 printf("\nStubs code:\n");
306 printf("Length: %d\n\n", (s4) (code->mcodelength -
307 ((ptrint) cd->dseglen + lastbptr->mpc)));
309 u1ptr = (u1 *) ((ptrint) code->mcode + cd->dseglen + lastbptr->mpc);
311 for (; (ptrint) u1ptr < ((ptrint) code->mcode + code->mcodelength);)
318 LOCK_MONITOR_EXIT(show_global_lock);
320 /* finally flush the output */
324 #endif /* !defined(NDEBUG) */
327 /* show_basicblock *************************************************************
329 Print the intermediate representation of a basic block.
331 NOTE: Currently this function may only be called after register allocation!
333 *******************************************************************************/
336 void new_show_basicblock(jitdata *jd, basicblock *bptr, int stage)
346 /* get required compiler data */
352 if (bptr->flags != BBDELETED) {
353 deadcode = bptr->flags <= BBREACHED;
355 printf("======== %sL%03d ======== (flags: %d, bitflags: %01x, next: %d, type: ",
356 (bptr->bitflags & BBFLAG_REPLACEMENT) ? "<REPLACE> " : "",
357 bptr->nr, bptr->flags, bptr->bitflags,
358 (bptr->next) ? (bptr->next->nr) : -1);
360 switch (bptr->type) {
372 printf(", instruction count: %d, predecessors: %d [ ",
373 bptr->icount, bptr->predecessorcount);
375 for (i = 0; i < bptr->predecessorcount; i++)
376 printf("%d ", bptr->predecessors[i]->nr);
380 if (stage >= SHOW_STACK) {
382 new_show_variable_array(jd, bptr->invars, bptr->indepth, stage);
388 for (i = 0; i < bptr->icount; i++, iptr++) {
389 printf("%4d: ", iptr->line);
391 new_show_icmd(jd, iptr, deadcode, stage);
395 if (stage >= SHOW_STACK) {
397 new_show_variable_array(jd, bptr->outvars, bptr->outdepth, stage);
401 #if defined(ENABLE_DISASSEMBLER)
402 if ((stage >= SHOW_CODE) && JITDATA_HAS_FLAG_SHOWDISASSEMBLE(jd) &&
406 u1ptr = (u1 *) (code->mcode + cd->dseglen + bptr->mpc);
408 if (bptr->next != NULL) {
409 for (; u1ptr < (u1 *) (code->mcode + cd->dseglen + bptr->next->mpc);)
414 for (; u1ptr < (u1 *) (code->mcode + code->mcodelength);)
422 #endif /* !defined(NDEBUG) */
425 /* show_icmd *******************************************************************
427 Print the intermediate representation of an instruction.
429 NOTE: Currently this function may only be called after register allocation!
431 *******************************************************************************/
435 #define SHOW_TARGET(target) \
436 if (stage >= SHOW_STACK) { \
437 printf("--> L%03d ", (target).block->nr); \
439 else if (stage >= SHOW_PARSE) { \
440 printf("--> insindex %d (L%03d) ", (target).insindex, \
441 jd->new_basicblocks[jd->new_basicblockindex[ \
442 (target).insindex]].nr); \
445 printf("--> insindex %d ", (target).insindex); \
448 #define SHOW_INT_CONST(val) \
449 if (stage >= SHOW_PARSE) { \
450 printf("%ld ", (long) (val)); \
456 #define SHOW_LNG_CONST(val) \
457 if (stage >= SHOW_PARSE) { \
458 printf("%lld ", (long long)(val)); \
464 #define SHOW_FLT_CONST(val) \
465 if (stage >= SHOW_PARSE) { \
466 printf("%g ", (val)); \
472 #define SHOW_DBL_CONST(val) \
473 if (stage >= SHOW_PARSE) { \
474 printf("%g ", (val)); \
480 #define SHOW_INDEX(index) \
481 if (stage >= SHOW_PARSE) { \
482 printf("%d ", index); \
488 #define SHOW_STRING(val) \
489 if (stage >= SHOW_PARSE) { \
491 utf_display_printable_ascii( \
492 javastring_toutf((java_lang_String *)(val), false)); \
499 #define SHOW_CLASSREF_OR_CLASSINFO(c) \
500 if (stage >= SHOW_PARSE) { \
501 if (IS_CLASSREF(c)) \
502 class_classref_print(c.ref); \
504 class_print(c.cls); \
511 #define SHOW_FIELD(fmiref) \
512 if (stage >= SHOW_PARSE) { \
513 field_fieldref_print(fmiref); \
520 #define SHOW_VARIABLE(v) \
521 show_variable(jd, (v), stage)
523 #define SHOW_S1(iptr) \
524 if (stage >= SHOW_STACK) { \
525 SHOW_VARIABLE(iptr->s1.varindex); \
528 #define SHOW_S2(iptr) \
529 if (stage >= SHOW_STACK) { \
530 SHOW_VARIABLE(iptr->sx.s23.s2.varindex); \
533 #define SHOW_S3(iptr) \
534 if (stage >= SHOW_STACK) { \
535 SHOW_VARIABLE(iptr->sx.s23.s3.varindex); \
538 #define SHOW_DST(iptr) \
539 if (stage >= SHOW_STACK) { \
541 SHOW_VARIABLE(iptr->dst.varindex); \
544 #define SHOW_S1_LOCAL(iptr) \
545 if (stage >= SHOW_STACK) { \
546 printf("L%d ", iptr->s1.varindex); \
549 #define SHOW_DST_LOCAL(iptr) \
550 if (stage >= SHOW_STACK) { \
551 printf("=> L%d ", iptr->dst.varindex); \
554 static void show_variable(jitdata *jd, s4 index, int stage)
560 v = &(jd->var[index]);
563 case TYPE_INT: type = 'i'; break;
564 case TYPE_LNG: type = 'l'; break;
565 case TYPE_FLT: type = 'f'; break;
566 case TYPE_DBL: type = 'd'; break;
567 case TYPE_ADR: type = 'a'; break;
571 if (v->flags & PREALLOC)
573 else if (v->flags & OUTVAR)
575 else if (index < jd->localcount)
580 printf("%c%c%d", kind, type, index);
582 if (stage >= SHOW_REGS) {
585 if (v->flags & INMEMORY)
586 printf("M%02d", v->regoff);
587 #ifdef HAS_ADDRESS_REGISTER_FILE
588 else if (v->type == TYPE_ADR)
589 printf("R%02d", v->regoff);
591 else if (IS_FLT_DBL_TYPE(v->type))
592 printf("F%02d", v->regoff);
594 #if defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
595 if (IS_2_WORD_TYPE(v->type)) {
596 # if defined(ENABLE_JIT) && defined(ENABLE_DISASSEMBLER)
597 # if defined(ENABLE_INTRP)
599 printf("%3d/%3d", GET_LOW_REG(v->regoff),
600 GET_HIGH_REG(v->regoff));
603 printf("%3s/%3s", regs[GET_LOW_REG(v->regoff)],
604 regs[GET_HIGH_REG(v->regoff)]);
606 printf("%3d/%3d", GET_LOW_REG(v->regoff),
607 GET_HIGH_REG(v->regoff));
611 #endif /* defined(SUPPORT_COMBINE_INTEGER_REGISTERS) */
613 #if defined(ENABLE_JIT) && defined(ENABLE_DISASSEMBLER)
614 # if defined(ENABLE_INTRP)
616 printf("%3d", v->regoff);
619 printf("%3s", regs[v->regoff]);
621 printf("%3d", v->regoff);
633 static void new_show_variable_array(jitdata *jd, s4 *vars, int n, int stage)
638 for (i=0; i<n; ++i) {
641 show_variable(jd, vars[i], stage);
646 void new_show_icmd(jitdata *jd, instruction *iptr, bool deadcode, int stage)
649 branch_target_t *table;
650 lookup_target_t *lookup;
651 constant_FMIref *fmiref;
655 /* get the opcode and the condition */
659 printf("%s ", icmd_names[opcode]);
661 if (stage < SHOW_PARSE)
667 /* Print the condition for conditional instructions. */
669 /* XXX print condition from flags */
671 if (iptr->flags.bits & INS_FLAG_UNRESOLVED)
672 printf("(UNRESOLVED) ");
678 case ICMD_CHECKNULL_POP:
683 case ICMD_ARRAYLENGTH:
750 /* binary/const INT */
762 case ICMD_IUSHRCONST:
765 case ICMD_LUSHRCONST:
767 SHOW_INT_CONST(iptr->sx.val.i);
771 /* ?ASTORECONST (trinary/const INT) */
772 case ICMD_IASTORECONST:
773 case ICMD_BASTORECONST:
774 case ICMD_CASTORECONST:
775 case ICMD_SASTORECONST:
778 SHOW_INT_CONST(iptr->sx.s23.s3.constval);
783 SHOW_INT_CONST(iptr->sx.val.i);
787 /* binary/const LNG */
798 SHOW_LNG_CONST(iptr->sx.val.l);
802 /* trinary/const LNG (<= pointer size) */
803 case ICMD_LASTORECONST:
806 SHOW_LNG_CONST(iptr->sx.s23.s3.constval);
811 SHOW_LNG_CONST(iptr->sx.val.l);
817 SHOW_FLT_CONST(iptr->sx.val.f);
823 SHOW_DBL_CONST(iptr->sx.val.d);
829 if (iptr->flags.bits & INS_FLAG_CLASS) {
830 SHOW_CLASSREF_OR_CLASSINFO(iptr->sx.val.c);
832 else if (iptr->sx.val.anyptr == NULL) {
836 SHOW_STRING(iptr->sx.val.stringconst);
841 case ICMD_AASTORECONST:
844 printf("%p ", (void*) iptr->sx.s23.s3.constval);
847 case ICMD_GETFIELD: /* 1 -> 1 */
848 case ICMD_PUTFIELD: /* 2 -> 0 */
849 case ICMD_PUTSTATIC: /* 1 -> 0 */
850 case ICMD_GETSTATIC: /* 0 -> 1 */
851 case ICMD_PUTSTATICCONST: /* 0 -> 0 */
852 case ICMD_PUTFIELDCONST: /* 1 -> 0 */
853 if (opcode != ICMD_GETSTATIC && opcode != ICMD_PUTSTATICCONST) {
855 if (opcode == ICMD_PUTFIELD) {
859 INSTRUCTION_GET_FIELDREF(iptr, fmiref);
862 if (opcode == ICMD_GETSTATIC || opcode == ICMD_GETFIELD) {
869 SHOW_INT_CONST(iptr->sx.val.i);
870 SHOW_DST_LOCAL(iptr);
918 SHOW_DST_LOCAL(iptr);
933 case ICMD_MULTIANEWARRAY:
934 if (stage >= SHOW_STACK) {
935 argp = iptr->sx.s23.s2.args;
936 i = iptr->s1.argcount;
938 SHOW_VARIABLE(*(argp++));
942 printf("argcount=%d ", iptr->s1.argcount);
952 case ICMD_INSTANCEOF:
957 case ICMD_INLINE_START:
958 case ICMD_INLINE_END:
962 if (stage >= SHOW_STACK) {
963 argp = iptr->sx.s23.s2.args;
964 i = iptr->s1.argcount;
966 if ((iptr->s1.argcount - 1 - i) == iptr->sx.s23.s3.bte->md->paramcount)
967 printf(" pass-through: ");
968 SHOW_VARIABLE(*(argp++));
971 printf("%s ", iptr->sx.s23.s3.bte->cname);
972 if (iptr->sx.s23.s3.bte->md->returntype.type != TYPE_VOID) {
977 case ICMD_INVOKEVIRTUAL:
978 case ICMD_INVOKESPECIAL:
979 case ICMD_INVOKESTATIC:
980 case ICMD_INVOKEINTERFACE:
981 if (stage >= SHOW_STACK) {
983 INSTRUCTION_GET_METHODDESC(iptr, md);
984 argp = iptr->sx.s23.s2.args;
985 i = iptr->s1.argcount;
987 if ((iptr->s1.argcount - 1 - i) == md->paramcount)
988 printf(" pass-through: ");
989 SHOW_VARIABLE(*(argp++));
992 INSTRUCTION_GET_METHODREF(iptr, fmiref);
993 method_methodref_print(fmiref);
994 if (fmiref->parseddesc.md->returntype.type != TYPE_VOID) {
1007 SHOW_TARGET(iptr->dst);
1017 SHOW_TARGET(iptr->dst);
1021 case ICMD_INLINE_GOTO:
1022 SHOW_TARGET(iptr->dst);
1026 SHOW_TARGET(iptr->sx.s23.s3.jsrtarget);
1031 case ICMD_IFNONNULL:
1033 SHOW_TARGET(iptr->dst);
1036 case ICMD_IF_ICMPEQ:
1037 case ICMD_IF_ICMPNE:
1038 case ICMD_IF_ICMPLT:
1039 case ICMD_IF_ICMPGE:
1040 case ICMD_IF_ICMPGT:
1041 case ICMD_IF_ICMPLE:
1043 case ICMD_IF_LCMPEQ:
1044 case ICMD_IF_LCMPNE:
1045 case ICMD_IF_LCMPLT:
1046 case ICMD_IF_LCMPGE:
1047 case ICMD_IF_LCMPGT:
1048 case ICMD_IF_LCMPLE:
1050 case ICMD_IF_FCMPEQ:
1051 case ICMD_IF_FCMPNE:
1053 case ICMD_IF_FCMPL_LT:
1054 case ICMD_IF_FCMPL_GE:
1055 case ICMD_IF_FCMPL_GT:
1056 case ICMD_IF_FCMPL_LE:
1058 case ICMD_IF_FCMPG_LT:
1059 case ICMD_IF_FCMPG_GE:
1060 case ICMD_IF_FCMPG_GT:
1061 case ICMD_IF_FCMPG_LE:
1063 case ICMD_IF_DCMPEQ:
1064 case ICMD_IF_DCMPNE:
1066 case ICMD_IF_DCMPL_LT:
1067 case ICMD_IF_DCMPL_GE:
1068 case ICMD_IF_DCMPL_GT:
1069 case ICMD_IF_DCMPL_LE:
1071 case ICMD_IF_DCMPG_LT:
1072 case ICMD_IF_DCMPG_GE:
1073 case ICMD_IF_DCMPG_GT:
1074 case ICMD_IF_DCMPG_LE:
1076 case ICMD_IF_ACMPEQ:
1077 case ICMD_IF_ACMPNE:
1080 SHOW_TARGET(iptr->dst);
1083 case ICMD_TABLESWITCH:
1085 table = iptr->dst.table;
1087 i = iptr->sx.s23.s3.tablehigh
1088 - iptr->sx.s23.s2.tablelow + 1;
1090 printf("high=%d low=%d count=%d\n", iptr->sx.s23.s3.tablehigh, iptr->sx.s23.s2.tablelow, i);
1092 printf("\t\t%d --> ", table - iptr->dst.table);
1093 if (stage >= SHOW_STACK) {
1094 printf("L%03d\n", table->block->nr);
1097 printf("insindex %d (L%03d)\n", table->insindex, BLOCK_OF(table->insindex)->nr);
1104 case ICMD_LOOKUPSWITCH:
1107 printf("count=%d, default=", iptr->sx.s23.s2.lookupcount);
1108 if (stage >= SHOW_STACK) {
1109 printf("L%03d\n", iptr->sx.s23.s3.lookupdefault.block->nr);
1112 printf("insindex %d (L%03d)\n", iptr->sx.s23.s3.lookupdefault.insindex, BLOCK_OF(iptr->sx.s23.s3.lookupdefault.insindex)->nr);
1115 lookup = iptr->dst.lookup;
1116 i = iptr->sx.s23.s2.lookupcount;
1118 printf("\t\t%d --> ", lookup->value);
1119 if (stage >= SHOW_STACK) {
1120 printf("L%03d\n", lookup->target.block->nr);
1123 printf("insindex %d (L%03d)\n", lookup->target.insindex, BLOCK_OF(lookup->target.insindex)->nr);
1145 if (stage >= SHOW_STACK) {
1146 SHOW_VARIABLE(iptr->dst.dupslots[0]);
1147 SHOW_VARIABLE(iptr->dst.dupslots[1]);
1149 SHOW_VARIABLE(iptr->dst.dupslots[2+0]);
1150 SHOW_VARIABLE(iptr->dst.dupslots[2+1]);
1155 if (stage >= SHOW_STACK) {
1156 SHOW_VARIABLE(iptr->dst.dupslots[0]);
1157 SHOW_VARIABLE(iptr->dst.dupslots[1]);
1159 SHOW_VARIABLE(iptr->dst.dupslots[2+0]);
1160 SHOW_VARIABLE(iptr->dst.dupslots[2+1]);
1161 SHOW_VARIABLE(iptr->dst.dupslots[2+2]);
1166 if (stage >= SHOW_STACK) {
1167 SHOW_VARIABLE(iptr->dst.dupslots[0]);
1168 SHOW_VARIABLE(iptr->dst.dupslots[1]);
1169 SHOW_VARIABLE(iptr->dst.dupslots[2]);
1171 SHOW_VARIABLE(iptr->dst.dupslots[3+0]);
1172 SHOW_VARIABLE(iptr->dst.dupslots[3+1]);
1173 SHOW_VARIABLE(iptr->dst.dupslots[3+2]);
1174 SHOW_VARIABLE(iptr->dst.dupslots[3+3]);
1175 SHOW_VARIABLE(iptr->dst.dupslots[3+4]);
1180 if (stage >= SHOW_STACK) {
1181 SHOW_VARIABLE(iptr->dst.dupslots[0]);
1182 SHOW_VARIABLE(iptr->dst.dupslots[1]);
1183 SHOW_VARIABLE(iptr->dst.dupslots[2]);
1185 SHOW_VARIABLE(iptr->dst.dupslots[3+0]);
1186 SHOW_VARIABLE(iptr->dst.dupslots[3+1]);
1187 SHOW_VARIABLE(iptr->dst.dupslots[3+2]);
1188 SHOW_VARIABLE(iptr->dst.dupslots[3+3]);
1193 if (stage >= SHOW_STACK) {
1194 SHOW_VARIABLE(iptr->dst.dupslots[0]);
1195 SHOW_VARIABLE(iptr->dst.dupslots[1]);
1196 SHOW_VARIABLE(iptr->dst.dupslots[2]);
1197 SHOW_VARIABLE(iptr->dst.dupslots[4]);
1199 SHOW_VARIABLE(iptr->dst.dupslots[4+0]);
1200 SHOW_VARIABLE(iptr->dst.dupslots[4+1]);
1201 SHOW_VARIABLE(iptr->dst.dupslots[4+2]);
1202 SHOW_VARIABLE(iptr->dst.dupslots[4+3]);
1203 SHOW_VARIABLE(iptr->dst.dupslots[4+4]);
1204 SHOW_VARIABLE(iptr->dst.dupslots[4+5]);
1209 if (stage >= SHOW_STACK) {
1210 SHOW_VARIABLE(iptr->dst.dupslots[0]);
1211 SHOW_VARIABLE(iptr->dst.dupslots[1]);
1213 SHOW_VARIABLE(iptr->dst.dupslots[2+0]);
1214 SHOW_VARIABLE(iptr->dst.dupslots[2+1]);
1221 #endif /* !defined(NDEBUG) */
1225 * These are local overrides for various environment variables in Emacs.
1226 * Please do not remove this and leave it at the end of the file, where
1227 * Emacs will automagically detect them.
1228 * ---------------------------------------------------------------------
1231 * indent-tabs-mode: t
1235 * vim:noexpandtab:sw=4:ts=4: