| // Copyright 2009 The Go Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style | |
| // license that can be found in the LICENSE file. | |
| package base | |
| import ( | |
| "os" | |
| ) | |
| var atExitFuncs []func() | |
| func AtExit(f func()) { | |
| atExitFuncs = append(atExitFuncs, f) | |
| } | |
| func Exit(code int) { | |
| for i := len(atExitFuncs) - 1; i >= 0; i-- { | |
| f := atExitFuncs[i] | |
| atExitFuncs = atExitFuncs[:i] | |
| f() | |
| } | |
| os.Exit(code) | |
| } | |
| // To enable tracing support (-t flag), set EnableTrace to true. | |
| const EnableTrace = false | |
| func Compiling(pkgs []string) bool { | |
| if Ctxt.Pkgpath != "" { | |
| for _, p := range pkgs { | |
| if Ctxt.Pkgpath == p { | |
| return true | |
| } | |
| } | |
| } | |
| return false | |
| } | |
| // The racewalk pass is currently handled in three parts. | |
| // | |
| // First, for flag_race, it inserts calls to racefuncenter and | |
| // racefuncexit at the start and end (respectively) of each | |
| // function. This is handled below. | |
| // | |
| // Second, during buildssa, it inserts appropriate instrumentation | |
| // calls immediately before each memory load or store. This is handled | |
| // by the (*state).instrument method in ssa.go, so here we just set | |
| // the Func.InstrumentBody flag as needed. For background on why this | |
| // is done during SSA construction rather than a separate SSA pass, | |
| // see issue #19054. | |
| // | |
| // Third we remove calls to racefuncenter and racefuncexit, for leaf | |
| // functions without instrumented operations. This is done as part of | |
| // ssa opt pass via special rule. | |
| // TODO(dvyukov): do not instrument initialization as writes: | |
| // a := make([]int, 10) | |
| // Do not instrument the following packages at all, | |
| // at best instrumentation would cause infinite recursion. | |
| var NoInstrumentPkgs = []string{ | |
| "runtime/internal/atomic", | |
| "runtime/internal/sys", | |
| "runtime/internal/math", | |
| "runtime", | |
| "runtime/race", | |
| "runtime/msan", | |
| "internal/cpu", | |
| } | |
| // Don't insert racefuncenterfp/racefuncexit into the following packages. | |
| // Memory accesses in the packages are either uninteresting or will cause false positives. | |
| var NoRacePkgs = []string{"sync", "sync/atomic"} |