]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: merge stack{1,2}.go -> stack.go
authorNodir Turakulov <nodir@google.com>
Sat, 17 Oct 2015 01:45:30 +0000 (18:45 -0700)
committerBrad Fitzpatrick <bradfitz@golang.org>
Sat, 17 Oct 2015 20:52:22 +0000 (20:52 +0000)
* rename stack1.go -> stack.go
* prepend contents of stack2.go to stack.go

Updates #12952

Change-Id: I60d409af37162a5a7596c678dfebc2cea89564ff
Reviewed-on: https://go-review.googlesource.com/16008
Reviewed-by: Austin Clements <austin@google.com>
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>

src/runtime/stack.go [moved from src/runtime/stack1.go with 87% similarity]
src/runtime/stack2.go [deleted file]

similarity index 87%
rename from src/runtime/stack1.go
rename to src/runtime/stack.go
index 2c5922ad345e24970be6ea46dc77e31d74fea196..24d37271b4d615efd8c01f63d3280eeaeb0b825a 100644 (file)
@@ -6,6 +6,107 @@ package runtime
 
 import "unsafe"
 
+/*
+Stack layout parameters.
+Included both by runtime (compiled via 6c) and linkers (compiled via gcc).
+
+The per-goroutine g->stackguard is set to point StackGuard bytes
+above the bottom of the stack.  Each function compares its stack
+pointer against g->stackguard to check for overflow.  To cut one
+instruction from the check sequence for functions with tiny frames,
+the stack is allowed to protrude StackSmall bytes below the stack
+guard.  Functions with large frames don't bother with the check and
+always call morestack.  The sequences are (for amd64, others are
+similar):
+
+       guard = g->stackguard
+       frame = function's stack frame size
+       argsize = size of function arguments (call + return)
+
+       stack frame size <= StackSmall:
+               CMPQ guard, SP
+               JHI 3(PC)
+               MOVQ m->morearg, $(argsize << 32)
+               CALL morestack(SB)
+
+       stack frame size > StackSmall but < StackBig
+               LEAQ (frame-StackSmall)(SP), R0
+               CMPQ guard, R0
+               JHI 3(PC)
+               MOVQ m->morearg, $(argsize << 32)
+               CALL morestack(SB)
+
+       stack frame size >= StackBig:
+               MOVQ m->morearg, $((argsize << 32) | frame)
+               CALL morestack(SB)
+
+The bottom StackGuard - StackSmall bytes are important: there has
+to be enough room to execute functions that refuse to check for
+stack overflow, either because they need to be adjacent to the
+actual caller's frame (deferproc) or because they handle the imminent
+stack overflow (morestack).
+
+For example, deferproc might call malloc, which does one of the
+above checks (without allocating a full frame), which might trigger
+a call to morestack.  This sequence needs to fit in the bottom
+section of the stack.  On amd64, morestack's frame is 40 bytes, and
+deferproc's frame is 56 bytes.  That fits well within the
+StackGuard - StackSmall bytes at the bottom.
+The linkers explore all possible call traces involving non-splitting
+functions to make sure that this limit cannot be violated.
+*/
+
+const (
+       // StackSystem is a number of additional bytes to add
+       // to each stack below the usual guard area for OS-specific
+       // purposes like signal handling. Used on Windows, Plan 9,
+       // and Darwin/ARM because they do not use a separate stack.
+       _StackSystem = goos_windows*512*ptrSize + goos_plan9*512 + goos_darwin*goarch_arm*1024
+
+       // The minimum size of stack used by Go code
+       _StackMin = 2048
+
+       // The minimum stack size to allocate.
+       // The hackery here rounds FixedStack0 up to a power of 2.
+       _FixedStack0 = _StackMin + _StackSystem
+       _FixedStack1 = _FixedStack0 - 1
+       _FixedStack2 = _FixedStack1 | (_FixedStack1 >> 1)
+       _FixedStack3 = _FixedStack2 | (_FixedStack2 >> 2)
+       _FixedStack4 = _FixedStack3 | (_FixedStack3 >> 4)
+       _FixedStack5 = _FixedStack4 | (_FixedStack4 >> 8)
+       _FixedStack6 = _FixedStack5 | (_FixedStack5 >> 16)
+       _FixedStack  = _FixedStack6 + 1
+
+       // Functions that need frames bigger than this use an extra
+       // instruction to do the stack split check, to avoid overflow
+       // in case SP - framesize wraps below zero.
+       // This value can be no bigger than the size of the unmapped
+       // space at zero.
+       _StackBig = 4096
+
+       // The stack guard is a pointer this many bytes above the
+       // bottom of the stack.
+       _StackGuard = 640*stackGuardMultiplier + _StackSystem
+
+       // After a stack split check the SP is allowed to be this
+       // many bytes below the stack guard.  This saves an instruction
+       // in the checking sequence for tiny frames.
+       _StackSmall = 128
+
+       // The maximum number of bytes that a chain of NOSPLIT
+       // functions can use.
+       _StackLimit = _StackGuard - _StackSystem - _StackSmall
+)
+
+// Goroutine preemption request.
+// Stored into g->stackguard0 to cause split stack check failure.
+// Must be greater than any real sp.
+// 0xfffffade in hex.
+const (
+       _StackPreempt = uintptrMask & -1314
+       _StackFork    = uintptrMask & -1234
+)
+
 const (
        // stackDebug == 0: no logging
        //            == 1: logging of per-stack operations
diff --git a/src/runtime/stack2.go b/src/runtime/stack2.go
deleted file mode 100644 (file)
index 5ec8d8d..0000000
+++ /dev/null
@@ -1,106 +0,0 @@
-// Copyright 2011 The Go Authors.  All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package runtime
-
-/*
-Stack layout parameters.
-Included both by runtime (compiled via 6c) and linkers (compiled via gcc).
-
-The per-goroutine g->stackguard is set to point StackGuard bytes
-above the bottom of the stack.  Each function compares its stack
-pointer against g->stackguard to check for overflow.  To cut one
-instruction from the check sequence for functions with tiny frames,
-the stack is allowed to protrude StackSmall bytes below the stack
-guard.  Functions with large frames don't bother with the check and
-always call morestack.  The sequences are (for amd64, others are
-similar):
-
-       guard = g->stackguard
-       frame = function's stack frame size
-       argsize = size of function arguments (call + return)
-
-       stack frame size <= StackSmall:
-               CMPQ guard, SP
-               JHI 3(PC)
-               MOVQ m->morearg, $(argsize << 32)
-               CALL morestack(SB)
-
-       stack frame size > StackSmall but < StackBig
-               LEAQ (frame-StackSmall)(SP), R0
-               CMPQ guard, R0
-               JHI 3(PC)
-               MOVQ m->morearg, $(argsize << 32)
-               CALL morestack(SB)
-
-       stack frame size >= StackBig:
-               MOVQ m->morearg, $((argsize << 32) | frame)
-               CALL morestack(SB)
-
-The bottom StackGuard - StackSmall bytes are important: there has
-to be enough room to execute functions that refuse to check for
-stack overflow, either because they need to be adjacent to the
-actual caller's frame (deferproc) or because they handle the imminent
-stack overflow (morestack).
-
-For example, deferproc might call malloc, which does one of the
-above checks (without allocating a full frame), which might trigger
-a call to morestack.  This sequence needs to fit in the bottom
-section of the stack.  On amd64, morestack's frame is 40 bytes, and
-deferproc's frame is 56 bytes.  That fits well within the
-StackGuard - StackSmall bytes at the bottom.
-The linkers explore all possible call traces involving non-splitting
-functions to make sure that this limit cannot be violated.
-*/
-
-const (
-       // StackSystem is a number of additional bytes to add
-       // to each stack below the usual guard area for OS-specific
-       // purposes like signal handling. Used on Windows, Plan 9,
-       // and Darwin/ARM because they do not use a separate stack.
-       _StackSystem = goos_windows*512*ptrSize + goos_plan9*512 + goos_darwin*goarch_arm*1024
-
-       // The minimum size of stack used by Go code
-       _StackMin = 2048
-
-       // The minimum stack size to allocate.
-       // The hackery here rounds FixedStack0 up to a power of 2.
-       _FixedStack0 = _StackMin + _StackSystem
-       _FixedStack1 = _FixedStack0 - 1
-       _FixedStack2 = _FixedStack1 | (_FixedStack1 >> 1)
-       _FixedStack3 = _FixedStack2 | (_FixedStack2 >> 2)
-       _FixedStack4 = _FixedStack3 | (_FixedStack3 >> 4)
-       _FixedStack5 = _FixedStack4 | (_FixedStack4 >> 8)
-       _FixedStack6 = _FixedStack5 | (_FixedStack5 >> 16)
-       _FixedStack  = _FixedStack6 + 1
-
-       // Functions that need frames bigger than this use an extra
-       // instruction to do the stack split check, to avoid overflow
-       // in case SP - framesize wraps below zero.
-       // This value can be no bigger than the size of the unmapped
-       // space at zero.
-       _StackBig = 4096
-
-       // The stack guard is a pointer this many bytes above the
-       // bottom of the stack.
-       _StackGuard = 640*stackGuardMultiplier + _StackSystem
-
-       // After a stack split check the SP is allowed to be this
-       // many bytes below the stack guard.  This saves an instruction
-       // in the checking sequence for tiny frames.
-       _StackSmall = 128
-
-       // The maximum number of bytes that a chain of NOSPLIT
-       // functions can use.
-       _StackLimit = _StackGuard - _StackSystem - _StackSmall
-)
-
-// Goroutine preemption request.
-// Stored into g->stackguard0 to cause split stack check failure.
-// Must be greater than any real sp.
-// 0xfffffade in hex.
-const (
-       _StackPreempt = uintptrMask & -1314
-       _StackFork    = uintptrMask & -1234
-)