]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: don't bother compiling functions named "_"
authorKeith Randall <khr@google.com>
Tue, 22 Jan 2019 18:08:10 +0000 (10:08 -0800)
committerKeith Randall <khr@golang.org>
Tue, 26 Feb 2019 20:56:24 +0000 (20:56 +0000)
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 <khr@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Josh Bleecher Snyder <josharian@gmail.com>
src/cmd/compile/internal/gc/gsubr.go
src/cmd/compile/internal/gc/pgen.go
src/cmd/compile/internal/gc/plive.go
src/cmd/compile/internal/gc/ssa.go

index 5ad7b9a1b6fc5ec82911f76330ad5a7515ccb69f..6e9f80a89d5577d7e075d1c06bc358aa7f7f554c 100644 (file)
@@ -176,11 +176,6 @@ func (pp *Progs) settext(fn *Node) {
        ptxt := pp.Prog(obj.ATEXT)
        pp.Text = ptxt
 
-       if fn.Func.lsym == nil {
-               // func _() { }
-               return
-       }
-
        fn.Func.lsym.Func.Text = ptxt
        ptxt.From.Type = obj.TYPE_MEM
        ptxt.From.Name = obj.NAME_EXTERN
index 1dc4b5342716b501eb63051aa8f33c9bfb4ef123..6914e3c5f8844d618a0849c707b578192019f7be 100644 (file)
@@ -258,17 +258,15 @@ func compile(fn *Node) {
        // be types of stack objects. We need to do this here
        // because symbols must be allocated before the parallel
        // phase of the compiler.
-       if fn.Func.lsym != nil { // not func _(){}
-               for _, n := range fn.Func.Dcl {
-                       switch n.Class() {
-                       case PPARAM, PPARAMOUT, PAUTO:
-                               if livenessShouldTrack(n) && n.Addrtaken() {
-                                       dtypesym(n.Type)
-                                       // Also make sure we allocate a linker symbol
-                                       // for the stack object data, for the same reason.
-                                       if fn.Func.lsym.Func.StackObjects == nil {
-                                               fn.Func.lsym.Func.StackObjects = lookup(fmt.Sprintf("%s.stkobj", fn.funcname())).Linksym()
-                                       }
+       for _, n := range fn.Func.Dcl {
+               switch n.Class() {
+               case PPARAM, PPARAMOUT, PAUTO:
+                       if livenessShouldTrack(n) && n.Addrtaken() {
+                               dtypesym(n.Type)
+                               // Also make sure we allocate a linker symbol
+                               // for the stack object data, for the same reason.
+                               if fn.Func.lsym.Func.StackObjects == nil {
+                                       fn.Func.lsym.Func.StackObjects = lookup(fmt.Sprintf("%s.stkobj", fn.funcname())).Linksym()
                                }
                        }
                }
index b48a9ea87e799fae6c66b7bf6e279e5b3a6cb50f..a9a01e5c1291e8d5b58b03a23332246d4661fec4 100644 (file)
@@ -1426,26 +1426,26 @@ func liveness(e *ssafn, f *ssa.Func, pp *Progs) LivenessMap {
        }
 
        // Emit the live pointer map data structures
-       if ls := e.curfn.Func.lsym; ls != nil {
-               ls.Func.GCArgs, ls.Func.GCLocals, ls.Func.GCRegs = lv.emit()
-
-               p := pp.Prog(obj.AFUNCDATA)
-               Addrconst(&p.From, objabi.FUNCDATA_ArgsPointerMaps)
-               p.To.Type = obj.TYPE_MEM
-               p.To.Name = obj.NAME_EXTERN
-               p.To.Sym = ls.Func.GCArgs
-
-               p = pp.Prog(obj.AFUNCDATA)
-               Addrconst(&p.From, objabi.FUNCDATA_LocalsPointerMaps)
-               p.To.Type = obj.TYPE_MEM
-               p.To.Name = obj.NAME_EXTERN
-               p.To.Sym = ls.Func.GCLocals
-
-               p = pp.Prog(obj.AFUNCDATA)
-               Addrconst(&p.From, objabi.FUNCDATA_RegPointerMaps)
-               p.To.Type = obj.TYPE_MEM
-               p.To.Name = obj.NAME_EXTERN
-               p.To.Sym = ls.Func.GCRegs
-       }
+       ls := e.curfn.Func.lsym
+       ls.Func.GCArgs, ls.Func.GCLocals, ls.Func.GCRegs = lv.emit()
+
+       p := pp.Prog(obj.AFUNCDATA)
+       Addrconst(&p.From, objabi.FUNCDATA_ArgsPointerMaps)
+       p.To.Type = obj.TYPE_MEM
+       p.To.Name = obj.NAME_EXTERN
+       p.To.Sym = ls.Func.GCArgs
+
+       p = pp.Prog(obj.AFUNCDATA)
+       Addrconst(&p.From, objabi.FUNCDATA_LocalsPointerMaps)
+       p.To.Type = obj.TYPE_MEM
+       p.To.Name = obj.NAME_EXTERN
+       p.To.Sym = ls.Func.GCLocals
+
+       p = pp.Prog(obj.AFUNCDATA)
+       Addrconst(&p.From, objabi.FUNCDATA_RegPointerMaps)
+       p.To.Type = obj.TYPE_MEM
+       p.To.Name = obj.NAME_EXTERN
+       p.To.Sym = ls.Func.GCRegs
+
        return lv.livenessMap
 }
index 9d56c562d0be5b0519f46a98ee4d7e683fe7bf0a..c8befa40cdb7d02e4b56524bb6be76baada81d8d 100644 (file)
@@ -5175,10 +5175,7 @@ func genssa(f *ssa.Func, pp *Progs) {
                                }
                        case ssa.OpInlMark:
                                p := thearch.Ginsnop(s.pp)
-                               if pp.curfn.Func.lsym != nil {
-                                       // lsym is nil if the function name is "_".
-                                       pp.curfn.Func.lsym.Func.AddInlMark(p, v.AuxInt32())
-                               }
+                               pp.curfn.Func.lsym.Func.AddInlMark(p, v.AuxInt32())
                                // TODO: if matching line number, merge somehow with previous instruction?
 
                        default: