]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/6g: fix stack zeroing on native client
authorRuss Cox <rsc@golang.org>
Thu, 5 Jun 2014 20:40:23 +0000 (16:40 -0400)
committerRuss Cox <rsc@golang.org>
Thu, 5 Jun 2014 20:40:23 +0000 (16:40 -0400)
I am not sure what the rounding here was
trying to do, but it was skipping the first
pointer on native client.

The code above the rounding already checks
that xoffset is widthptr-aligned, so the rnd
was a no-op everywhere but on Native Client.
And on Native Client it was wrong.

Perhaps it was supposed to be rounding down,
not up, but zerorange handles the extra 32 bits
correctly, so the rnd does not seem to be necessary
at all.

This wouldn't be worth doing for Go 1.3 except
that it can affect code on the playground.

Fixes #8155.

LGTM=r, iant
R=golang-codereviews, r, iant
CC=dvyukov, golang-codereviews, khr
https://golang.org/cl/108740047

src/cmd/6g/ggen.c
test/fixedbugs/issue8155.go [new file with mode: 0644]

index 3d27fb2ab9d137d946639fbe480bb7925b9262a9..c385798f2e275a7bf3594a7dfcf92f03b565ec4b 100644 (file)
@@ -47,7 +47,7 @@ defframe(Prog *ptxt)
 
                if(lo != hi && n->xoffset + n->type->width >= lo - 2*widthreg) {
                        // merge with range we already have
-                       lo = rnd(n->xoffset, widthreg);
+                       lo = n->xoffset;
                        continue;
                }
                // zero old range
diff --git a/test/fixedbugs/issue8155.go b/test/fixedbugs/issue8155.go
new file mode 100644 (file)
index 0000000..c611f6c
--- /dev/null
@@ -0,0 +1,48 @@
+// run
+
+// Copyright 2014 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 8155.
+// Alignment of stack prologue zeroing was wrong on 64-bit Native Client
+// (because of 32-bit pointers).
+
+package main
+
+import "runtime"
+
+func bad(b bool) uintptr {
+       var p **int
+       var x1 uintptr
+       x1 = 1
+       if b {
+               var x [11]*int
+               p = &x[0]
+       }
+       if b {
+               var x [1]*int
+               p = &x[0]
+       }
+       runtime.GC()
+       if p != nil {
+               x1 = uintptr(**p)
+       }
+       return x1
+}
+
+func poison() uintptr {
+       runtime.GC()
+       var x [20]uintptr
+       var s uintptr
+       for i := range x {
+               x[i] = uintptr(i+1)
+               s += x[i]
+       }
+       return s
+}
+
+func main() {
+       poison()
+       bad(false)
+}