From: Austin Clements Date: Fri, 7 Jul 2023 21:01:47 +0000 (-0400) Subject: cmd/internal/objabi,cmd/compile: move NoInstrumentPkgs and NoRacePkgs to PkgSpecials X-Git-Tag: go1.22rc1~1147 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=56b3b244fdd7a50fcd9ffb20d7cfdbfae3af81f0;p=gostls13.git cmd/internal/objabi,cmd/compile: move NoInstrumentPkgs and NoRacePkgs to PkgSpecials This consolidates the NoInstrumentPkgs and NoRacePkgs lists into the objabi.LookupPkgSpecial mechanism. Change-Id: I411654afdd690fb01c412e7e8b57ddfbe85415e3 Reviewed-on: https://go-review.googlesource.com/c/go/+/521702 TryBot-Result: Gopher Robot Reviewed-by: Matthew Dempsky Run-TryBot: Austin Clements --- diff --git a/src/cmd/compile/internal/base/base.go b/src/cmd/compile/internal/base/base.go index 841241efb1..ee3772c5ca 100644 --- a/src/cmd/compile/internal/base/base.go +++ b/src/cmd/compile/internal/base/base.go @@ -219,44 +219,3 @@ func AdjustStartingHeap(requestedHeapGoal uint64) { forEachGC(adjustFunc) } - -func Compiling(pkgs []string) bool { - if Ctxt.Pkgpath != "" { - for _, p := range pkgs { - if Ctxt.Pkgpath == p { - return true - } - } - } - - return false -} - -// Do not instrument the following packages at all, -// at best instrumentation would cause infinite recursion. -var NoInstrumentPkgs = []string{ - "runtime/internal/atomic", - "runtime/internal/math", - "runtime/internal/sys", - "runtime/internal/syscall", - "runtime", - "runtime/race", - "runtime/msan", - "runtime/asan", - "internal/cpu", - "internal/abi", - // We omit bytealg even though it's imported by runtime because it also - // backs a lot of package bytes. Currently we don't have a way to omit race - // instrumentation when used from the runtime while keeping race - // instrumentation when used from user code. Somehow this doesn't seem to - // cause problems, though we may be skating on thin ice. See #61204. - //"internal/bytealg", - "internal/coverage/rtcov", - "internal/godebugs", - "internal/goexperiment", - "internal/goos", -} - -// 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"} diff --git a/src/cmd/compile/internal/gc/main.go b/src/cmd/compile/internal/gc/main.go index f38438b7b3..05f0340d39 100644 --- a/src/cmd/compile/internal/gc/main.go +++ b/src/cmd/compile/internal/gc/main.go @@ -151,7 +151,7 @@ func Main(archInit func(*ssagen.ArchInfo)) { symABIs.ReadSymABIs(base.Flag.SymABIs) } - if base.Compiling(base.NoInstrumentPkgs) { + if objabi.LookupPkgSpecial(base.Ctxt.Pkgpath).NoInstrument { base.Flag.Race = false base.Flag.MSan = false base.Flag.ASan = false diff --git a/src/cmd/compile/internal/types/type.go b/src/cmd/compile/internal/types/type.go index bd63f651a5..696e8a5bc1 100644 --- a/src/cmd/compile/internal/types/type.go +++ b/src/cmd/compile/internal/types/type.go @@ -6,6 +6,7 @@ package types import ( "cmd/compile/internal/base" + "cmd/internal/objabi" "cmd/internal/src" "fmt" "internal/types/errors" @@ -1862,23 +1863,13 @@ func ReflectSymName(s *Sym) string { // IsNoInstrumentPkg reports whether p is a package that // should not be instrumented. func IsNoInstrumentPkg(p *Pkg) bool { - for _, np := range base.NoInstrumentPkgs { - if p.Path == np { - return true - } - } - return false + return objabi.LookupPkgSpecial(p.Path).NoInstrument } // IsNoRacePkg reports whether p is a package that // should not be race instrumented. func IsNoRacePkg(p *Pkg) bool { - for _, np := range base.NoRacePkgs { - if p.Path == np { - return true - } - } - return false + return objabi.LookupPkgSpecial(p.Path).NoRaceFunc } // ReceiverBaseType returns the underlying type, if any, diff --git a/src/cmd/compile/internal/walk/race.go b/src/cmd/compile/internal/walk/race.go index 6384e16270..972c878b30 100644 --- a/src/cmd/compile/internal/walk/race.go +++ b/src/cmd/compile/internal/walk/race.go @@ -8,6 +8,7 @@ import ( "cmd/compile/internal/base" "cmd/compile/internal/ir" "cmd/compile/internal/types" + "cmd/internal/objabi" "cmd/internal/src" ) @@ -36,7 +37,7 @@ func instrument(fn *ir.Func) { return } - if !base.Flag.Race || !base.Compiling(base.NoRacePkgs) { + if !base.Flag.Race || !objabi.LookupPkgSpecial(base.Ctxt.Pkgpath).NoRaceFunc { fn.SetInstrumentBody(true) } diff --git a/src/cmd/internal/objabi/pkgspecial.go b/src/cmd/internal/objabi/pkgspecial.go index 144110b755..9bf07153a4 100644 --- a/src/cmd/internal/objabi/pkgspecial.go +++ b/src/cmd/internal/objabi/pkgspecial.go @@ -22,6 +22,17 @@ type PkgSpecial struct { // set for additional packages. Runtime bool + // NoInstrument indicates this package should not receive sanitizer + // instrumentation. In many of these, instrumentation could cause infinite + // recursion. This is all runtime packages, plus those that support the + // sanitizers. + NoInstrument bool + + // NoRaceFunc indicates functions in this package should not get + // racefuncenter/racefuncexit instrumentation Memory accesses in these + // packages are either uninteresting or will cause false positives. + NoRaceFunc bool + // AllowAsmABI indicates that assembly in this package is allowed to use ABI // selectors in symbol names. Generally this is needed for packages that // interact closely with the runtime package or have performance-critical @@ -47,6 +58,22 @@ var runtimePkgs = []string{ "internal/goos", } +// extraNoInstrumentPkgs is the set of packages in addition to runtimePkgs that +// should have NoInstrument set. +var extraNoInstrumentPkgs = []string{ + "runtime/race", + "runtime/msan", + "runtime/asan", + // We omit bytealg even though it's imported by runtime because it also + // backs a lot of package bytes. Currently we don't have a way to omit race + // instrumentation when used from the runtime while keeping race + // instrumentation when used from user code. Somehow this doesn't seem to + // cause problems, though we may be skating on thin ice. See #61204. + "-internal/bytealg", +} + +var noRaceFuncPkgs = []string{"sync", "sync/atomic"} + var allowAsmABIPkgs = []string{ "runtime", "reflect", @@ -74,7 +101,17 @@ func LookupPkgSpecial(pkgPath string) PkgSpecial { pkgSpecials[elt] = s } for _, pkg := range runtimePkgs { - set(pkg, func(ps *PkgSpecial) { ps.Runtime = true }) + set(pkg, func(ps *PkgSpecial) { ps.Runtime = true; ps.NoInstrument = true }) + } + for _, pkg := range extraNoInstrumentPkgs { + if pkg[0] == '-' { + set(pkg[1:], func(ps *PkgSpecial) { ps.NoInstrument = false }) + } else { + set(pkg, func(ps *PkgSpecial) { ps.NoInstrument = true }) + } + } + for _, pkg := range noRaceFuncPkgs { + set(pkg, func(ps *PkgSpecial) { ps.NoRaceFunc = true }) } for _, pkg := range allowAsmABIPkgs { set(pkg, func(ps *PkgSpecial) { ps.AllowAsmABI = true })