[project @ 2001-01-17 12:14:30 by simonmar]
[ghc-hetmet.git] / ghc / rts / StgCRun.c
index 31bd224..be58430 100644 (file)
@@ -1,5 +1,5 @@
 /* -----------------------------------------------------------------------------
- * $Id: StgCRun.c,v 1.16 2000/04/11 16:36:54 sewardj Exp $
+ * $Id: StgCRun.c,v 1.23 2000/12/04 12:31:21 simonmar Exp $
  *
  * (c) The GHC Team, 1998-2000
  *
@@ -67,35 +67,20 @@ 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 ) {
-StgFunPtr f_old;
-            IF_DEBUG(evaluator,
-                    fprintf(stderr,"Jumping to ");
-                    printPtr((P_)f);
-                    fprintf(stderr,"\n");
-                    );
-f_old = f;
-           f = (StgFunPtr) (f)();
- if (!IS_CODE_PTR(f)) {
-fprintf ( stderr,"bad ptr given by %p %s\n", f_old, nameFromOPtr(f_old) );
-assert(IS_CODE_PTR(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
@@ -154,7 +139,7 @@ extern StgThreadReturnCode StgRun(StgFunPtr f, StgRegTable *basereg)
 #if STACK_DETAILS
    fprintf(stderr, 
            "== SB = %p   SP = %p(%p)   SU = %p   SpLim = %p(%p)\n", 
-           sb, sp, tso->sp,   su, basereg->rSpLim, tso->splim);
+           sb, sp, tso->sp,   su, basereg->rSpLim, tso->stack + RESERVED_STACK_WORDS);
 #endif
 
    if (su >= sb) goto postloop;
@@ -253,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 (
@@ -329,6 +314,7 @@ StgRun(StgFunPtr f, StgRegTable *basereg) {
    does the last paragraph above mean when it says "the top of the
    stack is used for globals"?  What globals?  --SDM
 
+   Updated info (GHC 4.08.2): not saving %i7 any more (see below).
    -------------------------------------------------------------------------- */
        
 #ifdef sparc_TARGET_ARCH
@@ -336,9 +322,11 @@ 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];
+#if 0
     register void *i7 __asm__("%i7");
     ((void **)(space))[100] = i7;
+#endif
     f();
     __asm__ volatile (
            ".align 4\n"                
@@ -355,8 +343,15 @@ StgRun(StgFunPtr f, StgRegTable *basereg) {
      * terrible.  We could do much better by coding it directly in
      * assembler.
      */
+#if 0
+    /* updated 4.08.2: we don't save %i7 in the middle of the reserved
+     * space any more, since gcc tries to save its address across the
+     * call to f(), this gets clobbered in STG land and we end up
+     * dereferencing a bogus pointer in StgReturn.
+     */
     __asm__ volatile ("ld %1,%0" 
                      : "=r" (i7) : "m" (((void **)(space))[100]));
+#endif
     return (StgThreadReturnCode)R1.i;
 }