diff options
author | Oscar Campbell <oscar@campbell.nu> | 2015-05-25 19:51:58 +0200 |
---|---|---|
committer | Oscar Campbell <oscar@campbell.nu> | 2015-05-25 19:51:58 +0200 |
commit | f6c12853ea996ef6307d0e5fd6738d0aaa2bd1e7 (patch) | |
tree | 1d9e468089a169fc9fd44678c19194eaa2c8a3c8 /lib/system/gc_ms.nim | |
parent | 625299e861173266d0393ffdd76e66be9cb0c34d (diff) | |
parent | 71561bef5846fbbfea1f77ecba1f9d6d7426ca43 (diff) | |
download | Nim-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.nim | 9 |
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]) |