mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
runtime: add page tracer
This change adds a new GODEBUG flag called pagetrace that writes a low-overhead trace of how pages of memory are managed by the Go runtime. The page tracer is kept behind a GOEXPERIMENT flag due to a potential security risk for setuid binaries. Change-Id: I6f4a2447d02693c25214400846a5d2832ad6e5c0 Reviewed-on: https://go-review.googlesource.com/c/go/+/444157 Reviewed-by: Austin Clements <austin@google.com> Reviewed-by: David Chase <drchase@google.com> Run-TryBot: Michael Knyszek <mknyszek@google.com> TryBot-Result: Gopher Robot <gobot@golang.org>
This commit is contained in:
parent
0613418c98
commit
e4435cb844
51 changed files with 636 additions and 29 deletions
|
|
@ -612,16 +612,39 @@ const (
|
|||
_GoidCacheBatch = 16
|
||||
)
|
||||
|
||||
// cpuinit extracts the environment variable GODEBUG from the environment on
|
||||
// Unix-like operating systems and calls internal/cpu.Initialize.
|
||||
func cpuinit() {
|
||||
const prefix = "GODEBUG="
|
||||
var env string
|
||||
|
||||
// cpuinit sets up CPU feature flags and calls internal/cpu.Initialize. env should be the complete
|
||||
// value of the GODEBUG environment variable.
|
||||
func cpuinit(env string) {
|
||||
switch GOOS {
|
||||
case "aix", "darwin", "ios", "dragonfly", "freebsd", "netbsd", "openbsd", "illumos", "solaris", "linux":
|
||||
cpu.DebugOptions = true
|
||||
}
|
||||
cpu.Initialize(env)
|
||||
|
||||
// Support cpu feature variables are used in code generated by the compiler
|
||||
// to guard execution of instructions that can not be assumed to be always supported.
|
||||
switch GOARCH {
|
||||
case "386", "amd64":
|
||||
x86HasPOPCNT = cpu.X86.HasPOPCNT
|
||||
x86HasSSE41 = cpu.X86.HasSSE41
|
||||
x86HasFMA = cpu.X86.HasFMA
|
||||
|
||||
case "arm":
|
||||
armHasVFPv4 = cpu.ARM.HasVFPv4
|
||||
|
||||
case "arm64":
|
||||
arm64HasATOMICS = cpu.ARM64.HasATOMICS
|
||||
}
|
||||
}
|
||||
|
||||
// getGodebugEarly extracts the environment variable GODEBUG from the environment on
|
||||
// Unix-like operating systems and returns it. This function exists to extract GODEBUG
|
||||
// early before much of the runtime is initialized.
|
||||
func getGodebugEarly() string {
|
||||
const prefix = "GODEBUG="
|
||||
var env string
|
||||
switch GOOS {
|
||||
case "aix", "darwin", "ios", "dragonfly", "freebsd", "netbsd", "openbsd", "illumos", "solaris", "linux":
|
||||
// Similar to goenv_unix but extracts the environment value for
|
||||
// GODEBUG directly.
|
||||
// TODO(moehrmann): remove when general goenvs() can be called before cpuinit()
|
||||
|
|
@ -640,23 +663,7 @@ func cpuinit() {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
cpu.Initialize(env)
|
||||
|
||||
// Support cpu feature variables are used in code generated by the compiler
|
||||
// to guard execution of instructions that can not be assumed to be always supported.
|
||||
switch GOARCH {
|
||||
case "386", "amd64":
|
||||
x86HasPOPCNT = cpu.X86.HasPOPCNT
|
||||
x86HasSSE41 = cpu.X86.HasSSE41
|
||||
x86HasFMA = cpu.X86.HasFMA
|
||||
|
||||
case "arm":
|
||||
armHasVFPv4 = cpu.ARM.HasVFPv4
|
||||
|
||||
case "arm64":
|
||||
arm64HasATOMICS = cpu.ARM64.HasATOMICS
|
||||
}
|
||||
return env
|
||||
}
|
||||
|
||||
// The bootstrap sequence is:
|
||||
|
|
@ -703,9 +710,11 @@ func schedinit() {
|
|||
moduledataverify()
|
||||
stackinit()
|
||||
mallocinit()
|
||||
cpuinit() // must run before alginit
|
||||
alginit() // maps, hash, fastrand must not be used before this call
|
||||
fastrandinit() // must run before mcommoninit
|
||||
godebug := getGodebugEarly()
|
||||
initPageTrace(godebug) // must run after mallocinit but before anything allocates
|
||||
cpuinit(godebug) // must run before alginit
|
||||
alginit() // maps, hash, fastrand must not be used before this call
|
||||
fastrandinit() // must run before mcommoninit
|
||||
mcommoninit(gp.m, -1)
|
||||
modulesinit() // provides activeModules
|
||||
typelinksinit() // uses maps, activeModules
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue