rts: Handle SMALL_MUT_ARR_PTRS in checkClosure
[ghc.git] / rts / StgStartup.cmm
index 3a80e45..571e063 100644 (file)
@@ -62,24 +62,12 @@ INFO_TABLE_RET(stg_stop_thread, STOP_FRAME,
        be an info table on top of the stack).
     */
 
-    /*
-       Here we setup the stack unwinding annotation necessary to allow
-       debuggers to find their way back to the C stack.
-
-       This is a bit fiddly as we assume the layout of the stack prepared
-       for us by StgRun. Note that in most cases StgRun is written in assembler
-       and therefore has no associated unwind information. For this reason we
-       need to identify the platform stack pointer and return address values for
-       the StgRun's caller.
-     */
-#ifdef x86_64_HOST_ARCH
-    // offset of 8 in MachSp value due to return address
-    unwind MachSp = MachSp + RESERVED_C_STACK_BYTES + STG_RUN_STACK_FRAME_SIZE + 8,
-           UnwindReturnReg = W_[MachSp + RESERVED_C_STACK_BYTES + STG_RUN_STACK_FRAME_SIZE];
+    // See Note [Unwinding foreign exports on x86-64].
+#if defined(x86_64_HOST_ARCH)
+    unwind UnwindReturnReg = STG_RUN_JMP;
 #else
     // FIXME: Fill in for other platforms
-    unwind MachSp = return,
-           UnwindReturnReg = return;
+    unwind UnwindReturnReg = return;
 #endif
 
     Sp = Sp + SIZEOF_StgStopFrame - WDS(2);
@@ -127,6 +115,9 @@ stg_returnToSched /* no args: explicit stack layout */
 // current thread.  This is used for switching from compiled execution to the
 // interpreter, where calling threadPaused() on every switch would be too
 // expensive.
+//
+// See Note [avoiding threadPaused] in Interpreter.c
+//
 stg_returnToSchedNotPaused /* no args: explicit stack layout */
 {
   SAVE_THREAD_STATE();
@@ -178,3 +169,9 @@ INFO_TABLE_RET(stg_forceIO, RET_SMALL, P_ info_ptr)
 {
     ENTER(ret);
 }
+
+/* Called when compiled with -falignment-sanitisation on alignment failure */
+stg_badAlignment_entry
+{
+  foreign "C" barf();
+}