#include #include #include "cinterface.h" #include "mutlib.h" /* #include "node.h" -- already included in cinterface.h */ /* #include "runtime.h" -- already included in node.h */ /* #include "bytecode.h" -- already included in node.h via newmacros.h */ #if TRACE static char *profName(NodePtr *p) { #if PROFILE return (char *)(p[-1]); #else return ""; #endif } static char posstr[40]; static char *profPos(NodePtr *p) { UInt pos = (UInt)p[-2]; int r = pos / 10000; int c = pos % 10000; sprintf(posstr,"%d:%d",r,c); return posstr; } void prByteIns (CodePtr ip) { fprintf(stderr,"%08x :",ip); switch(*ip) { case ZAP_ARG_I1: fprintf(stderr," ZAP_ARG_I1\n") ; break; case ZAP_ARG_I2: fprintf(stderr," ZAP_ARG_I2\n") ; break; case ZAP_ARG_I3: fprintf(stderr," ZAP_ARG_I3\n") ; break; case ZAP_ARG: fprintf(stderr," ZAP_ARG %d\n",ip[1]) ; break; case ZAP_STACK_P1: fprintf(stderr," ZAP_STACK_P1 %d\n",ip[1]); break; case ZAP_STACK_P2: fprintf(stderr," ZAP_STACK_P2 %d (%d:%d)\n",(ip[2]<<8)+ip[1],ip[1],ip[2]); break; case NEEDHEAP_I32: fprintf(stderr," NEEDHEAP_I32\n"); break; case NEEDHEAP_P1: fprintf(stderr," NEEDHEAP_P1 %d\n",ip[1]); break; case NEEDHEAP_P2: fprintf(stderr," NEEDHEAP_P2 %d (%d:%d)\n",(ip[2]<<8)+ip[1],ip[1],ip[2]); break; case NEEDSTACK_I16: fprintf(stderr," NEEDSTACK_I16\n"); break; case NEEDSTACK_P1: fprintf(stderr," NEEDSTACK_P1 %d\n",ip[1]); break; case NEEDSTACK_P2: fprintf(stderr," NEEDSTACK_P2 %d (%d:%d)\n",(ip[2]<<8)+ip[1],ip[1],ip[2]); break; case JUMP: fprintf(stderr," JUMP %08x (%d:%d)\n",ip+1+(ip[2]<<8)+ip[1],ip[1],ip[2]); break; case JUMPFALSE: fprintf(stderr," JUMPFALSE %08x (%d:%d)\n",ip+1+(ip[2]<<8)+ip[1],ip[1],ip[2]); break; case NOP: fprintf(stderr," NOP \n"); break; #if 0 /* ----------------------------------- */ case MATCHCON: fprintf(stderr," MATCHCON \n"); break; case MATCHINT: fprintf(stderr," MATCHINT \n"); break; case JUMPS_T: fprintf(stderr," JUMPS_T \n"); break; case JUMPS_L: fprintf(stderr," JUMPS_L \n"); break; #endif /* ----------------------------------- */ case PUSH_CADR_N2: fprintf(stderr," PUSH_CADR_N2 %d (%d:%d)\n",ip[2]<<8+ip[1],ip[1],ip[2]); break; case PUSH_CADR_N1: fprintf(stderr," PUSH_CADR_N1 %d\n",ip[1]); break; case PUSH_CADR_P1: fprintf(stderr," PUSH_CADR_P1 %d\n",ip[1]); break; case PUSH_CADR_P2: fprintf(stderr," PUSH_CADR_P2 %d (%d:%d)\n",ip[2]<<8+ip[1],ip[1],ip[2]); break; case PUSH_CVAL_N2: fprintf(stderr," PUSH_CVAL_N2 %d (%d:%d)\n",ip[2]<<8+ip[1],ip[1],ip[2]); break; case PUSH_CVAL_N1: fprintf(stderr," PUSH_CVAL_N1 %d\n",ip[1]); break; case PUSH_CVAL_P1: fprintf(stderr," PUSH_CVAL_P1 %d\n",ip[1]); break; case PUSH_CVAL_P2: fprintf(stderr," PUSH_CVAL_P2 %d (%d:%d)\n",ip[2]<<8+ip[1],ip[1],ip[2]); break; case PUSH_INT_N2: fprintf(stderr," PUSH_INT_N2 %d (%d:%d)\n",ip[2]<<8+ip[1],ip[1],ip[2]); break; case PUSH_INT_N1: fprintf(stderr," PUSH_INT_N1 %d\n",ip[1]); break; case PUSH_INT_P1: fprintf(stderr," PUSH_INT_P1 %d\n",ip[1]); break; case PUSH_INT_P2: fprintf(stderr," PUSH_INT_P2 %d (%d:%d)\n",ip[2]<<8+ip[1],ip[1],ip[2]); break; case PUSH_ARG_I1: fprintf(stderr," PUSH_ARG_I1\n"); break; case PUSH_ARG_I2: fprintf(stderr," PUSH_ARG_I2\n"); break; case PUSH_ARG_I3: fprintf(stderr," PUSH_ARG_I3\n"); break; case PUSH_ARG: fprintf(stderr," PUSH_ARG %d\n",ip[1]); break; case PUSH_I1: fprintf(stderr," PUSH_I1\n"); break; case PUSH_P1: fprintf(stderr," PUSH_P1 %d\n",ip[1]); break; case PUSH_P2: fprintf(stderr," PUSH_P2 %d (%d:%d)\n",ip[2]<<8+ip[1],ip[1],ip[2]); break; case POP_I1: fprintf(stderr," POP_I1\n"); break; case POP_P1: fprintf(stderr," POP_P1 %d\n",ip[1]); break; case POP_P2: fprintf(stderr," POP_P2 %d (%d:%d)\n",ip[2]<<8+ip[1],ip[1],ip[2]); break; case SLIDE_P1: fprintf(stderr," SLIDE_P1 %d\n",ip[1]); break; case SLIDE_P2: fprintf(stderr," SLIDE_P2 %d (%d:%d)\n",ip[2]<<8+ip[1],ip[1],ip[2]); break; case UNPACK: fprintf(stderr," UNPACK %d\n",ip[1]); break; case SELECTOR_EVAL: fprintf(stderr," SELECTOR_EVAL\n"); break; case SELECT: fprintf(stderr," SELECT %d\n",ip[1]); break; case APPLY: fprintf(stderr," APPLY %d\n",ip[1]); break; case EVAL: fprintf(stderr," EVAL\n"); break; case RETURN: fprintf(stderr," RETURN\n"); break; case RETURN_EVAL: fprintf(stderr," RETURN_EVAL\n"); break; case HEAP_OFF_N2: fprintf(stderr," HEAP_OFF_N2 %d (%d:%d)\n",ip[2]<<8+ip[1],ip[1],ip[2]); break; case HEAP_OFF_N1: fprintf(stderr," HEAP_OFF_N1 %d\n",ip[1]); break; case HEAP_OFF_P1: fprintf(stderr," HEAP_OFF_P1 %d\n",ip[1]); break; case HEAP_OFF_P2: fprintf(stderr," HEAP_OFF_P2 %d (%d:%d)\n",ip[2]<<8+ip[1],ip[1],ip[2]); break; case HEAP_CREATE: fprintf(stderr," HEAP_CREATE\n"); break; case HEAP_SPACE: fprintf(stderr," HEAP_SPACE\n"); break; case HEAP_CADR_N2: fprintf(stderr," HEAP_CADR_N2 %d (%d:%d)\n",ip[2]<<8+ip[1],ip[1],ip[2]); break; case HEAP_CADR_N1: fprintf(stderr," HEAP_CADR_N1 %d\n",ip[1]); break; case HEAP_CADR_P1: fprintf(stderr," HEAP_CADR_P1 %d\n",ip[1]); break; case HEAP_CADR_P2: fprintf(stderr," HEAP_CADR_P2 %d (%d:%d)\n",ip[2]<<8+ip[1],ip[1],ip[2]); break; case HEAP_CVAL_N2: fprintf(stderr," HEAP_CVAL_N2 %d (%d:%d)\n",ip[2]<<8+ip[1],ip[1],ip[2]); break; case HEAP_CVAL_N1: fprintf(stderr," HEAP_CVAL_N1 %d\n",ip[1]); break; case HEAP_CVAL_IN3:fprintf(stderr," HEAP_CVAL_IN3\n"); break; case HEAP_CVAL_I3: fprintf(stderr," HEAP_CVAL_I3\n"); break; case HEAP_CVAL_I4: fprintf(stderr," HEAP_CVAL_I4\n"); break; case HEAP_CVAL_I5: fprintf(stderr," HEAP_CVAL_I5\n"); break; case HEAP_CVAL_P1: fprintf(stderr," HEAP_CVAL_P1 %d\n",ip[1]); break; case HEAP_CVAL_P2: fprintf(stderr," HEAP_CVAL_P2 %d (%d:%d)\n",ip[2]<<8+ip[1],ip[1],ip[2]); break; case HEAP_INT_N2: fprintf(stderr," HEAP_INT_N2 %d (%d:%d)\n",ip[2]<<8+ip[1],ip[1],ip[2]); break; case HEAP_INT_N1: fprintf(stderr," HEAP_INT_N1 %d\n",ip[1]); break; case HEAP_INT_P1: fprintf(stderr," HEAP_INT_P1 %d\n",ip[1]); break; case HEAP_INT_P2: fprintf(stderr," HEAP_INT_P2 %d (%d:%d)\n",ip[2]<<8+ip[1],ip[1],ip[2]); break; case HEAP_ARG: fprintf(stderr," HEAP_ARG %d\n",ip[1]); break; case HEAP_I1: fprintf(stderr," HEAP_I1\n"); break; case HEAP_I2: fprintf(stderr," HEAP_I2\n"); break; case HEAP_P1: fprintf(stderr," HEAP_P1 %d\n",ip[1]); break; case HEAP_P2: fprintf(stderr," HEAP_P2 %d (%d:%d)\n",ip[2]<<8+ip[1],ip[1],ip[2]); break; case ADD_W: fprintf(stderr," ADD_W \n"); break; case ADD_F: fprintf(stderr," ADD_F \n"); break; case ADD_D: fprintf(stderr," ADD_D \n"); break; case SUB_W: fprintf(stderr," SUB_W \n"); break; case SUB_F: fprintf(stderr," SUB_F \n"); break; case SUB_D: fprintf(stderr," SUB_D \n"); break; case MUL_W: fprintf(stderr," MUL_W \n"); break; case MUL_F: fprintf(stderr," MUL_F \n"); break; case MUL_D: fprintf(stderr," MUL_D \n"); break; case ABS_W: fprintf(stderr," ABS_W \n"); break; case ABS_F: fprintf(stderr," ABS_F \n"); break; case ABS_D: fprintf(stderr," ABS_D \n"); break; case SIGNUM_W: fprintf(stderr," SIGNUM_W \n"); break; case SIGNUM_F: fprintf(stderr," SIGNUM_F \n"); break; case SIGNUM_D: fprintf(stderr," SIGNUM_D \n"); break; case EXP_F: fprintf(stderr," EXP_F \n"); break; case EXP_D: fprintf(stderr," EXP_D \n"); break; case POW_F: fprintf(stderr," POW_F \n"); break; case POW_D: fprintf(stderr," POW_D \n"); break; case LOG_F: fprintf(stderr," LOG_F \n"); break; case LOG_D: fprintf(stderr," LOG_D \n"); break; case SQRT_F: fprintf(stderr," SQRT_F \n"); break; case SQRT_D: fprintf(stderr," SQRT_D \n"); break; case SIN_F: fprintf(stderr," SIN_F \n"); break; case SIN_D: fprintf(stderr," SIN_D \n"); break; case COS_F: fprintf(stderr," COS_F \n"); break; case COS_D: fprintf(stderr," COS_D \n"); break; case TAN_F: fprintf(stderr," TAN_F \n"); break; case TAN_D: fprintf(stderr," TAN_D \n"); break; case ASIN_F: fprintf(stderr," ASIN_F \n"); break; case ASIN_D: fprintf(stderr," ASIN_D \n"); break; case ACOS_F: fprintf(stderr," ACOS_F \n"); break; case ACOS_D: fprintf(stderr," ACOS_D \n"); break; case ATAN_F: fprintf(stderr," ATAN_F \n"); break; case ATAN_D: fprintf(stderr," ATAN_D \n"); break; case SLASH_F: fprintf(stderr," SLASH_F \n"); break; case SLASH_D: fprintf(stderr," SLASH_D \n"); break; case EQ_W: fprintf(stderr," EQ_W \n"); break; case EQ_F: fprintf(stderr," EQ_F \n"); break; case EQ_D: fprintf(stderr," EQ_D \n"); break; case NE_W: fprintf(stderr," NE_W \n"); break; case NE_F: fprintf(stderr," NE_F \n"); break; case NE_D: fprintf(stderr," NE_D \n"); break; case LT_W: fprintf(stderr," LT_W \n"); break; case LT_F: fprintf(stderr," LT_F \n"); break; case LT_D: fprintf(stderr," LT_D \n"); break; case LE_W: fprintf(stderr," LE_W \n"); break; case LE_F: fprintf(stderr," LE_F \n"); break; case LE_D: fprintf(stderr," LE_D \n"); break; case GT_W: fprintf(stderr," GT_W \n"); break; case GT_F: fprintf(stderr," GT_F \n"); break; case GT_D: fprintf(stderr," GT_D \n"); break; case GE_W: fprintf(stderr," GE_W \n"); break; case GE_F: fprintf(stderr," GE_F \n"); break; case GE_D: fprintf(stderr," GE_D \n"); break; case NEG_W: fprintf(stderr," NEG_W \n"); break; case NEG_F: fprintf(stderr," NEG_F \n"); break; case NEG_D: fprintf(stderr," NEG_D \n"); break; case QUOT: fprintf(stderr," QUOT \n"); break; case REM: fprintf(stderr," REM \n"); break; case AND: fprintf(stderr," AND \n"); break; case OR: fprintf(stderr," OR \n"); break; case NOT: fprintf(stderr," NOT \n"); break; case ORD: fprintf(stderr," ORD \n"); break; case CHR: fprintf(stderr," CHR \n"); break; case SEQ: fprintf(stderr," SEQ \n"); break; case STRING: fprintf(stderr," STRING \n"); break; case HGETC: fprintf(stderr," HGETC \n"); break; case HPUTC: fprintf(stderr," HPUTC \n"); break; case EXIT: fprintf(stderr," EXIT \n"); break; case MKIORETURN: fprintf(stderr," MKIORETURN \n"); break; /* MW */ case PRIMITIVE: ip = (CodePtr) ALIGNPTR((ip+1)); fprintf(stderr," PRIMITIVE %08x\n",*(Primitive *)ip); break; case PUSH_HEAP: fprintf(stderr," PUSH_HEAP \n"); break; default: fprintf(stderr," Unknown instruction %3d at %08x\n",*ip,ip); } } #if defined(__CYGWIN32__) || defined(__MINGW32__) jmp_buf prGraphEnv; #else sigjmp_buf prGraphEnv; #endif void (*prGraphOldSig)(); void prGraphSig() { signal(SIGSEGV,prGraphOldSig); #if defined(__CYGWIN32__) || defined(__MINGW32__) longjmp(prGraphEnv,1); #else siglongjmp(prGraphEnv,1); #endif } #ifdef PROFILE void printInfo(NodePtr nodeptr) { Info *info = (Info*)&nodeptr[1]; fprintf(stderr,"["); if(info->sinfo) fprintf(stderr,"%s %s %s,",info->sinfo->module,info->sinfo->producer,info->sinfo->constructor); else fprintf(stderr,"---,"); fprintf(stderr,"%d:%d:%d:%d, %d, %d]" ,info->binfo.parts.created,info->binfo.parts.first,info->binfo.parts.last,info->binfo.parts.used ,(int)info->rinfo,info->unique); } #endif void prGraph(NodePtr nodeptr,Int flags,Int d) { prGraphOldSig = signal(SIGSEGV,prGraphSig); #if defined(__CYGWIN32__) || defined(__MINGW32__) if(setjmp(prGraphEnv)) { #else if(sigsetjmp(prGraphEnv,0)) { #endif fprintf(stderr,"*** segmentation fault ***\n"); signal(SIGSEGV,prGraphOldSig); return; } if(nodeptr>=hpEnd) { fprintf(stderr,"???%lx>=%lx???",(UInt)nodeptr,(UInt)hpEnd); signal(SIGSEGV,prGraphOldSig); return; } if(!nodeptr) { fprintf(stderr,"< 0, *0>"); signal(SIGSEGV,prGraphOldSig); return; } if(flags & DUMP_ADDR) fprintf(stderr,"<%04lx,%06lx>",(UInt)nodeptr,(3&(Int)nodeptr?-1:(UInt)*nodeptr)); if (d) { switch (GET_LARGETAG(nodeptr)) { case CON_DATA|VAP_TAG0: case CON_PTRS|VAP_TAG0: case CON_CDATA|VAP_TAG0: case CON_WORDS|VAP_TAG0: case CON_DATA|VAP_TAG1: case CON_PTRS|VAP_TAG1: case CON_CDATA|VAP_TAG1: case CON_WORDS|VAP_TAG1: { Cinfo cinfo = GET_CINFO(nodeptr); Int size = CINFO_SIZE(cinfo); Int need = CINFO_NEED(cinfo); Finfo finfo = CINFO_FINFO(cinfo); NodePtr *constptr = FINFO_CONST(finfo); Int i,arity = FINFO_ARITY(finfo); if(need) { fprintf(stderr,"(CAP%s %2ld(%2ld)", (UInt)*nodeptr & ZAP_BIT ? "*" : "",size,need); if(size+need != arity) fprintf(stderr,"!=%ld",arity); } else { fprintf(stderr,"(VAP%s %2ld", (UInt)*nodeptr & ZAP_BIT ? "*" : "",size); } fprintf(stderr," %04lx {%s %s} ",(UInt)FINFO_CODE(finfo),profName(constptr),profPos(constptr)); #ifdef PROFILE printInfo(nodeptr); #endif for(i=0; i0) { fprintf(stderr,"\n %8lx: ",(UInt)sptr); prGraph(*sptr,flags,depth); sptr++; } fprintf(stderr,"\n======="); if(flags&DUMP_TOP) { fprintf(stderr," <-- more frames -->\n\n"); signal(SIGSEGV,prGraphOldSig); return; } } fprintf(stderr,"\n\n"); signal(SIGSEGV,prGraphOldSig); } #endif