X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Frts%2FStgCRun.c;h=23a2e137da838b281602aa28d674ff2be74d9f97;hb=4e9a8fa407e0d0287ac7e1a1efdef3380db57df2;hp=4ebfcf01ae461196a6e7ad45e281331142fbcddc;hpb=1d816bae335f4f87c721123d66087e1ea1778b16;p=ghc-hetmet.git diff --git a/ghc/rts/StgCRun.c b/ghc/rts/StgCRun.c index 4ebfcf0..23a2e13 100644 --- a/ghc/rts/StgCRun.c +++ b/ghc/rts/StgCRun.c @@ -1,5 +1,5 @@ /* ----------------------------------------------------------------------------- - * $Id: StgCRun.c,v 1.14 2000/03/08 10:58:38 simonmar Exp $ + * $Id: StgCRun.c,v 1.20 2000/08/15 14:18:43 simonmar Exp $ * * (c) The GHC Team, 1998-2000 * @@ -67,36 +67,35 @@ static jmp_buf jmp_environment; extern StgThreadReturnCode StgRun(StgFunPtr f, StgRegTable *basereg) { - jmp_buf save_buf; - /* Save jmp_environment for previous call to miniInterpret */ - memcpy((void *) jmp_environment, (void *) save_buf, sizeof(jmp_buf)); - if (setjmp(jmp_environment) == 0) { - while ( 1 ) { - IF_DEBUG(evaluator, - fprintf(stderr,"Jumping to "); - printPtr((P_)f); - fprintf(stderr,"\n"); - ); - f = (StgFunPtr) (f)(); - } - } - /* Restore jmp_environment for previous call */ - memcpy((void*) save_buf, (void*) jmp_environment, sizeof(jmp_buf)); - - return (StgThreadReturnCode)R1.i; + while (f) { + IF_DEBUG(evaluator, + fprintf(stderr,"Jumping to "); + printPtr((P_)f); + fprintf(stderr,"\n"); + ); + f = (StgFunPtr) (f)(); + } + return (StgThreadReturnCode)R1.i; } EXTFUN(StgReturn) { - longjmp(jmp_environment, 1); + return 0; } #else +#define CHECK_STACK 0 +#define STACK_DETAILS 0 + +static int enters = 0; + static void scanStackSeg ( W_* ptr, int nwords ) { W_ w; +#if CHECK_STACK int nwords0 = nwords; +#if STACK_DETAILS while (nwords > 0) { w = *ptr; if (IS_ARG_TAG(w)) { @@ -109,80 +108,104 @@ static void scanStackSeg ( W_* ptr, int nwords ) } } if (nwords < 0) fprintf(stderr, "erk: nwords < 0\n"); +#endif checkStackChunk ( ptr, ptr-nwords0 ); +#endif } - +extern StgFunPtr stg_enterStackTop; extern StgThreadReturnCode StgRun(StgFunPtr f, StgRegTable *basereg) { char* nm; while (1) { -#define STACK_DETAILS 0 - -#if STACK_DETAILS +#if CHECK_STACK { int i; - StgWord* sp = basereg->rSp; - StgWord* su = basereg->rSu; StgTSO* tso = basereg->rCurrentTSO; StgWord* sb = tso->stack + tso->stack_size; + StgWord* sp; + StgWord* su; int ws; - fprintf(stderr, "== SP = %p SU = %p\n", sp,su); + if (f == &stg_enterStackTop) { + sp = tso->sp; + su = tso->su; + } else { + sp = basereg->rSp; + su = basereg->rSu; + } + +#if STACK_DETAILS + fprintf(stderr, + "== SB = %p SP = %p(%p) SU = %p SpLim = %p(%p)\n", + sb, sp, tso->sp, su, basereg->rSpLim, tso->stack + RESERVED_STACK_WORDS); +#endif if (su >= sb) goto postloop; if (!sp || !su) goto postloop; - //printStack ( sp, sb, su); + printStack ( sp, sb, su); while (1) { ws = su - sp; switch (get_itbl((StgClosure*)su)->type) { case STOP_FRAME: scanStackSeg(sp,ws); +#if STACK_DETAILS fprintf(stderr, "S%d ",ws); fprintf(stderr, "\n"); +#endif goto postloop; case UPDATE_FRAME: scanStackSeg(sp,ws); +#if STACK_DETAILS fprintf(stderr,"U%d ",ws); +#endif sp = su + sizeofW(StgUpdateFrame); su = ((StgUpdateFrame*)su)->link; break; case SEQ_FRAME: scanStackSeg(sp,ws); +#if STACK_DETAILS fprintf(stderr,"Q%d ",ws); +#endif sp = su + sizeofW(StgSeqFrame); su = ((StgSeqFrame*)su)->link; break; case CATCH_FRAME: scanStackSeg(sp,ws); +#if STACK_DETAILS fprintf(stderr,"C%d ",ws); +#endif sp = su + sizeofW(StgCatchFrame); su = ((StgCatchFrame*)su)->link; break; default: fprintf(stderr, "?\nweird record on stack\n"); + assert(0); goto postloop; } } postloop: } -#endif - +#endif #if STACK_DETAILS fprintf(stderr,"\n"); #endif - fprintf(stderr,"-- enter: "); +#if 1 + fprintf(stderr,"-- enter %p ", f); nm = nameFromOPtr ( f ); - if (nm) - fprintf(stderr, "%s (%p)", nm, f); else - printPtr((P_)f); + if (nm) fprintf(stderr, "%s", nm); else + printPtr((P_)f); fprintf ( stderr, "\n"); +#endif #if STACK_DETAILS fprintf(stderr,"\n"); #endif + zzz: + if (enters % 1000 == 0) fprintf(stderr, "%d enters\n",enters); + enters++; f = (StgFunPtr) (f)(); if (!f) break; } @@ -215,7 +238,7 @@ EXTFUN(StgReturn) StgThreadReturnCode StgRun(StgFunPtr f, StgRegTable *basereg) { - StgChar space[ RESERVED_C_STACK_BYTES + 4*sizeof(void *) ]; + unsigned char space[ RESERVED_C_STACK_BYTES + 4*sizeof(void *) ]; StgThreadReturnCode r; __asm__ volatile ( @@ -298,7 +321,7 @@ StgRun(StgFunPtr f, StgRegTable *basereg) { StgThreadReturnCode StgRun(StgFunPtr f, StgRegTable *basereg) { - StgChar space[RESERVED_C_STACK_BYTES+sizeof(void *)]; + unsigned char space[RESERVED_C_STACK_BYTES+sizeof(void *)]; register void *i7 __asm__("%i7"); ((void **)(space))[100] = i7; f();