mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
cmd/compile/internal/gc: fix Node.copy and introduce (raw|sep)copy
Node.copy used to make a shallow copy of a node. Often, this is not correct: If a node n's Orig field pointed to itself, the copy's Orig field has to be adjusted to point to the copy. Otherwise, if n is modified later, the copy's Orig appears modified as well (because it points to n). This was fixed for one specific case with https://go-review.googlesource.com/c/go/+/136395 (issue #26855). This change instead addresses copy in general: In two cases we don't want the Orig adjustment as it causes escape analysis output to fail (not match the existing error messages). rawcopy is used in those cases. In several cases Orig is set to the copy immediately after making a copy; a new function sepcopy is used there. Updates #26855. Fixes #27765. Change-Id: Idaadeb5c4b9a027daabd46a2361348f7a93f2b00 Reviewed-on: https://go-review.googlesource.com/136540 Reviewed-by: Matthew Dempsky <mdempsky@google.com>
This commit is contained in:
parent
499fbb1a8a
commit
ce58a39fca
6 changed files with 41 additions and 33 deletions
|
|
@ -349,15 +349,13 @@ func staticcopy(l *Node, r *Node, out *[]*Node) bool {
|
|||
gdata(n, e.Expr, int(n.Type.Width))
|
||||
continue
|
||||
}
|
||||
ll := n.copy()
|
||||
ll.Orig = ll // completely separate copy
|
||||
ll := n.sepcopy()
|
||||
if staticassign(ll, e.Expr, out) {
|
||||
continue
|
||||
}
|
||||
// Requires computation, but we're
|
||||
// copying someone else's computation.
|
||||
rr := orig.copy()
|
||||
rr.Orig = rr // completely separate copy
|
||||
rr := orig.sepcopy()
|
||||
rr.Type = ll.Type
|
||||
rr.Xoffset += e.Xoffset
|
||||
setlineno(rr)
|
||||
|
|
@ -453,8 +451,7 @@ func staticassign(l *Node, r *Node, out *[]*Node) bool {
|
|||
continue
|
||||
}
|
||||
setlineno(e.Expr)
|
||||
a := n.copy()
|
||||
a.Orig = a // completely separate copy
|
||||
a := n.sepcopy()
|
||||
if !staticassign(a, e.Expr, out) {
|
||||
*out = append(*out, nod(OAS, a, e.Expr))
|
||||
}
|
||||
|
|
@ -518,8 +515,7 @@ func staticassign(l *Node, r *Node, out *[]*Node) bool {
|
|||
// Copy val directly into n.
|
||||
n.Type = val.Type
|
||||
setlineno(val)
|
||||
a := n.copy()
|
||||
a.Orig = a
|
||||
a := n.sepcopy()
|
||||
if !staticassign(a, val, out) {
|
||||
*out = append(*out, nod(OAS, a, val))
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue