]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: expand large stack frame error messages
authorJosh Bleecher Snyder <josharian@gmail.com>
Thu, 25 Oct 2018 13:23:54 +0000 (06:23 -0700)
committerJosh Bleecher Snyder <josharian@gmail.com>
Sun, 28 Oct 2018 17:59:25 +0000 (17:59 +0000)
Change-Id: Ib9f621e380dd9a6beace27ec5ff62780012f8274
Reviewed-on: https://go-review.googlesource.com/c/144600
Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Keith Randall <khr@golang.org>
src/cmd/compile/internal/gc/main.go
src/cmd/compile/internal/gc/pgen.go
src/cmd/compile/internal/gc/subr.go

index 3d7011aafd0f2bf0c0879571576393a9edcab6e7..339e8e08cda175c107b84ead5ffebb26d24c7085 100644 (file)
@@ -689,10 +689,14 @@ func Main(archInit func(*Arch)) {
 
        // Check whether any of the functions we have compiled have gigantic stack frames.
        obj.SortSlice(largeStackFrames, func(i, j int) bool {
-               return largeStackFrames[i].Before(largeStackFrames[j])
+               return largeStackFrames[i].pos.Before(largeStackFrames[j].pos)
        })
-       for _, largePos := range largeStackFrames {
-               yyerrorl(largePos, "stack frame too large (>1GB)")
+       for _, large := range largeStackFrames {
+               if large.callee != 0 {
+                       yyerrorl(large.pos, "stack frame too large (>1GB): %d MB locals + %d MB args + %d MB callee", large.locals>>20, large.args>>20, large.callee>>20)
+               } else {
+                       yyerrorl(large.pos, "stack frame too large (>1GB): %d MB locals + %d MB args", large.locals>>20, large.args>>20)
+               }
        }
 
        if len(compilequeue) != 0 {
index e6bbf0440058dc63b07990e92f70d99c2325c9f2..01dacb783bf8639554ae156a8d10b49bf1a25e6d 100644 (file)
@@ -279,7 +279,7 @@ func compileSSA(fn *Node, worker int) {
        // Note: check arg size to fix issue 25507.
        if f.Frontend().(*ssafn).stksize >= maxStackSize || fn.Type.ArgWidth() >= maxStackSize {
                largeStackFramesMu.Lock()
-               largeStackFrames = append(largeStackFrames, fn.Pos)
+               largeStackFrames = append(largeStackFrames, largeStack{locals: f.Frontend().(*ssafn).stksize, args: fn.Type.ArgWidth(), pos: fn.Pos})
                largeStackFramesMu.Unlock()
                return
        }
@@ -294,7 +294,8 @@ func compileSSA(fn *Node, worker int) {
        // the assembler may emit inscrutable complaints about invalid instructions.
        if pp.Text.To.Offset >= maxStackSize {
                largeStackFramesMu.Lock()
-               largeStackFrames = append(largeStackFrames, fn.Pos)
+               locals := f.Frontend().(*ssafn).stksize
+               largeStackFrames = append(largeStackFrames, largeStack{locals: locals, args: fn.Type.ArgWidth(), callee: pp.Text.To.Offset - locals, pos: fn.Pos})
                largeStackFramesMu.Unlock()
                return
        }
index c92ad14475e4bca1ac048d28c1c61ff3eee77207..df3bde86eace5d835ac1f845aea8ad86166f0225 100644 (file)
@@ -28,9 +28,17 @@ type Error struct {
 
 var errors []Error
 
+// largeStack is info about a function whose stack frame is too large (rare).
+type largeStack struct {
+       locals int64
+       args   int64
+       callee int64
+       pos    src.XPos
+}
+
 var (
        largeStackFramesMu sync.Mutex // protects largeStackFrames
-       largeStackFrames   []src.XPos // positions of functions whose stack frames are too large (rare)
+       largeStackFrames   []largeStack
 )
 
 func errorexit() {