mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
cmd/compile: include callee args section when checking frame too large
The stack frame includes the callee args section. At the point where we were checking the frame size, that part of the frame had not been computed yet. Move the check later so we can include the callee args size. Fixes #20780 Update #25507 Change-Id: Iab97cb89b3a24f8ca19b9123ef2a111d6850c3fe Reviewed-on: https://go-review.googlesource.com/115195 Run-TryBot: Keith Randall <khr@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Josh Bleecher Snyder <josharian@gmail.com>
This commit is contained in:
parent
161874da2a
commit
06b326054d
4 changed files with 43 additions and 9 deletions
|
|
@ -265,11 +265,24 @@ func compileSSA(fn *Node, worker int) {
|
|||
return
|
||||
}
|
||||
pp := newProgs(fn, worker)
|
||||
defer pp.Free()
|
||||
genssa(f, pp)
|
||||
// Check frame size again.
|
||||
// The check above included only the space needed for local variables.
|
||||
// After genssa, the space needed includes local variables and the callee arg region.
|
||||
// We must do this check prior to calling pp.Flush.
|
||||
// If there are any oversized stack frames,
|
||||
// the assembler may emit inscrutable complaints about invalid instructions.
|
||||
if pp.Text.To.Offset >= maxStackSize {
|
||||
largeStackFramesMu.Lock()
|
||||
largeStackFrames = append(largeStackFrames, fn.Pos)
|
||||
largeStackFramesMu.Unlock()
|
||||
return
|
||||
}
|
||||
|
||||
pp.Flush() // assemble, fill in boilerplate, etc.
|
||||
// fieldtrack must be called after pp.Flush. See issue 20014.
|
||||
fieldtrack(pp.Text.From.Sym, fn.Func.FieldTrack)
|
||||
pp.Free()
|
||||
}
|
||||
|
||||
func init() {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue