From: Keith Randall Date: Mon, 12 Jun 2023 18:26:28 +0000 (-0700) Subject: cmd/compile: use callsite as line number for argument marshaling X-Git-Tag: go1.21rc1~28 X-Git-Url: http://www.git.cypherpunks.ru/?a=commitdiff_plain;h=c643b2938143ff59d5e854489880e12b39cbfb86;p=gostls13.git cmd/compile: use callsite as line number for argument marshaling Don't use the line number of the argument itself, as that may be from arbitrarily earlier in the function. Fixes #60673 Change-Id: Ifc0a2aaae221a256be3a4b0b2e04849bae4b79d7 Reviewed-on: https://go-review.googlesource.com/c/go/+/502656 TryBot-Result: Gopher Robot Run-TryBot: Keith Randall Reviewed-by: David Chase Reviewed-by: Keith Randall --- diff --git a/src/cmd/compile/internal/ssa/expand_calls.go b/src/cmd/compile/internal/ssa/expand_calls.go index 26a944dfae..dcd8078353 100644 --- a/src/cmd/compile/internal/ssa/expand_calls.go +++ b/src/cmd/compile/internal/ssa/expand_calls.go @@ -1115,7 +1115,7 @@ func (x *expandState) rewriteArgs(v *Value, firstArg int) { } // "Dereference" of addressed (probably not-SSA-eligible) value becomes Move // TODO(register args) this will be more complicated with registers in the picture. - mem = x.rewriteDereference(v.Block, sp, a, mem, aOffset, aux.SizeOfArg(auxI), aType, a.Pos) + mem = x.rewriteDereference(v.Block, sp, a, mem, aOffset, aux.SizeOfArg(auxI), aType, v.Pos) } else { var rc registerCursor var result *[]*Value @@ -1137,7 +1137,7 @@ func (x *expandState) rewriteArgs(v *Value, firstArg int) { x.Printf("...storeArg %s, %v, %d\n", a.LongString(), aType, aOffset) } rc.init(aRegs, aux.abiInfo, result, sp) - mem = x.storeArgOrLoad(a.Pos, v.Block, a, mem, aType, aOffset, 0, rc) + mem = x.storeArgOrLoad(v.Pos, v.Block, a, mem, aType, aOffset, 0, rc) } } var preArgStore [2]*Value diff --git a/test/codegen/issue60673.go b/test/codegen/issue60673.go new file mode 100644 index 0000000000..2df031a9cf --- /dev/null +++ b/test/codegen/issue60673.go @@ -0,0 +1,18 @@ +// asmcheck + +// Copyright 2023 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. + +package codegen + +//go:noinline +func f(x int32) { +} + +func g(p *int32) { + // argument marshaling code should live at line 17, not line 15. + x := *p + // 386: `MOVL\s[A-Z]+,\s\(SP\)` + f(x) +}