| // 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", |
| "runtime/asan", |
| "internal/cpu", |
| } |
| |
| // Don't insert racefuncenter/racefuncexit into the following packages. |
| // Memory accesses in the packages are either uninteresting or will cause false positives. |
| var NoRacePkgs = []string{"sync", "sync/atomic"} |