Skip to content

Commit fc08a19

Browse files
committed
cmd/compile: move Used from gc.Node to gc.Name
Node.Used was written to from the backend concurrently with reads of Node.Class for the same ONAME Nodes. I do not know why it was not failing consistently under the race detector, but it is a race. This is likely also a problem with Node.HasVal and Node.HasOpt. They will be handled in a separate CL. Fix Used by moving it to gc.Name and making it a separate bool. There was one non-Name use of Used, marking OLABELs as used. That is no longer needed, now that goto and label checking happens early in the front end. Leave the getters and setters in place, to ease changing the representation in the future (or changing to an interface!). Updates #20144 Change-Id: I9bec7c6d33dcb129a4cfa9d338462ea33087f9f7 Reviewed-on: https://go-review.googlesource.com/42015 Run-TryBot: Josh Bleecher Snyder <[email protected]> TryBot-Result: Gobot Gobot <[email protected]> Reviewed-by: Matthew Dempsky <[email protected]>
1 parent 94d540a commit fc08a19

File tree

15 files changed

+85
-75
lines changed

15 files changed

+85
-75
lines changed

src/cmd/compile/internal/gc/closure.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -398,7 +398,7 @@ func transformclosure(xfunc *Node) {
398398
addr := newname(lookup("&" + v.Sym.Name))
399399
addr.Type = types.NewPtr(v.Type)
400400
addr.SetClass(PAUTO)
401-
addr.SetUsed(true)
401+
addr.Name.SetUsed(true)
402402
addr.Name.Curfn = xfunc
403403
xfunc.Func.Dcl = append(xfunc.Func.Dcl, addr)
404404
v.Name.Param.Heapaddr = addr
@@ -622,7 +622,7 @@ func makepartialcall(fn *Node, t0 *types.Type, meth *types.Sym) *Node {
622622
}
623623
ptr := newname(lookup("rcvr"))
624624
ptr.SetClass(PAUTO)
625-
ptr.SetUsed(true)
625+
ptr.Name.SetUsed(true)
626626
ptr.Name.Curfn = xfunc
627627
xfunc.Func.Dcl = append(xfunc.Func.Dcl, ptr)
628628
var body []*Node

src/cmd/compile/internal/gc/esc.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1443,7 +1443,7 @@ func (e *EscState) initEscRetval(call *Node, fntype *types.Type) {
14431443
ret.SetClass(PAUTO)
14441444
ret.Name.Curfn = Curfn
14451445
e.nodeEscState(ret).Loopdepth = e.loopdepth
1446-
ret.SetUsed(true)
1446+
ret.Name.SetUsed(true)
14471447
ret.Pos = call.Pos
14481448
cE.Retval.Append(ret)
14491449
}

src/cmd/compile/internal/gc/fmt.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -520,11 +520,11 @@ func (n *Node) jconv(s fmt.State, flag FmtFlag) {
520520
}
521521

522522
if c == 0 && n.HasCall() {
523-
fmt.Fprintf(s, " hascall")
523+
fmt.Fprint(s, " hascall")
524524
}
525525

526-
if c == 0 && n.Used() {
527-
fmt.Fprintf(s, " used(%v)", n.Used())
526+
if c == 0 && n.Name != nil && n.Name.Used() {
527+
fmt.Fprint(s, " used")
528528
}
529529
}
530530

src/cmd/compile/internal/gc/gen.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,13 +71,13 @@ func tempnamel(pos src.XPos, curfn *Node, nn *Node, t *types.Type) {
7171
func temp(t *types.Type) *Node {
7272
var n Node
7373
tempnamel(lineno, Curfn, &n, t)
74-
asNode(n.Sym.Def).SetUsed(true)
74+
asNode(n.Sym.Def).Name.SetUsed(true)
7575
return n.Orig
7676
}
7777

7878
func tempAt(pos src.XPos, curfn *Node, t *types.Type) *Node {
7979
var n Node
8080
tempnamel(pos, curfn, &n, t)
81-
asNode(n.Sym.Def).SetUsed(true)
81+
asNode(n.Sym.Def).Name.SetUsed(true)
8282
return n.Orig
8383
}

src/cmd/compile/internal/gc/inl.go

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -745,7 +745,6 @@ func mkinlcall1(n *Node, fn *Node, isddd bool) *Node {
745745
body := subst.list(fn.Func.Inl)
746746

747747
lab := nod(OLABEL, retlabel, nil)
748-
lab.SetUsed(true) // avoid 'not used' when function doesn't have return
749748
body = append(body, lab)
750749

751750
typecheckslice(body, Etop)
@@ -817,7 +816,7 @@ func inlvar(var_ *Node) *Node {
817816
n := newname(var_.Sym)
818817
n.Type = var_.Type
819818
n.SetClass(PAUTO)
820-
n.SetUsed(true)
819+
n.Name.SetUsed(true)
821820
n.Name.Curfn = Curfn // the calling function, not the called one
822821
n.SetAddrtaken(var_.Addrtaken())
823822

@@ -830,7 +829,7 @@ func retvar(t *types.Field, i int) *Node {
830829
n := newname(lookupN("~r", i))
831830
n.Type = t.Type
832831
n.SetClass(PAUTO)
833-
n.SetUsed(true)
832+
n.Name.SetUsed(true)
834833
n.Name.Curfn = Curfn // the calling function, not the called one
835834
Curfn.Func.Dcl = append(Curfn.Func.Dcl, n)
836835
return n
@@ -842,7 +841,7 @@ func argvar(t *types.Type, i int) *Node {
842841
n := newname(lookupN("~arg", i))
843842
n.Type = t.Elem()
844843
n.SetClass(PAUTO)
845-
n.SetUsed(true)
844+
n.Name.SetUsed(true)
846845
n.Name.Curfn = Curfn // the calling function, not the called one
847846
Curfn.Func.Dcl = append(Curfn.Func.Dcl, n)
848847
return n

src/cmd/compile/internal/gc/main.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1046,7 +1046,7 @@ func clearImports() {
10461046
// leave s->block set to cause redeclaration
10471047
// errors if a conflicting top-level name is
10481048
// introduced by a different file.
1049-
if !asNode(s.Def).Used() && nsyntaxerrors == 0 {
1049+
if !asNode(s.Def).Name.Used() && nsyntaxerrors == 0 {
10501050
pkgnotused(asNode(s.Def).Pos, asNode(s.Def).Name.Pkg.Path, s.Name)
10511051
}
10521052
s.Def = nil
@@ -1056,9 +1056,9 @@ func clearImports() {
10561056
if IsAlias(s) {
10571057
// throw away top-level name left over
10581058
// from previous import . "x"
1059-
if asNode(s.Def).Name != nil && asNode(s.Def).Name.Pack != nil && !asNode(s.Def).Name.Pack.Used() && nsyntaxerrors == 0 {
1059+
if asNode(s.Def).Name != nil && asNode(s.Def).Name.Pack != nil && !asNode(s.Def).Name.Pack.Name.Used() && nsyntaxerrors == 0 {
10601060
pkgnotused(asNode(s.Def).Name.Pack.Pos, asNode(s.Def).Name.Pack.Name.Pkg.Path, "")
1061-
asNode(s.Def).Name.Pack.SetUsed(true)
1061+
asNode(s.Def).Name.Pack.Name.SetUsed(true)
10621062
}
10631063

10641064
s.Def = nil

src/cmd/compile/internal/gc/noder.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -449,7 +449,7 @@ func (p *noder) expr(expr syntax.Expr) *Node {
449449
// parser.new_dotname
450450
obj := p.expr(expr.X)
451451
if obj.Op == OPACK {
452-
obj.SetUsed(true)
452+
obj.Name.SetUsed(true)
453453
return oldname(restrictlookup(expr.Sel.Value, obj.Name.Pkg))
454454
}
455455
return p.setlineno(expr, nodSym(OXDOT, obj, p.name(expr.Sel)))
@@ -611,7 +611,7 @@ func (p *noder) packname(expr syntax.Expr) *types.Sym {
611611
case *syntax.Name:
612612
name := p.name(expr)
613613
if n := oldname(name); n.Name != nil && n.Name.Pack != nil {
614-
n.Name.Pack.SetUsed(true)
614+
n.Name.Pack.Name.SetUsed(true)
615615
}
616616
return name
617617
case *syntax.SelectorExpr:
@@ -621,7 +621,7 @@ func (p *noder) packname(expr syntax.Expr) *types.Sym {
621621
yyerror("%v is not a package", name)
622622
pkg = localpkg
623623
} else {
624-
asNode(name.Def).SetUsed(true)
624+
asNode(name.Def).Name.SetUsed(true)
625625
pkg = asNode(name.Def).Name.Pkg
626626
}
627627
return restrictlookup(expr.Sel.Value, pkg)
@@ -1125,7 +1125,7 @@ func (p *noder) pragma(pos src.Pos, text string) syntax.Pragma {
11251125
func mkname(sym *types.Sym) *Node {
11261126
n := oldname(sym)
11271127
if n.Name != nil && n.Name.Pack != nil {
1128-
n.Name.Pack.SetUsed(true)
1128+
n.Name.Pack.Name.SetUsed(true)
11291129
}
11301130
return n
11311131
}

src/cmd/compile/internal/gc/pgen.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -80,8 +80,8 @@ func cmpstackvarlt(a, b *Node) bool {
8080
return a.Xoffset < b.Xoffset
8181
}
8282

83-
if a.Used() != b.Used() {
84-
return a.Used()
83+
if a.Name.Used() != b.Name.Used() {
84+
return a.Name.Used()
8585
}
8686

8787
ap := types.Haspointers(a.Type)
@@ -118,13 +118,13 @@ func (s *ssafn) AllocFrame(f *ssa.Func) {
118118
// Mark the PAUTO's unused.
119119
for _, ln := range fn.Dcl {
120120
if ln.Class() == PAUTO {
121-
ln.SetUsed(false)
121+
ln.Name.SetUsed(false)
122122
}
123123
}
124124

125125
for _, l := range f.RegAlloc {
126126
if ls, ok := l.(ssa.LocalSlot); ok {
127-
ls.N.(*Node).SetUsed(true)
127+
ls.N.(*Node).Name.SetUsed(true)
128128
}
129129
}
130130

@@ -136,10 +136,10 @@ func (s *ssafn) AllocFrame(f *ssa.Func) {
136136
n := a.Node.(*Node)
137137
// Don't modify nodfp; it is a global.
138138
if n != nodfp {
139-
n.SetUsed(true)
139+
n.Name.SetUsed(true)
140140
}
141141
case *ssa.AutoSymbol:
142-
a.Node.(*Node).SetUsed(true)
142+
a.Node.(*Node).Name.SetUsed(true)
143143
}
144144

145145
if !scratchUsed {
@@ -159,7 +159,7 @@ func (s *ssafn) AllocFrame(f *ssa.Func) {
159159
if n.Op != ONAME || n.Class() != PAUTO {
160160
continue
161161
}
162-
if !n.Used() {
162+
if !n.Name.Used() {
163163
fn.Dcl = fn.Dcl[:i]
164164
break
165165
}
@@ -308,7 +308,7 @@ func debuginfo(fnsym *obj.LSym, curfn interface{}) []*dwarf.Var {
308308

309309
switch n.Class() {
310310
case PAUTO:
311-
if !n.Used() {
311+
if !n.Name.Used() {
312312
Fatalf("debuginfo unused node (AllocFrame should truncate fn.Func.Dcl)")
313313
}
314314
name = obj.NAME_AUTO

src/cmd/compile/internal/gc/pgen_test.go

Lines changed: 47 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,19 @@ func typeWithPointers() *types.Type {
2525
return t
2626
}
2727

28+
func markUsed(n *Node) *Node {
29+
n.Name.SetUsed(true)
30+
return n
31+
}
32+
33+
func markNeedZero(n *Node) *Node {
34+
n.Name.SetNeedzero(true)
35+
return n
36+
}
37+
2838
func nodeWithClass(n Node, c Class) *Node {
2939
n.SetClass(c)
40+
n.Name = new(Name)
3041
return &n
3142
}
3243

@@ -72,13 +83,13 @@ func TestCmpstackvar(t *testing.T) {
7283
true,
7384
},
7485
{
75-
nodeWithClass(Node{flags: nodeUsed}, PAUTO),
86+
markUsed(nodeWithClass(Node{}, PAUTO)),
7687
nodeWithClass(Node{}, PAUTO),
7788
true,
7889
},
7990
{
8091
nodeWithClass(Node{}, PAUTO),
81-
nodeWithClass(Node{flags: nodeUsed}, PAUTO),
92+
markUsed(nodeWithClass(Node{}, PAUTO)),
8293
false,
8394
},
8495
{
@@ -92,13 +103,13 @@ func TestCmpstackvar(t *testing.T) {
92103
true,
93104
},
94105
{
95-
nodeWithClass(Node{Type: &types.Type{}, Name: &Name{flags: nameNeedzero}}, PAUTO),
106+
markNeedZero(nodeWithClass(Node{Type: &types.Type{}}, PAUTO)),
96107
nodeWithClass(Node{Type: &types.Type{}, Name: &Name{}}, PAUTO),
97108
true,
98109
},
99110
{
100111
nodeWithClass(Node{Type: &types.Type{}, Name: &Name{}}, PAUTO),
101-
nodeWithClass(Node{Type: &types.Type{}, Name: &Name{flags: nameNeedzero}}, PAUTO),
112+
markNeedZero(nodeWithClass(Node{Type: &types.Type{}}, PAUTO)),
102113
false,
103114
},
104115
{
@@ -112,18 +123,18 @@ func TestCmpstackvar(t *testing.T) {
112123
true,
113124
},
114125
{
115-
nodeWithClass(Node{Type: &types.Type{}, Name: &Name{}, Sym: &types.Sym{Name: "abc"}}, PAUTO),
116-
nodeWithClass(Node{Type: &types.Type{}, Name: &Name{}, Sym: &types.Sym{Name: "xyz"}}, PAUTO),
126+
nodeWithClass(Node{Type: &types.Type{}, Sym: &types.Sym{Name: "abc"}}, PAUTO),
127+
nodeWithClass(Node{Type: &types.Type{}, Sym: &types.Sym{Name: "xyz"}}, PAUTO),
117128
true,
118129
},
119130
{
120-
nodeWithClass(Node{Type: &types.Type{}, Name: &Name{}, Sym: &types.Sym{Name: "abc"}}, PAUTO),
121-
nodeWithClass(Node{Type: &types.Type{}, Name: &Name{}, Sym: &types.Sym{Name: "abc"}}, PAUTO),
131+
nodeWithClass(Node{Type: &types.Type{}, Sym: &types.Sym{Name: "abc"}}, PAUTO),
132+
nodeWithClass(Node{Type: &types.Type{}, Sym: &types.Sym{Name: "abc"}}, PAUTO),
122133
false,
123134
},
124135
{
125-
nodeWithClass(Node{Type: &types.Type{}, Name: &Name{}, Sym: &types.Sym{Name: "xyz"}}, PAUTO),
126-
nodeWithClass(Node{Type: &types.Type{}, Name: &Name{}, Sym: &types.Sym{Name: "abc"}}, PAUTO),
136+
nodeWithClass(Node{Type: &types.Type{}, Sym: &types.Sym{Name: "xyz"}}, PAUTO),
137+
nodeWithClass(Node{Type: &types.Type{}, Sym: &types.Sym{Name: "abc"}}, PAUTO),
127138
false,
128139
},
129140
}
@@ -141,34 +152,34 @@ func TestCmpstackvar(t *testing.T) {
141152

142153
func TestStackvarSort(t *testing.T) {
143154
inp := []*Node{
144-
nodeWithClass(Node{Type: &types.Type{}, Name: &Name{}, Sym: &types.Sym{}}, PFUNC),
145-
nodeWithClass(Node{Type: &types.Type{}, Name: &Name{}, Sym: &types.Sym{}}, PAUTO),
146-
nodeWithClass(Node{Xoffset: 0, Type: &types.Type{}, Name: &Name{}, Sym: &types.Sym{}}, PFUNC),
147-
nodeWithClass(Node{Xoffset: 10, Type: &types.Type{}, Name: &Name{}, Sym: &types.Sym{}}, PFUNC),
148-
nodeWithClass(Node{Xoffset: 20, Type: &types.Type{}, Name: &Name{}, Sym: &types.Sym{}}, PFUNC),
149-
nodeWithClass(Node{flags: nodeUsed, Type: &types.Type{}, Name: &Name{}, Sym: &types.Sym{}}, PAUTO),
150-
nodeWithClass(Node{Type: typeWithoutPointers(), Name: &Name{}, Sym: &types.Sym{}}, PAUTO),
151-
nodeWithClass(Node{Type: &types.Type{}, Name: &Name{}, Sym: &types.Sym{}}, PAUTO),
152-
nodeWithClass(Node{Type: &types.Type{}, Name: &Name{flags: nameNeedzero}, Sym: &types.Sym{}}, PAUTO),
153-
nodeWithClass(Node{Type: &types.Type{Width: 1}, Name: &Name{}, Sym: &types.Sym{}}, PAUTO),
154-
nodeWithClass(Node{Type: &types.Type{Width: 2}, Name: &Name{}, Sym: &types.Sym{}}, PAUTO),
155-
nodeWithClass(Node{Type: &types.Type{}, Name: &Name{}, Sym: &types.Sym{Name: "abc"}}, PAUTO),
156-
nodeWithClass(Node{Type: &types.Type{}, Name: &Name{}, Sym: &types.Sym{Name: "xyz"}}, PAUTO),
155+
nodeWithClass(Node{Type: &types.Type{}, Sym: &types.Sym{}}, PFUNC),
156+
nodeWithClass(Node{Type: &types.Type{}, Sym: &types.Sym{}}, PAUTO),
157+
nodeWithClass(Node{Xoffset: 0, Type: &types.Type{}, Sym: &types.Sym{}}, PFUNC),
158+
nodeWithClass(Node{Xoffset: 10, Type: &types.Type{}, Sym: &types.Sym{}}, PFUNC),
159+
nodeWithClass(Node{Xoffset: 20, Type: &types.Type{}, Sym: &types.Sym{}}, PFUNC),
160+
markUsed(nodeWithClass(Node{Type: &types.Type{}, Sym: &types.Sym{}}, PAUTO)),
161+
nodeWithClass(Node{Type: typeWithoutPointers(), Sym: &types.Sym{}}, PAUTO),
162+
nodeWithClass(Node{Type: &types.Type{}, Sym: &types.Sym{}}, PAUTO),
163+
markNeedZero(nodeWithClass(Node{Type: &types.Type{}, Sym: &types.Sym{}}, PAUTO)),
164+
nodeWithClass(Node{Type: &types.Type{Width: 1}, Sym: &types.Sym{}}, PAUTO),
165+
nodeWithClass(Node{Type: &types.Type{Width: 2}, Sym: &types.Sym{}}, PAUTO),
166+
nodeWithClass(Node{Type: &types.Type{}, Sym: &types.Sym{Name: "abc"}}, PAUTO),
167+
nodeWithClass(Node{Type: &types.Type{}, Sym: &types.Sym{Name: "xyz"}}, PAUTO),
157168
}
158169
want := []*Node{
159-
nodeWithClass(Node{Type: &types.Type{}, Name: &Name{}, Sym: &types.Sym{}}, PFUNC),
160-
nodeWithClass(Node{Xoffset: 0, Type: &types.Type{}, Name: &Name{}, Sym: &types.Sym{}}, PFUNC),
161-
nodeWithClass(Node{Xoffset: 10, Type: &types.Type{}, Name: &Name{}, Sym: &types.Sym{}}, PFUNC),
162-
nodeWithClass(Node{Xoffset: 20, Type: &types.Type{}, Name: &Name{}, Sym: &types.Sym{}}, PFUNC),
163-
nodeWithClass(Node{flags: nodeUsed, Type: &types.Type{}, Name: &Name{}, Sym: &types.Sym{}}, PAUTO),
164-
nodeWithClass(Node{Type: &types.Type{}, Name: &Name{flags: nameNeedzero}, Sym: &types.Sym{}}, PAUTO),
165-
nodeWithClass(Node{Type: &types.Type{Width: 2}, Name: &Name{}, Sym: &types.Sym{}}, PAUTO),
166-
nodeWithClass(Node{Type: &types.Type{Width: 1}, Name: &Name{}, Sym: &types.Sym{}}, PAUTO),
167-
nodeWithClass(Node{Type: &types.Type{}, Name: &Name{}, Sym: &types.Sym{}}, PAUTO),
168-
nodeWithClass(Node{Type: &types.Type{}, Name: &Name{}, Sym: &types.Sym{}}, PAUTO),
169-
nodeWithClass(Node{Type: &types.Type{}, Name: &Name{}, Sym: &types.Sym{Name: "abc"}}, PAUTO),
170-
nodeWithClass(Node{Type: &types.Type{}, Name: &Name{}, Sym: &types.Sym{Name: "xyz"}}, PAUTO),
171-
nodeWithClass(Node{Type: typeWithoutPointers(), Name: &Name{}, Sym: &types.Sym{}}, PAUTO),
170+
nodeWithClass(Node{Type: &types.Type{}, Sym: &types.Sym{}}, PFUNC),
171+
nodeWithClass(Node{Xoffset: 0, Type: &types.Type{}, Sym: &types.Sym{}}, PFUNC),
172+
nodeWithClass(Node{Xoffset: 10, Type: &types.Type{}, Sym: &types.Sym{}}, PFUNC),
173+
nodeWithClass(Node{Xoffset: 20, Type: &types.Type{}, Sym: &types.Sym{}}, PFUNC),
174+
markUsed(nodeWithClass(Node{Type: &types.Type{}, Sym: &types.Sym{}}, PAUTO)),
175+
markNeedZero(nodeWithClass(Node{Type: &types.Type{}, Sym: &types.Sym{}}, PAUTO)),
176+
nodeWithClass(Node{Type: &types.Type{Width: 2}, Sym: &types.Sym{}}, PAUTO),
177+
nodeWithClass(Node{Type: &types.Type{Width: 1}, Sym: &types.Sym{}}, PAUTO),
178+
nodeWithClass(Node{Type: &types.Type{}, Sym: &types.Sym{}}, PAUTO),
179+
nodeWithClass(Node{Type: &types.Type{}, Sym: &types.Sym{}}, PAUTO),
180+
nodeWithClass(Node{Type: &types.Type{}, Sym: &types.Sym{Name: "abc"}}, PAUTO),
181+
nodeWithClass(Node{Type: &types.Type{}, Sym: &types.Sym{Name: "xyz"}}, PAUTO),
182+
nodeWithClass(Node{Type: typeWithoutPointers(), Sym: &types.Sym{}}, PAUTO),
172183
}
173184
// haspointers updates Type.Haspointers as a side effect, so
174185
// exercise this function on all inputs so that reflect.DeepEqual

src/cmd/compile/internal/gc/plive.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -250,7 +250,7 @@ func (lv *Liveness) valueEffects(v *ssa.Value) (pos int32, effect liveEffect) {
250250
// variable" ICEs (issue 19632).
251251
switch v.Op {
252252
case ssa.OpVarDef, ssa.OpVarKill, ssa.OpVarLive, ssa.OpKeepAlive:
253-
if !n.Used() {
253+
if !n.Name.Used() {
254254
return -1, 0
255255
}
256256
}

src/cmd/compile/internal/gc/ssa.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4964,7 +4964,7 @@ func (e *ssafn) namedAuto(name string, typ ssa.Type, pos src.XPos) ssa.GCNode {
49644964
n.Orig = n
49654965

49664966
s.Def = asTypesNode(n)
4967-
asNode(s.Def).SetUsed(true)
4967+
asNode(s.Def).Name.SetUsed(true)
49684968
n.Sym = s
49694969
n.Type = t
49704970
n.SetClass(PAUTO)

0 commit comments

Comments
 (0)