aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/compile/internal/ssa/stackalloc.go
diff options
context:
space:
mode:
authorJosh Bleecher Snyder <josharian@gmail.com>2015-07-20 15:24:51 -0700
committerJosh Bleecher Snyder <josharian@gmail.com>2015-07-21 13:49:10 +0000
commit67bfd6956494173a0e2fa6b20bf61bf7b57589e6 (patch)
tree964c98a79fdc6c819cf08781d9e110e88132cc59 /src/cmd/compile/internal/ssa/stackalloc.go
parent26f135d7c1a55cb7acaec1eac20e97b0f3b2cf10 (diff)
downloadgo-67bfd6956494173a0e2fa6b20bf61bf7b57589e6.tar.xz
[dev.ssa] cmd/compile: fix stackalloc handling of zero-aligned variables
Prior to this fix, a zero-aligned variable such as a flags variable would reset n to 0. While we're here, log the stack layout so that debugging and reading the generated assembly is easier. Change-Id: I18ef83ea95b6ea877c83f2e595e14c48c9ad7d84 Reviewed-on: https://go-review.googlesource.com/12439 Reviewed-by: Keith Randall <khr@golang.org>
Diffstat (limited to 'src/cmd/compile/internal/ssa/stackalloc.go')
-rw-r--r--src/cmd/compile/internal/ssa/stackalloc.go8
1 files changed, 8 insertions, 0 deletions
diff --git a/src/cmd/compile/internal/ssa/stackalloc.go b/src/cmd/compile/internal/ssa/stackalloc.go
index 5f18acabfd..2d639bf594 100644
--- a/src/cmd/compile/internal/ssa/stackalloc.go
+++ b/src/cmd/compile/internal/ssa/stackalloc.go
@@ -20,6 +20,7 @@ func stackalloc(f *Func) {
n = v.AuxInt
}
}
+ f.Logf("stackalloc: 0-%d for callee arguments/returns\n", n)
// TODO: group variables by ptr/nonptr, size, etc. Emit ptr vars last
// so stackmap is smaller.
@@ -36,6 +37,7 @@ func stackalloc(f *Func) {
continue
}
n = align(n, v.Type.Alignment())
+ f.Logf("stackalloc: %d-%d for %v\n", n, n+v.Type.Size(), v)
loc := &LocalSlot{n}
n += v.Type.Size()
home = setloc(home, v, loc)
@@ -62,6 +64,7 @@ func stackalloc(f *Func) {
continue
}
n = align(n, v.Type.Alignment())
+ f.Logf("stackalloc: %d-%d for %v\n", n, n+v.Type.Size(), v)
loc := &LocalSlot{n}
n += v.Type.Size()
home = setloc(home, v, loc)
@@ -77,12 +80,14 @@ func stackalloc(f *Func) {
}
t := s.Typ
n = align(n, t.Alignment())
+ f.Logf("stackalloc: %d-%d for auto %v\n", n, n+t.Size(), v)
s.Offset = n
n += t.Size()
}
}
n = align(n, f.Config.PtrSize)
+ f.Logf("stackalloc: %d-%d for return address\n", n, n+f.Config.ptrSize)
n += f.Config.PtrSize // space for return address. TODO: arch-dependent
f.RegAlloc = home
f.FrameSize = n
@@ -92,5 +97,8 @@ func stackalloc(f *Func) {
// align increases n to the next multiple of a. a must be a power of 2.
func align(n int64, a int64) int64 {
+ if a == 0 {
+ return n
+ }
return (n + a - 1) &^ (a - 1)
}