p->spadj = autoffset;
if(q != P)
q->pcond = p;
+ } else {
+ // zero-byte stack adjustment.
+ // Insert a fake non-zero adjustment so that stkcheck can
+ // recognize the end of the stack-splitting prolog.
+ p = appendp(p);
+ p->as = ANOP;
+ p->spadj = -PtrSize;
+ p = appendp(p);
+ p->as = ANOP;
+ p->spadj = PtrSize;
}
deltasp = autoffset;
p->spadj = autoffset;
if(q != P)
q->pcond = p;
+ } else {
+ // zero-byte stack adjustment.
+ // Insert a fake non-zero adjustment so that stkcheck can
+ // recognize the end of the stack-splitting prolog.
+ p = appendp(p);
+ p->as = ANOP;
+ p->spadj = -PtrSize;
+ p = appendp(p);
+ p->as = ANOP;
+ p->spadj = PtrSize;
}
deltasp = autoffset;
--- /dev/null
+// run
+
+// Copyright 2012 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.
+
+// Issue 4316: the stack overflow check in the linker
+// is confused when it encounters a split-stack function
+// that needs 0 bytes of stack space.
+
+package main
+
+type Peano *Peano
+
+func makePeano(n int) *Peano {
+ if n == 0 {
+ return nil
+ }
+ p := Peano(makePeano(n - 1))
+ return &p
+}
+
+var countArg Peano
+var countResult int
+
+func countPeano() {
+ if countArg == nil {
+ countResult = 0
+ return
+ }
+ countArg = *countArg
+ countPeano()
+ countResult++
+}
+
+var s = "(())"
+var pT = 0
+
+func p() {
+ if pT >= len(s) {
+ return
+ }
+ if s[pT] == '(' {
+ pT += 1
+ p()
+ if pT < len(s) && s[pT] == ')' {
+ pT += 1
+ } else {
+ return
+ }
+ p()
+ }
+}
+
+func main() {
+ countArg = makePeano(4096)
+ countPeano()
+ if countResult != 4096 {
+ println("countResult =", countResult)
+ panic("countResult != 4096")
+ }
+
+ p()
+}