]> Cypherpunks repositories - gostls13.git/commitdiff
[dev.ssa] cmd/compile: don't Compile if Unimplemented
authorJosh Bleecher Snyder <josharian@gmail.com>
Thu, 16 Jul 2015 18:45:22 +0000 (12:45 -0600)
committerJosh Bleecher Snyder <josharian@gmail.com>
Thu, 16 Jul 2015 18:54:09 +0000 (18:54 +0000)
If we've already hit an Unimplemented, there may be important
SSA invariants that do not hold and which could cause
ssa.Compile to hang or spin.

While we're here, make detected dependency cycles stop execution.

Change-Id: Ic7d4eea659e1fe3f2c9b3e8a4eee5567494f46ad
Reviewed-on: https://go-review.googlesource.com/12310
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
src/cmd/compile/internal/gc/ssa.go
src/cmd/compile/internal/ssa/print.go

index 2ba1ddbb44aa41347b7267d10d6abfe69fec0069..96351def6e8d87ba71ef3a71aa1acd30f64a3a03 100644 (file)
@@ -108,17 +108,18 @@ func buildssa(fn *Node) (ssafn *ssa.Func, usessa bool) {
        // Link up variable uses to variable definitions
        s.linkForwardReferences()
 
-       // Main call to ssa package to compile function
-       ssa.Compile(s.f)
-
        // Calculate stats about what percentage of functions SSA handles.
        if false {
-               fmt.Printf("SSA implemented: %t\n", !e.unimplemented)
+               defer func() { fmt.Printf("SSA implemented: %t\n", !e.unimplemented) }()
        }
 
        if e.unimplemented {
                return nil, false
        }
+
+       // Main call to ssa package to compile function.
+       ssa.Compile(s.f)
+
        return s.f, usessa // TODO: return s.f, true once runtime support is in (gc maps, write barriers, etc.)
 }
 
index c8b90c6f93031c7630baff056d0bab708dcc40cc..e46590224da450d4a49ed0a935a440982895c285 100644 (file)
@@ -8,6 +8,7 @@ import (
        "bytes"
        "fmt"
        "io"
+       "os"
 )
 
 func printFunc(f *Func) {
@@ -68,16 +69,22 @@ func fprintFunc(w io.Writer, f *Func) {
                                n++
                        }
                        if m == n {
-                               fmt.Fprintln(w, "dependency cycle!")
+                               fmt.Fprintln(os.Stderr, "dependency cycle in block", b)
                                for _, v := range b.Values {
                                        if printed[v.ID] {
                                                continue
                                        }
-                                       fmt.Fprint(w, "    ")
-                                       fmt.Fprintln(w, v.LongString())
+                                       fmt.Fprintf(os.Stderr, "    %v\n", v.LongString())
                                        printed[v.ID] = true
                                        n++
                                }
+                               // Things are going to go very badly from here;
+                               // one of the optimization passes is likely to hang.
+                               // Frustratingly, panics here get swallowed by fmt,
+                               // and just we end up here again if we call Fatalf.
+                               // Use our last resort.
+                               os.Exit(1)
+                               return
                        }
                }