]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: skip empty init function in fninit
authorCuong Manh Le <cuong.manhle.vn@gmail.com>
Sun, 13 Oct 2019 16:06:29 +0000 (23:06 +0700)
committerMatthew Dempsky <mdempsky@google.com>
Fri, 18 Oct 2019 12:04:04 +0000 (12:04 +0000)
Fixes #34869

Change-Id: I21bc60b9a5d1204dade1cceed6cddccf5b537b0e
Reviewed-on: https://go-review.googlesource.com/c/go/+/200958
Run-TryBot: Cuong Manh Le <cuong.manhle.vn@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
src/cmd/compile/internal/gc/init.go
src/cmd/compile/internal/gc/typecheck.go

index bb894152c5211360389d7309545144e2d74aac01..03e475e85a0c1b652ac4562f34d62e0f7dea35c7 100644 (file)
@@ -73,6 +73,14 @@ func fninit(n []*Node) {
        // Record user init functions.
        for i := 0; i < renameinitgen; i++ {
                s := lookupN("init.", i)
+               fn := asNode(s.Def).Name.Defn
+               // Skip init functions with empty bodies.
+               // noder.go doesn't allow external init functions, and
+               // order.go has already removed any OEMPTY nodes, so
+               // checking Len() == 0 is sufficient here.
+               if fn.Nbody.Len() == 0 {
+                       continue
+               }
                fns = append(fns, s.Linksym())
        }
 
index 6067454a3c328292001ee8cdb50572726fe51319..d2ad2f04f010d5a6d57c612431bd728d6807d704 100644 (file)
@@ -3812,6 +3812,33 @@ func checkreturn(fn *Node) {
 
 func deadcode(fn *Node) {
        deadcodeslice(fn.Nbody)
+       deadcodefn(fn)
+}
+
+func deadcodefn(fn *Node) {
+       if fn.Nbody.Len() == 0 {
+               return
+       }
+
+       for _, n := range fn.Nbody.Slice() {
+               if n.Ninit.Len() > 0 {
+                       return
+               }
+               switch n.Op {
+               case OIF:
+                       if !Isconst(n.Left, CTBOOL) || n.Nbody.Len() > 0 || n.Rlist.Len() > 0 {
+                               return
+                       }
+               case OFOR:
+                       if !Isconst(n.Left, CTBOOL) || n.Left.Bool() {
+                               return
+                       }
+               default:
+                       return
+               }
+       }
+
+       fn.Nbody.Set([]*Node{nod(OEMPTY, nil, nil)})
 }
 
 func deadcodeslice(nn Nodes) {