Commit fe91006a authored by Russ Cox's avatar Russ Cox

runtime: give nosplit functions 32 more bytes of headroom

The Go calling convention uses more stack space than C.
On 64-bit systems we've been right up against the limit
(128 bytes, so only 16 words) and doing awful things to
our source code to work around it. Instead of continuing
to do awful things, raise the limit to 160 bytes.
I am prepared to raise the limit to 192 bytes if necessary,
but I think this will be enough.

Should fix current link-time stack overflow errors on
        - nacl/arm
        - netbsd/amd64
        - openbsd/amd64
        - solaris/amd64
        - windows/amd64

TBR=r
CC=golang-codereviews, iant
https://golang.org/cl/131450043
parent 9a5654ab
...@@ -94,7 +94,7 @@ enum { ...@@ -94,7 +94,7 @@ enum {
// After a stack split check the SP is allowed to be this // After a stack split check the SP is allowed to be this
// many bytes below the stack guard. This saves an instruction // many bytes below the stack guard. This saves an instruction
// in the checking sequence for tiny frames. // in the checking sequence for tiny frames.
StackSmall = 128, StackSmall = 96,
// The maximum number of bytes that a chain of NOSPLIT // The maximum number of bytes that a chain of NOSPLIT
// functions can use. // functions can use.
......
...@@ -15,7 +15,8 @@ import ( ...@@ -15,7 +15,8 @@ import (
// See stack.h. // See stack.h.
const ( const (
StackGuard = 256 StackGuard = 256
StackLimit = 128 StackSmall = 96
StackLimit = StackGuard - StackSmall
) )
// Test stack split logic by calling functions of every frame size // Test stack split logic by calling functions of every frame size
......
...@@ -242,7 +242,7 @@ TestCases: ...@@ -242,7 +242,7 @@ TestCases:
if line == "" { if line == "" {
continue continue
} }
for _, subline := range strings.Split(line, ";") { for i, subline := range strings.Split(line, ";") {
subline = strings.TrimSpace(subline) subline = strings.TrimSpace(subline)
if subline == "" { if subline == "" {
continue continue
...@@ -255,6 +255,14 @@ TestCases: ...@@ -255,6 +255,14 @@ TestCases:
} }
name := m[1] name := m[1]
size, _ := strconv.Atoi(m[2]) size, _ := strconv.Atoi(m[2])
// CL 131450043 raised the limit from 128 to 160.
// Instead of rewriting the test cases above, adjust
// the first stack frame to use up the extra 32 bytes.
if i == 0 {
size += 32
}
if goarch == "amd64" && size%8 == 4 { if goarch == "amd64" && size%8 == 4 {
continue TestCases continue TestCases
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment