1
0
mirror of https://github.com/golang/go synced 2024-11-23 07:30:05 -07:00

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 <gobot@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
Run-TryBot: Austin Clements <austin@google.com>
This commit is contained in:
Austin Clements 2023-07-07 17:01:47 -04:00
parent 83e0704c50
commit 56b3b244fd
5 changed files with 44 additions and 56 deletions

View File

@ -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"}

View File

@ -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

View File

@ -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,

View File

@ -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)
}

View File

@ -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 })