Skip to content

Commit f495f54

Browse files
committed
cmd/compile: don't bother compiling functions named "_"
They can't be used, so we don't need code generated for them. We just need to report errors in their bodies. The compiler currently has a bunch of special cases sprinkled about for "_" functions, because we never generate a linker symbol for them. Instead, abort compilation earlier so we never reach any of that special-case code. Fixes #29870 Change-Id: I3530c9c353deabcf75ce9072c0b740e992349ee5 Reviewed-on: https://go-review.googlesource.com/c/158845 Run-TryBot: Keith Randall <[email protected]> TryBot-Result: Gobot Gobot <[email protected]> Reviewed-by: Josh Bleecher Snyder <[email protected]>
1 parent 933e34a commit f495f54

File tree

4 files changed

+31
-41
lines changed

4 files changed

+31
-41
lines changed

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

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -176,11 +176,6 @@ func (pp *Progs) settext(fn *Node) {
176176
ptxt := pp.Prog(obj.ATEXT)
177177
pp.Text = ptxt
178178

179-
if fn.Func.lsym == nil {
180-
// func _() { }
181-
return
182-
}
183-
184179
fn.Func.lsym.Func.Text = ptxt
185180
ptxt.From.Type = obj.TYPE_MEM
186181
ptxt.From.Name = obj.NAME_EXTERN

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

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -258,17 +258,15 @@ func compile(fn *Node) {
258258
// be types of stack objects. We need to do this here
259259
// because symbols must be allocated before the parallel
260260
// phase of the compiler.
261-
if fn.Func.lsym != nil { // not func _(){}
262-
for _, n := range fn.Func.Dcl {
263-
switch n.Class() {
264-
case PPARAM, PPARAMOUT, PAUTO:
265-
if livenessShouldTrack(n) && n.Addrtaken() {
266-
dtypesym(n.Type)
267-
// Also make sure we allocate a linker symbol
268-
// for the stack object data, for the same reason.
269-
if fn.Func.lsym.Func.StackObjects == nil {
270-
fn.Func.lsym.Func.StackObjects = lookup(fmt.Sprintf("%s.stkobj", fn.funcname())).Linksym()
271-
}
261+
for _, n := range fn.Func.Dcl {
262+
switch n.Class() {
263+
case PPARAM, PPARAMOUT, PAUTO:
264+
if livenessShouldTrack(n) && n.Addrtaken() {
265+
dtypesym(n.Type)
266+
// Also make sure we allocate a linker symbol
267+
// for the stack object data, for the same reason.
268+
if fn.Func.lsym.Func.StackObjects == nil {
269+
fn.Func.lsym.Func.StackObjects = lookup(fmt.Sprintf("%s.stkobj", fn.funcname())).Linksym()
272270
}
273271
}
274272
}

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

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1426,26 +1426,26 @@ func liveness(e *ssafn, f *ssa.Func, pp *Progs) LivenessMap {
14261426
}
14271427

14281428
// Emit the live pointer map data structures
1429-
if ls := e.curfn.Func.lsym; ls != nil {
1430-
ls.Func.GCArgs, ls.Func.GCLocals, ls.Func.GCRegs = lv.emit()
1431-
1432-
p := pp.Prog(obj.AFUNCDATA)
1433-
Addrconst(&p.From, objabi.FUNCDATA_ArgsPointerMaps)
1434-
p.To.Type = obj.TYPE_MEM
1435-
p.To.Name = obj.NAME_EXTERN
1436-
p.To.Sym = ls.Func.GCArgs
1437-
1438-
p = pp.Prog(obj.AFUNCDATA)
1439-
Addrconst(&p.From, objabi.FUNCDATA_LocalsPointerMaps)
1440-
p.To.Type = obj.TYPE_MEM
1441-
p.To.Name = obj.NAME_EXTERN
1442-
p.To.Sym = ls.Func.GCLocals
1443-
1444-
p = pp.Prog(obj.AFUNCDATA)
1445-
Addrconst(&p.From, objabi.FUNCDATA_RegPointerMaps)
1446-
p.To.Type = obj.TYPE_MEM
1447-
p.To.Name = obj.NAME_EXTERN
1448-
p.To.Sym = ls.Func.GCRegs
1449-
}
1429+
ls := e.curfn.Func.lsym
1430+
ls.Func.GCArgs, ls.Func.GCLocals, ls.Func.GCRegs = lv.emit()
1431+
1432+
p := pp.Prog(obj.AFUNCDATA)
1433+
Addrconst(&p.From, objabi.FUNCDATA_ArgsPointerMaps)
1434+
p.To.Type = obj.TYPE_MEM
1435+
p.To.Name = obj.NAME_EXTERN
1436+
p.To.Sym = ls.Func.GCArgs
1437+
1438+
p = pp.Prog(obj.AFUNCDATA)
1439+
Addrconst(&p.From, objabi.FUNCDATA_LocalsPointerMaps)
1440+
p.To.Type = obj.TYPE_MEM
1441+
p.To.Name = obj.NAME_EXTERN
1442+
p.To.Sym = ls.Func.GCLocals
1443+
1444+
p = pp.Prog(obj.AFUNCDATA)
1445+
Addrconst(&p.From, objabi.FUNCDATA_RegPointerMaps)
1446+
p.To.Type = obj.TYPE_MEM
1447+
p.To.Name = obj.NAME_EXTERN
1448+
p.To.Sym = ls.Func.GCRegs
1449+
14501450
return lv.livenessMap
14511451
}

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

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5175,10 +5175,7 @@ func genssa(f *ssa.Func, pp *Progs) {
51755175
}
51765176
case ssa.OpInlMark:
51775177
p := thearch.Ginsnop(s.pp)
5178-
if pp.curfn.Func.lsym != nil {
5179-
// lsym is nil if the function name is "_".
5180-
pp.curfn.Func.lsym.Func.AddInlMark(p, v.AuxInt32())
5181-
}
5178+
pp.curfn.Func.lsym.Func.AddInlMark(p, v.AuxInt32())
51825179
// TODO: if matching line number, merge somehow with previous instruction?
51835180

51845181
default:

0 commit comments

Comments
 (0)