add PIC relocations for x86_64, and use a simpler hack in place of x86_64_high_symbol()
[ghc-hetmet.git] / rts / Interpreter.c
index 6663445..77f3058 100644 (file)
@@ -224,7 +224,7 @@ interpretBCO (Capability* cap)
     //         +---------------+
     //       
     else if (Sp[0] == (W_)&stg_apply_interp_info) {
-       obj = (StgClosure *)Sp[1];
+       obj = UNTAG_CLOSURE((StgClosure *)Sp[1]);
        Sp += 2;
        goto run_BCO_fun;
     }
@@ -244,6 +244,7 @@ eval:
     obj = (StgClosure*)Sp[0]; Sp++;
 
 eval_obj:
+    obj = UNTAG_CLOSURE(obj);
     INTERP_TICK(it_total_evals);
 
     IF_DEBUG(interpreter,
@@ -327,7 +328,7 @@ eval_obj:
            Sp[i] = (W_)ap->payload[i];
        }
 
-       obj = (StgClosure*)ap->fun;
+       obj = UNTAG_CLOSURE((StgClosure*)ap->fun);
        ASSERT(get_itbl(obj)->type == BCO);
        goto run_BCO_fun;
     }
@@ -531,7 +532,7 @@ do_apply:
            pap = (StgPAP *)obj;
 
            // we only cope with PAPs whose function is a BCO
-           if (get_itbl(pap->fun)->type != BCO) {
+           if (get_itbl(UNTAG_CLOSURE(pap->fun))->type != BCO) {
                goto defer_apply_to_sched;
            }
 
@@ -556,7 +557,7 @@ do_apply:
                for (i = 0; i < pap->n_args; i++) {
                    Sp[i] = (W_)pap->payload[i];
                }
-               obj = pap->fun;
+               obj = UNTAG_CLOSURE(pap->fun);
                goto run_BCO_fun;
            } 
            else if (arity == n) {
@@ -564,7 +565,7 @@ do_apply:
                for (i = 0; i < pap->n_args; i++) {
                    Sp[i] = (W_)pap->payload[i];
                }
-               obj = pap->fun;
+               obj = UNTAG_CLOSURE(pap->fun);
                goto run_BCO_fun;
            } 
            else /* arity > n */ {
@@ -846,15 +847,20 @@ run_BCO:
                   // in a reasonable state for the GC and so that
                   // execution of this BCO can continue when we resume
                   ioAction = (StgClosure *) deRefStablePtr (rts_breakpoint_io_action);
-                  Sp -= 8;
-                  Sp[7] = (W_)obj;   
-                  Sp[6] = (W_)&stg_apply_interp_info;
+                  Sp -= 9;
+                  Sp[8] = (W_)obj;   
+                  Sp[7] = (W_)&stg_apply_interp_info;
+                  Sp[6] = (W_)&stg_noforceIO_info;     // see [unreg] below
                   Sp[5] = (W_)new_aps;                 // the AP_STACK
                   Sp[4] = (W_)BCO_PTR(arg3_freeVars);  // the info about local vars of the breakpoint
                   Sp[3] = (W_)False_closure;            // True <=> a breakpoint
                   Sp[2] = (W_)&stg_ap_pppv_info;
                   Sp[1] = (W_)ioAction;                // apply the IO action to its two arguments above
                   Sp[0] = (W_)&stg_enter_info;         // get ready to run the IO action
+                  // Note [unreg]: in unregisterised mode, the return
+                  // convention for IO is different.  The
+                  // stg_noForceIO_info stack frame is necessary to
+                  // account for this difference.
 
                   // set the flag in the TSO to say that we are now
                   // stopping at a breakpoint so that when we resume
@@ -1048,6 +1054,17 @@ run_BCO:
            goto nextInsn;
        }
 
+       case bci_ALLOC_AP_NOUPD: {
+           StgAP* ap; 
+           int n_payload = BCO_NEXT;
+           ap = (StgAP*)allocate(AP_sizeW(n_payload));
+           Sp[-1] = (W_)ap;
+           ap->n_args = n_payload;
+           SET_HDR(ap, &stg_AP_NOUPD_info, CCS_SYSTEM/*ToDo*/)
+           Sp --;
+           goto nextInsn;
+       }
+
        case bci_ALLOC_PAP: {
            StgPAP* pap; 
            int arity = BCO_NEXT;
@@ -1369,7 +1386,7 @@ run_BCO:
            // Errors
        default: 
            barf("interpretBCO: unknown or unimplemented opcode %d",
-                 (int)BCO_NEXT);
+                 (int)(bci & 0xFF));
 
        } /* switch on opcode */
     }