func run(t *testing.T, dir, input string) bool { fmt.Printf("Input: %s\n", input) var inputs []string for _, i := range strings.Split(input, " ") { inputs = append(inputs, dir+i) } b := ssa.NewBuilder(&ssa.Context{Mode: ssa.SanityCheckFunctions, Loader: ssa.GorootLoader}) files, err := ssa.ParseFiles(b.Prog.Files, ".", inputs...) if err != nil { t.Errorf("ssa.ParseFiles(%s) failed: %s", inputs, err.Error()) return false } // Print a helpful hint if we don't make it to the end. var hint string defer func() { if hint != "" { fmt.Println("FAIL") fmt.Println(hint) } else { fmt.Println("PASS") } }() hint = fmt.Sprintf("To dump SSA representation, run:\n%% go run exp/ssa/ssadump.go -build=CFP %s\n", input) mainpkg, err := b.CreatePackage("main", files) if err != nil { t.Errorf("ssa.Builder.CreatePackage(%s) failed: %s", inputs, err.Error()) return false } b.BuildAllPackages() b = nil // discard Builder hint = fmt.Sprintf("To trace execution, run:\n%% go run exp/ssa/ssadump.go -build=C -run --interp=T %s\n", input) if exitCode := interp.Interpret(mainpkg, 0, inputs[0], []string{}); exitCode != 0 { t.Errorf("interp.Interpret(%s) exited with code %d, want zero", inputs, exitCode) return false } hint = "" // call off the hounds return true }
func main() { flag.Parse() args := flag.Args() var mode ssa.BuilderMode for _, c := range *buildFlag { switch c { case 'P': mode |= ssa.LogPackages | ssa.BuildSerially case 'F': mode |= ssa.LogFunctions | ssa.BuildSerially case 'S': mode |= ssa.LogSource | ssa.BuildSerially case 'C': mode |= ssa.SanityCheckFunctions case 'N': mode |= ssa.NaiveForm case 'G': mode |= ssa.UseGCImporter case 'L': mode |= ssa.BuildSerially default: log.Fatalf("Unknown -build option: '%c'.", c) } } var interpMode interp.Mode for _, c := range *interpFlag { switch c { case 'T': interpMode |= interp.EnableTracing case 'R': interpMode |= interp.DisableRecover default: log.Fatalf("Unknown -interp option: '%c'.", c) } } if len(args) == 0 { fmt.Fprint(os.Stderr, usage) os.Exit(1) } // Profiling support. if *cpuprofile != "" { f, err := os.Create(*cpuprofile) if err != nil { log.Fatal(err) } pprof.StartCPUProfile(f) defer pprof.StopCPUProfile() } context := &ssa.Context{ Mode: mode, Loader: ssa.GorootLoader, } b := ssa.NewBuilder(context) mainpkg, args, err := ssa.CreatePackageFromArgs(b, args) if err != nil { log.Fatal(err.Error()) } b.BuildAllPackages() b = nil // discard Builder if *runFlag { interp.Interpret(mainpkg, interpMode, mainpkg.Name(), args) } }