summary refs log tree commit diff stats
path: root/lib/system/gc_ms.nim
diff options
context:
space:
mode:
authorOscar Campbell <oscar@campbell.nu>2015-05-25 19:51:58 +0200
committerOscar Campbell <oscar@campbell.nu>2015-05-25 19:51:58 +0200
commitf6c12853ea996ef6307d0e5fd6738d0aaa2bd1e7 (patch)
tree1d9e468089a169fc9fd44678c19194eaa2c8a3c8 /lib/system/gc_ms.nim
parent625299e861173266d0393ffdd76e66be9cb0c34d (diff)
parent71561bef5846fbbfea1f77ecba1f9d6d7426ca43 (diff)
downloadNim-f6c12853ea996ef6307d0e5fd6738d0aaa2bd1e7.tar.gz
Merge remote-tracking branch 'upstream/devel' into devel
Diffstat (limited to 'lib/system/gc_ms.nim')
-rw-r--r--lib/system/gc_ms.nim9
1 files changed, 9 insertions, 0 deletions
diff --git a/lib/system/gc_ms.nim b/lib/system/gc_ms.nim
index e287bf5d9..a0699f46a 100644
--- a/lib/system/gc_ms.nim
+++ b/lib/system/gc_ms.nim
@@ -514,6 +514,15 @@ else:
     if c_setjmp(registers) == 0'i32: # To fill the C stack with registers.
       var max = cast[ByteAddress](gch.stackBottom)
       var sp = cast[ByteAddress](addr(registers))
+      when defined(amd64):
+        # words within the jmp_buf structure may not be properly aligned.
+        let regEnd = sp +% sizeof(registers)
+        while sp <% regEnd:
+          gcMark(gch, cast[PPointer](sp)[])
+          gcMark(gch, cast[PPointer](sp +% sizeof(pointer) div 2)[])
+          sp = sp +% sizeof(pointer)
+      # Make sure sp is word-aligned
+      sp = sp and not (sizeof(pointer) - 1)
       # loop unrolled:
       while sp <% max - 8*sizeof(pointer):
         gcMark(gch, cast[PStackSlice](sp)[0])