mirror of
https://github.com/golang/go
synced 2024-10-14 03:43:28 +00:00
runtime: break out system-specific constants into package sys
runtime/internal/sys will hold system-, architecture- and config- specific constants. Updates #11647 Change-Id: I6db29c312556087a42e8d2bdd9af40d157c56b54 Reviewed-on: https://go-review.googlesource.com/16817 Reviewed-by: Russ Cox <rsc@golang.org>
This commit is contained in:
parent
b5a0c67fcc
commit
432cb66f16
2
.gitignore
vendored
2
.gitignore
vendored
|
@ -29,7 +29,7 @@ src/cmd/cgo/zdefaultcc.go
|
||||||
src/cmd/go/zdefaultcc.go
|
src/cmd/go/zdefaultcc.go
|
||||||
src/cmd/internal/obj/zbootstrap.go
|
src/cmd/internal/obj/zbootstrap.go
|
||||||
src/go/doc/headscan
|
src/go/doc/headscan
|
||||||
src/runtime/zversion.go
|
src/runtime/internal/sys/zversion.go
|
||||||
src/unicode/maketables
|
src/unicode/maketables
|
||||||
src/*.*/
|
src/*.*/
|
||||||
test/pass.out
|
test/pass.out
|
||||||
|
|
|
@ -31,7 +31,7 @@ import (
|
||||||
|
|
||||||
// Do not instrument the following packages at all,
|
// Do not instrument the following packages at all,
|
||||||
// at best instrumentation would cause infinite recursion.
|
// at best instrumentation would cause infinite recursion.
|
||||||
var omit_pkgs = []string{"runtime/internal/atomic", "runtime", "runtime/race", "runtime/msan"}
|
var omit_pkgs = []string{"runtime/internal/atomic", "runtime/internal/sys", "runtime", "runtime/race", "runtime/msan"}
|
||||||
|
|
||||||
// Only insert racefuncenter/racefuncexit into the following packages.
|
// Only insert racefuncenter/racefuncexit into the following packages.
|
||||||
// Memory accesses in the packages are either uninteresting or will cause false positives.
|
// Memory accesses in the packages are either uninteresting or will cause false positives.
|
||||||
|
|
2
src/cmd/dist/build.go
vendored
2
src/cmd/dist/build.go
vendored
|
@ -463,7 +463,7 @@ var deptab = []struct {
|
||||||
{"cmd/go", []string{
|
{"cmd/go", []string{
|
||||||
"zdefaultcc.go",
|
"zdefaultcc.go",
|
||||||
}},
|
}},
|
||||||
{"runtime", []string{
|
{"runtime/internal/sys", []string{
|
||||||
"zversion.go",
|
"zversion.go",
|
||||||
}},
|
}},
|
||||||
}
|
}
|
||||||
|
|
22
src/cmd/dist/buildruntime.go
vendored
22
src/cmd/dist/buildruntime.go
vendored
|
@ -17,23 +17,23 @@ import (
|
||||||
// mkzversion writes zversion.go:
|
// mkzversion writes zversion.go:
|
||||||
//
|
//
|
||||||
// package runtime
|
// package runtime
|
||||||
// const defaultGoroot = <goroot>
|
// const DefaultGoroot = <goroot>
|
||||||
// const theVersion = <version>
|
// const TheVersion = <version>
|
||||||
// const goexperiment = <goexperiment>
|
// const Goexperiment = <goexperiment>
|
||||||
// const stackGuardMultiplier = <multiplier value>
|
// const StackGuardMultiplier = <multiplier value>
|
||||||
// const buildVersion = <build version>
|
// const BuildVersion = <build version>
|
||||||
//
|
//
|
||||||
func mkzversion(dir, file string) {
|
func mkzversion(dir, file string) {
|
||||||
out := fmt.Sprintf(
|
out := fmt.Sprintf(
|
||||||
"// auto generated by go tool dist\n"+
|
"// auto generated by go tool dist\n"+
|
||||||
"\n"+
|
"\n"+
|
||||||
"package runtime\n"+
|
"package sys\n"+
|
||||||
"\n"+
|
"\n"+
|
||||||
"const defaultGoroot = `%s`\n"+
|
"const DefaultGoroot = `%s`\n"+
|
||||||
"const theVersion = `%s`\n"+
|
"const TheVersion = `%s`\n"+
|
||||||
"const goexperiment = `%s`\n"+
|
"const Goexperiment = `%s`\n"+
|
||||||
"const stackGuardMultiplier = %d\n\n"+
|
"const StackGuardMultiplier = %d\n\n"+
|
||||||
"var buildVersion = theVersion\n", goroot_final, findgoversion(), os.Getenv("GOEXPERIMENT"), stackGuardMultiplier())
|
"var BuildVersion = TheVersion\n", goroot_final, findgoversion(), os.Getenv("GOEXPERIMENT"), stackGuardMultiplier())
|
||||||
|
|
||||||
writefile(out, file, writeSkipSame)
|
writefile(out, file, writeSkipSame)
|
||||||
}
|
}
|
||||||
|
|
103
src/cmd/dist/deps.go
vendored
103
src/cmd/dist/deps.go
vendored
|
@ -3,56 +3,57 @@
|
||||||
package main
|
package main
|
||||||
|
|
||||||
var builddeps = map[string][]string{
|
var builddeps = map[string][]string{
|
||||||
"bufio": {"bytes", "errors", "io", "runtime", "runtime/internal/atomic", "sync", "sync/atomic", "unicode", "unicode/utf8"},
|
"bufio": {"bytes", "errors", "io", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "sync", "sync/atomic", "unicode", "unicode/utf8"},
|
||||||
"bytes": {"errors", "io", "runtime", "runtime/internal/atomic", "sync", "sync/atomic", "unicode", "unicode/utf8"},
|
"bytes": {"errors", "io", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "sync", "sync/atomic", "unicode", "unicode/utf8"},
|
||||||
"container/heap": {"runtime", "runtime/internal/atomic", "sort"},
|
"container/heap": {"runtime", "runtime/internal/atomic", "runtime/internal/sys", "sort"},
|
||||||
"crypto": {"errors", "hash", "io", "math", "runtime", "runtime/internal/atomic", "strconv", "sync", "sync/atomic", "unicode/utf8"},
|
"crypto": {"errors", "hash", "io", "math", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "strconv", "sync", "sync/atomic", "unicode/utf8"},
|
||||||
"crypto/sha1": {"crypto", "errors", "hash", "io", "math", "runtime", "runtime/internal/atomic", "strconv", "sync", "sync/atomic", "unicode/utf8"},
|
"crypto/sha1": {"crypto", "errors", "hash", "io", "math", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "strconv", "sync", "sync/atomic", "unicode/utf8"},
|
||||||
"debug/dwarf": {"encoding/binary", "errors", "fmt", "internal/syscall/windows", "internal/syscall/windows/registry", "io", "math", "os", "path", "reflect", "runtime", "runtime/internal/atomic", "sort", "strconv", "strings", "sync", "sync/atomic", "syscall", "time", "unicode", "unicode/utf16", "unicode/utf8"},
|
"debug/dwarf": {"encoding/binary", "errors", "fmt", "internal/syscall/windows", "internal/syscall/windows/registry", "io", "math", "os", "path", "reflect", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "sort", "strconv", "strings", "sync", "sync/atomic", "syscall", "time", "unicode", "unicode/utf16", "unicode/utf8"},
|
||||||
"debug/elf": {"bytes", "debug/dwarf", "encoding/binary", "errors", "fmt", "internal/syscall/windows", "internal/syscall/windows/registry", "io", "math", "os", "path", "reflect", "runtime", "runtime/internal/atomic", "sort", "strconv", "strings", "sync", "sync/atomic", "syscall", "time", "unicode", "unicode/utf16", "unicode/utf8"},
|
"debug/elf": {"bytes", "debug/dwarf", "encoding/binary", "errors", "fmt", "internal/syscall/windows", "internal/syscall/windows/registry", "io", "math", "os", "path", "reflect", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "sort", "strconv", "strings", "sync", "sync/atomic", "syscall", "time", "unicode", "unicode/utf16", "unicode/utf8"},
|
||||||
"encoding": {"runtime", "runtime/internal/atomic"},
|
"encoding": {"runtime", "runtime/internal/atomic", "runtime/internal/sys"},
|
||||||
"encoding/base64": {"errors", "io", "math", "runtime", "runtime/internal/atomic", "strconv", "sync", "sync/atomic", "unicode/utf8"},
|
"encoding/base64": {"errors", "io", "math", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "strconv", "sync", "sync/atomic", "unicode/utf8"},
|
||||||
"encoding/binary": {"errors", "io", "math", "reflect", "runtime", "runtime/internal/atomic", "strconv", "sync", "sync/atomic", "unicode/utf8"},
|
"encoding/binary": {"errors", "io", "math", "reflect", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "strconv", "sync", "sync/atomic", "unicode/utf8"},
|
||||||
"encoding/json": {"bytes", "encoding", "encoding/base64", "errors", "fmt", "internal/syscall/windows", "internal/syscall/windows/registry", "io", "math", "os", "reflect", "runtime", "runtime/internal/atomic", "sort", "strconv", "strings", "sync", "sync/atomic", "syscall", "time", "unicode", "unicode/utf16", "unicode/utf8"},
|
"encoding/json": {"bytes", "encoding", "encoding/base64", "errors", "fmt", "internal/syscall/windows", "internal/syscall/windows/registry", "io", "math", "os", "reflect", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "sort", "strconv", "strings", "sync", "sync/atomic", "syscall", "time", "unicode", "unicode/utf16", "unicode/utf8"},
|
||||||
"errors": {"runtime", "runtime/internal/atomic"},
|
"errors": {"runtime", "runtime/internal/atomic", "runtime/internal/sys"},
|
||||||
"flag": {"errors", "fmt", "internal/syscall/windows", "internal/syscall/windows/registry", "io", "math", "os", "reflect", "runtime", "runtime/internal/atomic", "sort", "strconv", "sync", "sync/atomic", "syscall", "time", "unicode/utf16", "unicode/utf8"},
|
"flag": {"errors", "fmt", "internal/syscall/windows", "internal/syscall/windows/registry", "io", "math", "os", "reflect", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "sort", "strconv", "sync", "sync/atomic", "syscall", "time", "unicode/utf16", "unicode/utf8"},
|
||||||
"fmt": {"errors", "internal/syscall/windows", "internal/syscall/windows/registry", "io", "math", "os", "reflect", "runtime", "runtime/internal/atomic", "strconv", "sync", "sync/atomic", "syscall", "time", "unicode/utf16", "unicode/utf8"},
|
"fmt": {"errors", "internal/syscall/windows", "internal/syscall/windows/registry", "io", "math", "os", "reflect", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "strconv", "sync", "sync/atomic", "syscall", "time", "unicode/utf16", "unicode/utf8"},
|
||||||
"go/ast": {"bytes", "errors", "fmt", "go/scanner", "go/token", "internal/syscall/windows", "internal/syscall/windows/registry", "io", "math", "os", "path/filepath", "reflect", "runtime", "runtime/internal/atomic", "sort", "strconv", "strings", "sync", "sync/atomic", "syscall", "time", "unicode", "unicode/utf16", "unicode/utf8"},
|
"go/ast": {"bytes", "errors", "fmt", "go/scanner", "go/token", "internal/syscall/windows", "internal/syscall/windows/registry", "io", "math", "os", "path/filepath", "reflect", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "sort", "strconv", "strings", "sync", "sync/atomic", "syscall", "time", "unicode", "unicode/utf16", "unicode/utf8"},
|
||||||
"go/build": {"bufio", "bytes", "errors", "fmt", "go/ast", "go/doc", "go/parser", "go/scanner", "go/token", "internal/syscall/windows", "internal/syscall/windows/registry", "io", "io/ioutil", "log", "math", "net/url", "os", "path", "path/filepath", "reflect", "regexp", "regexp/syntax", "runtime", "runtime/internal/atomic", "sort", "strconv", "strings", "sync", "sync/atomic", "syscall", "text/template", "text/template/parse", "time", "unicode", "unicode/utf16", "unicode/utf8"},
|
"go/build": {"bufio", "bytes", "errors", "fmt", "go/ast", "go/doc", "go/parser", "go/scanner", "go/token", "internal/syscall/windows", "internal/syscall/windows/registry", "io", "io/ioutil", "log", "math", "net/url", "os", "path", "path/filepath", "reflect", "regexp", "regexp/syntax", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "sort", "strconv", "strings", "sync", "sync/atomic", "syscall", "text/template", "text/template/parse", "time", "unicode", "unicode/utf16", "unicode/utf8"},
|
||||||
"go/doc": {"bytes", "errors", "fmt", "go/ast", "go/scanner", "go/token", "internal/syscall/windows", "internal/syscall/windows/registry", "io", "io/ioutil", "math", "net/url", "os", "path", "path/filepath", "reflect", "regexp", "regexp/syntax", "runtime", "runtime/internal/atomic", "sort", "strconv", "strings", "sync", "sync/atomic", "syscall", "text/template", "text/template/parse", "time", "unicode", "unicode/utf16", "unicode/utf8"},
|
"go/doc": {"bytes", "errors", "fmt", "go/ast", "go/scanner", "go/token", "internal/syscall/windows", "internal/syscall/windows/registry", "io", "io/ioutil", "math", "net/url", "os", "path", "path/filepath", "reflect", "regexp", "regexp/syntax", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "sort", "strconv", "strings", "sync", "sync/atomic", "syscall", "text/template", "text/template/parse", "time", "unicode", "unicode/utf16", "unicode/utf8"},
|
||||||
"go/parser": {"bytes", "errors", "fmt", "go/ast", "go/scanner", "go/token", "internal/syscall/windows", "internal/syscall/windows/registry", "io", "io/ioutil", "math", "os", "path/filepath", "reflect", "runtime", "runtime/internal/atomic", "sort", "strconv", "strings", "sync", "sync/atomic", "syscall", "time", "unicode", "unicode/utf16", "unicode/utf8"},
|
"go/parser": {"bytes", "errors", "fmt", "go/ast", "go/scanner", "go/token", "internal/syscall/windows", "internal/syscall/windows/registry", "io", "io/ioutil", "math", "os", "path/filepath", "reflect", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "sort", "strconv", "strings", "sync", "sync/atomic", "syscall", "time", "unicode", "unicode/utf16", "unicode/utf8"},
|
||||||
"go/scanner": {"bytes", "errors", "fmt", "go/token", "internal/syscall/windows", "internal/syscall/windows/registry", "io", "math", "os", "path/filepath", "reflect", "runtime", "runtime/internal/atomic", "sort", "strconv", "strings", "sync", "sync/atomic", "syscall", "time", "unicode", "unicode/utf16", "unicode/utf8"},
|
"go/scanner": {"bytes", "errors", "fmt", "go/token", "internal/syscall/windows", "internal/syscall/windows/registry", "io", "math", "os", "path/filepath", "reflect", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "sort", "strconv", "strings", "sync", "sync/atomic", "syscall", "time", "unicode", "unicode/utf16", "unicode/utf8"},
|
||||||
"go/token": {"errors", "fmt", "internal/syscall/windows", "internal/syscall/windows/registry", "io", "math", "os", "reflect", "runtime", "runtime/internal/atomic", "sort", "strconv", "sync", "sync/atomic", "syscall", "time", "unicode/utf16", "unicode/utf8"},
|
"go/token": {"errors", "fmt", "internal/syscall/windows", "internal/syscall/windows/registry", "io", "math", "os", "reflect", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "sort", "strconv", "sync", "sync/atomic", "syscall", "time", "unicode/utf16", "unicode/utf8"},
|
||||||
"hash": {"errors", "io", "runtime", "runtime/internal/atomic", "sync", "sync/atomic"},
|
"hash": {"errors", "io", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "sync", "sync/atomic"},
|
||||||
"internal/singleflight": {"runtime", "runtime/internal/atomic", "sync", "sync/atomic"},
|
"internal/singleflight": {"runtime", "runtime/internal/atomic", "runtime/internal/sys", "sync", "sync/atomic"},
|
||||||
"internal/syscall/windows": {"errors", "runtime", "runtime/internal/atomic", "sync", "sync/atomic", "syscall", "unicode/utf16"},
|
"internal/syscall/windows": {"errors", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "sync", "sync/atomic", "syscall", "unicode/utf16"},
|
||||||
"internal/syscall/windows/registry": {"errors", "io", "runtime", "runtime/internal/atomic", "sync", "sync/atomic", "syscall", "unicode/utf16"},
|
"internal/syscall/windows/registry": {"errors", "io", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "sync", "sync/atomic", "syscall", "unicode/utf16"},
|
||||||
"io": {"errors", "runtime", "runtime/internal/atomic", "sync", "sync/atomic"},
|
"io": {"errors", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "sync", "sync/atomic"},
|
||||||
"io/ioutil": {"bytes", "errors", "internal/syscall/windows", "internal/syscall/windows/registry", "io", "math", "os", "path/filepath", "runtime", "runtime/internal/atomic", "sort", "strconv", "strings", "sync", "sync/atomic", "syscall", "time", "unicode", "unicode/utf16", "unicode/utf8"},
|
"io/ioutil": {"bytes", "errors", "internal/syscall/windows", "internal/syscall/windows/registry", "io", "math", "os", "path/filepath", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "sort", "strconv", "strings", "sync", "sync/atomic", "syscall", "time", "unicode", "unicode/utf16", "unicode/utf8"},
|
||||||
"log": {"errors", "fmt", "internal/syscall/windows", "internal/syscall/windows/registry", "io", "math", "os", "reflect", "runtime", "runtime/internal/atomic", "strconv", "sync", "sync/atomic", "syscall", "time", "unicode/utf16", "unicode/utf8"},
|
"log": {"errors", "fmt", "internal/syscall/windows", "internal/syscall/windows/registry", "io", "math", "os", "reflect", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "strconv", "sync", "sync/atomic", "syscall", "time", "unicode/utf16", "unicode/utf8"},
|
||||||
"math": {"runtime", "runtime/internal/atomic"},
|
"math": {"runtime", "runtime/internal/atomic", "runtime/internal/sys"},
|
||||||
"net/url": {"bytes", "errors", "fmt", "internal/syscall/windows", "internal/syscall/windows/registry", "io", "math", "os", "reflect", "runtime", "runtime/internal/atomic", "sort", "strconv", "strings", "sync", "sync/atomic", "syscall", "time", "unicode", "unicode/utf16", "unicode/utf8"},
|
"net/url": {"bytes", "errors", "fmt", "internal/syscall/windows", "internal/syscall/windows/registry", "io", "math", "os", "reflect", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "sort", "strconv", "strings", "sync", "sync/atomic", "syscall", "time", "unicode", "unicode/utf16", "unicode/utf8"},
|
||||||
"os": {"errors", "internal/syscall/windows", "internal/syscall/windows/registry", "io", "runtime", "runtime/internal/atomic", "sync", "sync/atomic", "syscall", "time", "unicode/utf16", "unicode/utf8"},
|
"os": {"errors", "internal/syscall/windows", "internal/syscall/windows/registry", "io", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "sync", "sync/atomic", "syscall", "time", "unicode/utf16", "unicode/utf8"},
|
||||||
"os/exec": {"bytes", "errors", "internal/syscall/windows", "internal/syscall/windows/registry", "io", "math", "os", "path/filepath", "runtime", "runtime/internal/atomic", "sort", "strconv", "strings", "sync", "sync/atomic", "syscall", "time", "unicode", "unicode/utf16", "unicode/utf8"},
|
"os/exec": {"bytes", "errors", "internal/syscall/windows", "internal/syscall/windows/registry", "io", "math", "os", "path/filepath", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "sort", "strconv", "strings", "sync", "sync/atomic", "syscall", "time", "unicode", "unicode/utf16", "unicode/utf8"},
|
||||||
"os/signal": {"errors", "internal/syscall/windows", "internal/syscall/windows/registry", "io", "os", "runtime", "runtime/internal/atomic", "sync", "sync/atomic", "syscall", "time", "unicode/utf16", "unicode/utf8"},
|
"os/signal": {"errors", "internal/syscall/windows", "internal/syscall/windows/registry", "io", "os", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "sync", "sync/atomic", "syscall", "time", "unicode/utf16", "unicode/utf8"},
|
||||||
"path": {"errors", "io", "runtime", "runtime/internal/atomic", "strings", "sync", "sync/atomic", "unicode", "unicode/utf8"},
|
"path": {"errors", "io", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "strings", "sync", "sync/atomic", "unicode", "unicode/utf8"},
|
||||||
"path/filepath": {"errors", "internal/syscall/windows", "internal/syscall/windows/registry", "io", "os", "runtime", "runtime/internal/atomic", "sort", "strings", "sync", "sync/atomic", "syscall", "time", "unicode", "unicode/utf16", "unicode/utf8"},
|
"path/filepath": {"errors", "internal/syscall/windows", "internal/syscall/windows/registry", "io", "os", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "sort", "strings", "sync", "sync/atomic", "syscall", "time", "unicode", "unicode/utf16", "unicode/utf8"},
|
||||||
"reflect": {"errors", "math", "runtime", "runtime/internal/atomic", "strconv", "sync", "sync/atomic", "unicode/utf8"},
|
"reflect": {"errors", "math", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "strconv", "sync", "sync/atomic", "unicode/utf8"},
|
||||||
"regexp": {"bytes", "errors", "io", "math", "regexp/syntax", "runtime", "runtime/internal/atomic", "sort", "strconv", "strings", "sync", "sync/atomic", "unicode", "unicode/utf8"},
|
"regexp": {"bytes", "errors", "io", "math", "regexp/syntax", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "sort", "strconv", "strings", "sync", "sync/atomic", "unicode", "unicode/utf8"},
|
||||||
"regexp/syntax": {"bytes", "errors", "io", "math", "runtime", "runtime/internal/atomic", "sort", "strconv", "strings", "sync", "sync/atomic", "unicode", "unicode/utf8"},
|
"regexp/syntax": {"bytes", "errors", "io", "math", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "sort", "strconv", "strings", "sync", "sync/atomic", "unicode", "unicode/utf8"},
|
||||||
"runtime": {"runtime/internal/atomic"},
|
"runtime": {"runtime/internal/atomic", "runtime/internal/sys"},
|
||||||
"runtime/internal/atomic": {},
|
"runtime/internal/atomic": {},
|
||||||
"sort": {"runtime", "runtime/internal/atomic"},
|
"runtime/internal/sys": {},
|
||||||
"strconv": {"errors", "math", "runtime", "runtime/internal/atomic", "unicode/utf8"},
|
"sort": {"runtime", "runtime/internal/atomic", "runtime/internal/sys"},
|
||||||
"strings": {"errors", "io", "runtime", "runtime/internal/atomic", "sync", "sync/atomic", "unicode", "unicode/utf8"},
|
"strconv": {"errors", "math", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "unicode/utf8"},
|
||||||
"sync": {"runtime", "runtime/internal/atomic", "sync/atomic"},
|
"strings": {"errors", "io", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "sync", "sync/atomic", "unicode", "unicode/utf8"},
|
||||||
"sync/atomic": {"runtime", "runtime/internal/atomic"},
|
"sync": {"runtime", "runtime/internal/atomic", "runtime/internal/sys", "sync/atomic"},
|
||||||
"syscall": {"errors", "runtime", "runtime/internal/atomic", "sync", "sync/atomic", "unicode/utf16"},
|
"sync/atomic": {"runtime", "runtime/internal/atomic", "runtime/internal/sys"},
|
||||||
"text/template": {"bytes", "errors", "fmt", "internal/syscall/windows", "internal/syscall/windows/registry", "io", "io/ioutil", "math", "net/url", "os", "path/filepath", "reflect", "runtime", "runtime/internal/atomic", "sort", "strconv", "strings", "sync", "sync/atomic", "syscall", "text/template/parse", "time", "unicode", "unicode/utf16", "unicode/utf8"},
|
"syscall": {"errors", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "sync", "sync/atomic", "unicode/utf16"},
|
||||||
"text/template/parse": {"bytes", "errors", "fmt", "internal/syscall/windows", "internal/syscall/windows/registry", "io", "math", "os", "reflect", "runtime", "runtime/internal/atomic", "strconv", "strings", "sync", "sync/atomic", "syscall", "time", "unicode", "unicode/utf16", "unicode/utf8"},
|
"text/template": {"bytes", "errors", "fmt", "internal/syscall/windows", "internal/syscall/windows/registry", "io", "io/ioutil", "math", "net/url", "os", "path/filepath", "reflect", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "sort", "strconv", "strings", "sync", "sync/atomic", "syscall", "text/template/parse", "time", "unicode", "unicode/utf16", "unicode/utf8"},
|
||||||
"time": {"errors", "internal/syscall/windows/registry", "io", "runtime", "runtime/internal/atomic", "sync", "sync/atomic", "syscall", "unicode/utf16"},
|
"text/template/parse": {"bytes", "errors", "fmt", "internal/syscall/windows", "internal/syscall/windows/registry", "io", "math", "os", "reflect", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "strconv", "strings", "sync", "sync/atomic", "syscall", "time", "unicode", "unicode/utf16", "unicode/utf8"},
|
||||||
"unicode": {"runtime", "runtime/internal/atomic"},
|
"time": {"errors", "internal/syscall/windows/registry", "io", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "sync", "sync/atomic", "syscall", "unicode/utf16"},
|
||||||
"unicode/utf16": {"runtime", "runtime/internal/atomic"},
|
"unicode": {"runtime", "runtime/internal/atomic", "runtime/internal/sys"},
|
||||||
"unicode/utf8": {"runtime", "runtime/internal/atomic"},
|
"unicode/utf16": {"runtime", "runtime/internal/atomic", "runtime/internal/sys"},
|
||||||
"cmd/go": {"bufio", "bytes", "container/heap", "crypto", "crypto/sha1", "debug/dwarf", "debug/elf", "encoding", "encoding/base64", "encoding/binary", "encoding/json", "errors", "flag", "fmt", "go/ast", "go/build", "go/doc", "go/parser", "go/scanner", "go/token", "hash", "internal/singleflight", "internal/syscall/windows", "internal/syscall/windows/registry", "io", "io/ioutil", "log", "math", "net/url", "os", "os/exec", "os/signal", "path", "path/filepath", "reflect", "regexp", "regexp/syntax", "runtime", "runtime/internal/atomic", "sort", "strconv", "strings", "sync", "sync/atomic", "syscall", "text/template", "text/template/parse", "time", "unicode", "unicode/utf16", "unicode/utf8"},
|
"unicode/utf8": {"runtime", "runtime/internal/atomic", "runtime/internal/sys"},
|
||||||
|
"cmd/go": {"bufio", "bytes", "container/heap", "crypto", "crypto/sha1", "debug/dwarf", "debug/elf", "encoding", "encoding/base64", "encoding/binary", "encoding/json", "errors", "flag", "fmt", "go/ast", "go/build", "go/doc", "go/parser", "go/scanner", "go/token", "hash", "internal/singleflight", "internal/syscall/windows", "internal/syscall/windows/registry", "io", "io/ioutil", "log", "math", "net/url", "os", "os/exec", "os/signal", "path", "path/filepath", "reflect", "regexp", "regexp/syntax", "runtime", "runtime/internal/atomic", "runtime/internal/sys", "sort", "strconv", "strings", "sync", "sync/atomic", "syscall", "text/template", "text/template/parse", "time", "unicode", "unicode/utf16", "unicode/utf8"},
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,7 +36,8 @@ var pkgDeps = map[string][]string{
|
||||||
// L0 is the lowest level, core, nearly unavoidable packages.
|
// L0 is the lowest level, core, nearly unavoidable packages.
|
||||||
"errors": {},
|
"errors": {},
|
||||||
"io": {"errors", "sync"},
|
"io": {"errors", "sync"},
|
||||||
"runtime": {"unsafe", "runtime/internal/atomic"},
|
"runtime": {"unsafe", "runtime/internal/atomic", "runtime/internal/sys"},
|
||||||
|
"runtime/internal/sys": {},
|
||||||
"runtime/internal/atomic": {"unsafe"},
|
"runtime/internal/atomic": {"unsafe"},
|
||||||
"sync": {"runtime", "sync/atomic", "unsafe"},
|
"sync": {"runtime", "sync/atomic", "unsafe"},
|
||||||
"sync/atomic": {"unsafe"},
|
"sync/atomic": {"unsafe"},
|
||||||
|
|
|
@ -4,11 +4,14 @@
|
||||||
|
|
||||||
package runtime
|
package runtime
|
||||||
|
|
||||||
import "unsafe"
|
import (
|
||||||
|
"runtime/internal/sys"
|
||||||
|
"unsafe"
|
||||||
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
c0 = uintptr((8-ptrSize)/4*2860486313 + (ptrSize-4)/4*33054211828000289)
|
c0 = uintptr((8-sys.PtrSize)/4*2860486313 + (sys.PtrSize-4)/4*33054211828000289)
|
||||||
c1 = uintptr((8-ptrSize)/4*3267000013 + (ptrSize-4)/4*23344194077549503)
|
c1 = uintptr((8-sys.PtrSize)/4*3267000013 + (sys.PtrSize-4)/4*23344194077549503)
|
||||||
)
|
)
|
||||||
|
|
||||||
// type algorithms - known to compiler
|
// type algorithms - known to compiler
|
||||||
|
@ -301,7 +304,7 @@ func memclrBytes(b []byte) {
|
||||||
memclr(s.array, uintptr(s.len))
|
memclr(s.array, uintptr(s.len))
|
||||||
}
|
}
|
||||||
|
|
||||||
const hashRandomBytes = ptrSize / 4 * 64
|
const hashRandomBytes = sys.PtrSize / 4 * 64
|
||||||
|
|
||||||
// used in asm_{386,amd64}.s to seed the hash function
|
// used in asm_{386,amd64}.s to seed the hash function
|
||||||
var aeskeysched [hashRandomBytes]byte
|
var aeskeysched [hashRandomBytes]byte
|
||||||
|
@ -324,7 +327,7 @@ func init() {
|
||||||
getRandomData(aeskeysched[:])
|
getRandomData(aeskeysched[:])
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
getRandomData((*[len(hashkey) * ptrSize]byte)(unsafe.Pointer(&hashkey))[:])
|
getRandomData((*[len(hashkey) * sys.PtrSize]byte)(unsafe.Pointer(&hashkey))[:])
|
||||||
hashkey[0] |= 1 // make sure these numbers are odd
|
hashkey[0] |= 1 // make sure these numbers are odd
|
||||||
hashkey[1] |= 1
|
hashkey[1] |= 1
|
||||||
hashkey[2] |= 1
|
hashkey[2] |= 1
|
||||||
|
|
|
@ -1,19 +0,0 @@
|
||||||
// Copyright 2014 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 runtime
|
|
||||||
|
|
||||||
const (
|
|
||||||
thechar = '8'
|
|
||||||
_BigEndian = 0
|
|
||||||
_CacheLineSize = 64
|
|
||||||
_PhysPageSize = goos_nacl*65536 + (1-goos_nacl)*4096 // 4k normally; 64k on NaCl
|
|
||||||
_PCQuantum = 1
|
|
||||||
_Int64Align = 4
|
|
||||||
hugePageSize = 1 << 21
|
|
||||||
minFrameSize = 0
|
|
||||||
)
|
|
||||||
|
|
||||||
type uintreg uint32
|
|
||||||
type intptr int32 // TODO(rsc): remove
|
|
|
@ -1,19 +0,0 @@
|
||||||
// Copyright 2014 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 runtime
|
|
||||||
|
|
||||||
const (
|
|
||||||
thechar = '6'
|
|
||||||
_BigEndian = 0
|
|
||||||
_CacheLineSize = 64
|
|
||||||
_PhysPageSize = 4096
|
|
||||||
_PCQuantum = 1
|
|
||||||
_Int64Align = 8
|
|
||||||
hugePageSize = 1 << 21
|
|
||||||
minFrameSize = 0
|
|
||||||
)
|
|
||||||
|
|
||||||
type uintreg uint64
|
|
||||||
type intptr int64 // TODO(rsc): remove
|
|
|
@ -1,19 +0,0 @@
|
||||||
// Copyright 2014 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 runtime
|
|
||||||
|
|
||||||
const (
|
|
||||||
thechar = '6'
|
|
||||||
_BigEndian = 0
|
|
||||||
_CacheLineSize = 64
|
|
||||||
_PhysPageSize = 65536*goos_nacl + 4096*(1-goos_nacl)
|
|
||||||
_PCQuantum = 1
|
|
||||||
_Int64Align = 8
|
|
||||||
hugePageSize = 1 << 21
|
|
||||||
minFrameSize = 0
|
|
||||||
)
|
|
||||||
|
|
||||||
type uintreg uint64
|
|
||||||
type intptr int32 // TODO(rsc): remove
|
|
|
@ -1,19 +0,0 @@
|
||||||
// Copyright 2014 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 runtime
|
|
||||||
|
|
||||||
const (
|
|
||||||
thechar = '5'
|
|
||||||
_BigEndian = 0
|
|
||||||
_CacheLineSize = 32
|
|
||||||
_PhysPageSize = 65536*goos_nacl + 4096*(1-goos_nacl)
|
|
||||||
_PCQuantum = 4
|
|
||||||
_Int64Align = 4
|
|
||||||
hugePageSize = 0
|
|
||||||
minFrameSize = 4
|
|
||||||
)
|
|
||||||
|
|
||||||
type uintreg uint32
|
|
||||||
type intptr int32 // TODO(rsc): remove
|
|
|
@ -1,19 +0,0 @@
|
||||||
// Copyright 2014 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 runtime
|
|
||||||
|
|
||||||
const (
|
|
||||||
thechar = '7'
|
|
||||||
_BigEndian = 0
|
|
||||||
_CacheLineSize = 32
|
|
||||||
_PhysPageSize = 65536
|
|
||||||
_PCQuantum = 4
|
|
||||||
_Int64Align = 8
|
|
||||||
hugePageSize = 0
|
|
||||||
minFrameSize = 8
|
|
||||||
)
|
|
||||||
|
|
||||||
type uintreg uint64
|
|
||||||
type intptr int64 // TODO(rsc): remove
|
|
|
@ -1,19 +0,0 @@
|
||||||
// Copyright 2014 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 runtime
|
|
||||||
|
|
||||||
const (
|
|
||||||
thechar = '9'
|
|
||||||
_BigEndian = 1
|
|
||||||
_CacheLineSize = 64
|
|
||||||
_PhysPageSize = 65536
|
|
||||||
_PCQuantum = 4
|
|
||||||
_Int64Align = 8
|
|
||||||
hugePageSize = 0
|
|
||||||
minFrameSize = 8
|
|
||||||
)
|
|
||||||
|
|
||||||
type uintreg uint64
|
|
||||||
type intptr int64 // TODO(rsc): remove
|
|
|
@ -1,19 +0,0 @@
|
||||||
// Copyright 2014 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 runtime
|
|
||||||
|
|
||||||
const (
|
|
||||||
thechar = '9'
|
|
||||||
_BigEndian = 0
|
|
||||||
_CacheLineSize = 64
|
|
||||||
_PhysPageSize = 65536
|
|
||||||
_PCQuantum = 4
|
|
||||||
_Int64Align = 8
|
|
||||||
hugePageSize = 0
|
|
||||||
minFrameSize = 8
|
|
||||||
)
|
|
||||||
|
|
||||||
type uintreg uint64
|
|
||||||
type intptr int64 // TODO(rsc): remove
|
|
|
@ -79,7 +79,10 @@
|
||||||
|
|
||||||
package runtime
|
package runtime
|
||||||
|
|
||||||
import "unsafe"
|
import (
|
||||||
|
"runtime/internal/sys"
|
||||||
|
"unsafe"
|
||||||
|
)
|
||||||
|
|
||||||
// Call from Go to C.
|
// Call from Go to C.
|
||||||
//go:nosplit
|
//go:nosplit
|
||||||
|
@ -220,22 +223,22 @@ func cgocallbackg1() {
|
||||||
case "arm":
|
case "arm":
|
||||||
// On arm, stack frame is two words and there's a saved LR between
|
// On arm, stack frame is two words and there's a saved LR between
|
||||||
// SP and the stack frame and between the stack frame and the arguments.
|
// SP and the stack frame and between the stack frame and the arguments.
|
||||||
cb = (*args)(unsafe.Pointer(sp + 4*ptrSize))
|
cb = (*args)(unsafe.Pointer(sp + 4*sys.PtrSize))
|
||||||
case "arm64":
|
case "arm64":
|
||||||
// On arm64, stack frame is four words and there's a saved LR between
|
// On arm64, stack frame is four words and there's a saved LR between
|
||||||
// SP and the stack frame and between the stack frame and the arguments.
|
// SP and the stack frame and between the stack frame and the arguments.
|
||||||
cb = (*args)(unsafe.Pointer(sp + 5*ptrSize))
|
cb = (*args)(unsafe.Pointer(sp + 5*sys.PtrSize))
|
||||||
case "amd64":
|
case "amd64":
|
||||||
// On amd64, stack frame is one word, plus caller PC.
|
// On amd64, stack frame is one word, plus caller PC.
|
||||||
if framepointer_enabled {
|
if framepointer_enabled {
|
||||||
// In this case, there's also saved BP.
|
// In this case, there's also saved BP.
|
||||||
cb = (*args)(unsafe.Pointer(sp + 3*ptrSize))
|
cb = (*args)(unsafe.Pointer(sp + 3*sys.PtrSize))
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
cb = (*args)(unsafe.Pointer(sp + 2*ptrSize))
|
cb = (*args)(unsafe.Pointer(sp + 2*sys.PtrSize))
|
||||||
case "386":
|
case "386":
|
||||||
// On 386, stack frame is three words, plus caller PC.
|
// On 386, stack frame is three words, plus caller PC.
|
||||||
cb = (*args)(unsafe.Pointer(sp + 4*ptrSize))
|
cb = (*args)(unsafe.Pointer(sp + 4*sys.PtrSize))
|
||||||
case "ppc64", "ppc64le":
|
case "ppc64", "ppc64le":
|
||||||
// On ppc64, the callback arguments are in the arguments area of
|
// On ppc64, the callback arguments are in the arguments area of
|
||||||
// cgocallback's stack frame. The stack looks like this:
|
// cgocallback's stack frame. The stack looks like this:
|
||||||
|
@ -252,7 +255,7 @@ func cgocallbackg1() {
|
||||||
// | cgocallback_gofunc +------------------------------+ <- sp + minFrameSize
|
// | cgocallback_gofunc +------------------------------+ <- sp + minFrameSize
|
||||||
// | | fixed frame area |
|
// | | fixed frame area |
|
||||||
// +--------------------+------------------------------+ <- sp
|
// +--------------------+------------------------------+ <- sp
|
||||||
cb = (*args)(unsafe.Pointer(sp + 2*minFrameSize + 2*ptrSize))
|
cb = (*args)(unsafe.Pointer(sp + 2*sys.MinFrameSize + 2*sys.PtrSize))
|
||||||
}
|
}
|
||||||
|
|
||||||
// Invoke callback.
|
// Invoke callback.
|
||||||
|
@ -291,7 +294,7 @@ func unwindm(restore *bool) {
|
||||||
default:
|
default:
|
||||||
throw("unwindm not implemented")
|
throw("unwindm not implemented")
|
||||||
case "386", "amd64", "arm", "ppc64", "ppc64le":
|
case "386", "amd64", "arm", "ppc64", "ppc64le":
|
||||||
sched.sp = *(*uintptr)(unsafe.Pointer(sched.sp + minFrameSize))
|
sched.sp = *(*uintptr)(unsafe.Pointer(sched.sp + sys.MinFrameSize))
|
||||||
case "arm64":
|
case "arm64":
|
||||||
sched.sp = *(*uintptr)(unsafe.Pointer(sched.sp + 16))
|
sched.sp = *(*uintptr)(unsafe.Pointer(sched.sp + 16))
|
||||||
}
|
}
|
||||||
|
@ -437,7 +440,7 @@ func cgoCheckArg(t *_type, p unsafe.Pointer, indir, top bool) {
|
||||||
if inheap(uintptr(unsafe.Pointer(it))) {
|
if inheap(uintptr(unsafe.Pointer(it))) {
|
||||||
panic(errorString(cgoCheckPointerFail))
|
panic(errorString(cgoCheckPointerFail))
|
||||||
}
|
}
|
||||||
p = *(*unsafe.Pointer)(unsafe.Pointer(uintptr(p) + ptrSize))
|
p = *(*unsafe.Pointer)(unsafe.Pointer(uintptr(p) + sys.PtrSize))
|
||||||
if !cgoIsGoPointer(p) {
|
if !cgoIsGoPointer(p) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -505,9 +508,9 @@ func cgoCheckUnknownPointer(p unsafe.Pointer) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
n := span.elemsize
|
n := span.elemsize
|
||||||
for i := uintptr(0); i < n; i += ptrSize {
|
for i := uintptr(0); i < n; i += sys.PtrSize {
|
||||||
bits := hbits.bits()
|
bits := hbits.bits()
|
||||||
if i >= 2*ptrSize && bits&bitMarked == 0 {
|
if i >= 2*sys.PtrSize && bits&bitMarked == 0 {
|
||||||
// No more possible pointers.
|
// No more possible pointers.
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,6 +8,7 @@ package runtime
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"runtime/internal/atomic"
|
"runtime/internal/atomic"
|
||||||
|
"runtime/internal/sys"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -115,7 +116,7 @@ func GostringW(w []uint16) (s string) {
|
||||||
var Gostringnocopy = gostringnocopy
|
var Gostringnocopy = gostringnocopy
|
||||||
var Maxstring = &maxstring
|
var Maxstring = &maxstring
|
||||||
|
|
||||||
type Uintreg uintreg
|
type Uintreg sys.Uintreg
|
||||||
|
|
||||||
var Open = open
|
var Open = open
|
||||||
var Close = closefd
|
var Close = closefd
|
||||||
|
@ -125,7 +126,7 @@ var Write = write
|
||||||
func Envs() []string { return envs }
|
func Envs() []string { return envs }
|
||||||
func SetEnvs(e []string) { envs = e }
|
func SetEnvs(e []string) { envs = e }
|
||||||
|
|
||||||
var BigEndian = _BigEndian
|
var BigEndian = sys.BigEndian
|
||||||
|
|
||||||
// For benchmarking.
|
// For benchmarking.
|
||||||
|
|
||||||
|
@ -156,7 +157,7 @@ func BenchSetType(n int, x interface{}) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
const PtrSize = ptrSize
|
const PtrSize = sys.PtrSize
|
||||||
|
|
||||||
var TestingAssertE2I2GC = &testingAssertE2I2GC
|
var TestingAssertE2I2GC = &testingAssertE2I2GC
|
||||||
var TestingAssertE2T2GC = &testingAssertE2T2GC
|
var TestingAssertE2T2GC = &testingAssertE2T2GC
|
||||||
|
|
|
@ -130,6 +130,8 @@ of the run-time system.
|
||||||
*/
|
*/
|
||||||
package runtime
|
package runtime
|
||||||
|
|
||||||
|
import "runtime/internal/sys"
|
||||||
|
|
||||||
// Caller reports file and line number information about function invocations on
|
// Caller reports file and line number information about function invocations on
|
||||||
// the calling goroutine's stack. The argument skip is the number of stack frames
|
// the calling goroutine's stack. The argument skip is the number of stack frames
|
||||||
// to ascend, with 0 identifying the caller of Caller. (For historical reasons the
|
// to ascend, with 0 identifying the caller of Caller. (For historical reasons the
|
||||||
|
@ -199,20 +201,20 @@ func GOROOT() string {
|
||||||
if s != "" {
|
if s != "" {
|
||||||
return s
|
return s
|
||||||
}
|
}
|
||||||
return defaultGoroot
|
return sys.DefaultGoroot
|
||||||
}
|
}
|
||||||
|
|
||||||
// Version returns the Go tree's version string.
|
// Version returns the Go tree's version string.
|
||||||
// It is either the commit hash and date at the time of the build or,
|
// It is either the commit hash and date at the time of the build or,
|
||||||
// when possible, a release tag like "go1.3".
|
// when possible, a release tag like "go1.3".
|
||||||
func Version() string {
|
func Version() string {
|
||||||
return theVersion
|
return sys.TheVersion
|
||||||
}
|
}
|
||||||
|
|
||||||
// GOOS is the running program's operating system target:
|
// GOOS is the running program's operating system target:
|
||||||
// one of darwin, freebsd, linux, and so on.
|
// one of darwin, freebsd, linux, and so on.
|
||||||
const GOOS string = theGoos
|
const GOOS string = sys.TheGoos
|
||||||
|
|
||||||
// GOARCH is the running program's architecture target:
|
// GOARCH is the running program's architecture target:
|
||||||
// 386, amd64, or arm.
|
// 386, amd64, or arm.
|
||||||
const GOARCH string = theGoarch
|
const GOARCH string = sys.TheGoarch
|
||||||
|
|
|
@ -55,6 +55,7 @@ package runtime
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"runtime/internal/atomic"
|
"runtime/internal/atomic"
|
||||||
|
"runtime/internal/sys"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -96,7 +97,7 @@ const (
|
||||||
oldIterator = 2 // there may be an iterator using oldbuckets
|
oldIterator = 2 // there may be an iterator using oldbuckets
|
||||||
|
|
||||||
// sentinel bucket ID for iterator checks
|
// sentinel bucket ID for iterator checks
|
||||||
noCheck = 1<<(8*ptrSize) - 1
|
noCheck = 1<<(8*sys.PtrSize) - 1
|
||||||
)
|
)
|
||||||
|
|
||||||
// A header for a Go map.
|
// A header for a Go map.
|
||||||
|
@ -160,7 +161,7 @@ func evacuated(b *bmap) bool {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (b *bmap) overflow(t *maptype) *bmap {
|
func (b *bmap) overflow(t *maptype) *bmap {
|
||||||
return *(**bmap)(add(unsafe.Pointer(b), uintptr(t.bucketsize)-ptrSize))
|
return *(**bmap)(add(unsafe.Pointer(b), uintptr(t.bucketsize)-sys.PtrSize))
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *hmap) setoverflow(t *maptype, b, ovf *bmap) {
|
func (h *hmap) setoverflow(t *maptype, b, ovf *bmap) {
|
||||||
|
@ -168,7 +169,7 @@ func (h *hmap) setoverflow(t *maptype, b, ovf *bmap) {
|
||||||
h.createOverflow()
|
h.createOverflow()
|
||||||
*h.overflow[0] = append(*h.overflow[0], ovf)
|
*h.overflow[0] = append(*h.overflow[0], ovf)
|
||||||
}
|
}
|
||||||
*(**bmap)(add(unsafe.Pointer(b), uintptr(t.bucketsize)-ptrSize)) = ovf
|
*(**bmap)(add(unsafe.Pointer(b), uintptr(t.bucketsize)-sys.PtrSize)) = ovf
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *hmap) createOverflow() {
|
func (h *hmap) createOverflow() {
|
||||||
|
@ -201,11 +202,11 @@ func makemap(t *maptype, hint int64, h *hmap, bucket unsafe.Pointer) *hmap {
|
||||||
}
|
}
|
||||||
|
|
||||||
// check compiler's and reflect's math
|
// check compiler's and reflect's math
|
||||||
if t.key.size > maxKeySize && (!t.indirectkey || t.keysize != uint8(ptrSize)) ||
|
if t.key.size > maxKeySize && (!t.indirectkey || t.keysize != uint8(sys.PtrSize)) ||
|
||||||
t.key.size <= maxKeySize && (t.indirectkey || t.keysize != uint8(t.key.size)) {
|
t.key.size <= maxKeySize && (t.indirectkey || t.keysize != uint8(t.key.size)) {
|
||||||
throw("key size wrong")
|
throw("key size wrong")
|
||||||
}
|
}
|
||||||
if t.elem.size > maxValueSize && (!t.indirectvalue || t.valuesize != uint8(ptrSize)) ||
|
if t.elem.size > maxValueSize && (!t.indirectvalue || t.valuesize != uint8(sys.PtrSize)) ||
|
||||||
t.elem.size <= maxValueSize && (t.indirectvalue || t.valuesize != uint8(t.elem.size)) {
|
t.elem.size <= maxValueSize && (t.indirectvalue || t.valuesize != uint8(t.elem.size)) {
|
||||||
throw("value size wrong")
|
throw("value size wrong")
|
||||||
}
|
}
|
||||||
|
@ -293,7 +294,7 @@ func mapaccess1(t *maptype, h *hmap, key unsafe.Pointer) unsafe.Pointer {
|
||||||
b = oldb
|
b = oldb
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
top := uint8(hash >> (ptrSize*8 - 8))
|
top := uint8(hash >> (sys.PtrSize*8 - 8))
|
||||||
if top < minTopHash {
|
if top < minTopHash {
|
||||||
top += minTopHash
|
top += minTopHash
|
||||||
}
|
}
|
||||||
|
@ -344,7 +345,7 @@ func mapaccess2(t *maptype, h *hmap, key unsafe.Pointer) (unsafe.Pointer, bool)
|
||||||
b = oldb
|
b = oldb
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
top := uint8(hash >> (ptrSize*8 - 8))
|
top := uint8(hash >> (sys.PtrSize*8 - 8))
|
||||||
if top < minTopHash {
|
if top < minTopHash {
|
||||||
top += minTopHash
|
top += minTopHash
|
||||||
}
|
}
|
||||||
|
@ -387,7 +388,7 @@ func mapaccessK(t *maptype, h *hmap, key unsafe.Pointer) (unsafe.Pointer, unsafe
|
||||||
b = oldb
|
b = oldb
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
top := uint8(hash >> (ptrSize*8 - 8))
|
top := uint8(hash >> (sys.PtrSize*8 - 8))
|
||||||
if top < minTopHash {
|
if top < minTopHash {
|
||||||
top += minTopHash
|
top += minTopHash
|
||||||
}
|
}
|
||||||
|
@ -444,7 +445,7 @@ again:
|
||||||
growWork(t, h, bucket)
|
growWork(t, h, bucket)
|
||||||
}
|
}
|
||||||
b := (*bmap)(unsafe.Pointer(uintptr(h.buckets) + bucket*uintptr(t.bucketsize)))
|
b := (*bmap)(unsafe.Pointer(uintptr(h.buckets) + bucket*uintptr(t.bucketsize)))
|
||||||
top := uint8(hash >> (ptrSize*8 - 8))
|
top := uint8(hash >> (sys.PtrSize*8 - 8))
|
||||||
if top < minTopHash {
|
if top < minTopHash {
|
||||||
top += minTopHash
|
top += minTopHash
|
||||||
}
|
}
|
||||||
|
@ -541,7 +542,7 @@ func mapdelete(t *maptype, h *hmap, key unsafe.Pointer) {
|
||||||
growWork(t, h, bucket)
|
growWork(t, h, bucket)
|
||||||
}
|
}
|
||||||
b := (*bmap)(unsafe.Pointer(uintptr(h.buckets) + bucket*uintptr(t.bucketsize)))
|
b := (*bmap)(unsafe.Pointer(uintptr(h.buckets) + bucket*uintptr(t.bucketsize)))
|
||||||
top := uint8(hash >> (ptrSize*8 - 8))
|
top := uint8(hash >> (sys.PtrSize*8 - 8))
|
||||||
if top < minTopHash {
|
if top < minTopHash {
|
||||||
top += minTopHash
|
top += minTopHash
|
||||||
}
|
}
|
||||||
|
@ -594,7 +595,7 @@ func mapiterinit(t *maptype, h *hmap, it *hiter) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if unsafe.Sizeof(hiter{})/ptrSize != 12 {
|
if unsafe.Sizeof(hiter{})/sys.PtrSize != 12 {
|
||||||
throw("hash_iter size incorrect") // see ../../cmd/internal/gc/reflect.go
|
throw("hash_iter size incorrect") // see ../../cmd/internal/gc/reflect.go
|
||||||
}
|
}
|
||||||
it.t = t
|
it.t = t
|
||||||
|
@ -865,7 +866,7 @@ func evacuate(t *maptype, h *hmap, oldbucket uintptr) {
|
||||||
} else {
|
} else {
|
||||||
hash &^= newbit
|
hash &^= newbit
|
||||||
}
|
}
|
||||||
top = uint8(hash >> (ptrSize*8 - 8))
|
top = uint8(hash >> (sys.PtrSize*8 - 8))
|
||||||
if top < minTopHash {
|
if top < minTopHash {
|
||||||
top += minTopHash
|
top += minTopHash
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,6 +6,7 @@ package runtime
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"runtime/internal/atomic"
|
"runtime/internal/atomic"
|
||||||
|
"runtime/internal/sys"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -196,12 +197,12 @@ func mapaccess1_faststr(t *maptype, h *hmap, ky string) unsafe.Pointer {
|
||||||
if x == empty {
|
if x == empty {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
k := (*stringStruct)(add(unsafe.Pointer(b), dataOffset+i*2*ptrSize))
|
k := (*stringStruct)(add(unsafe.Pointer(b), dataOffset+i*2*sys.PtrSize))
|
||||||
if k.len != key.len {
|
if k.len != key.len {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if k.str == key.str || memeq(k.str, key.str, uintptr(key.len)) {
|
if k.str == key.str || memeq(k.str, key.str, uintptr(key.len)) {
|
||||||
return add(unsafe.Pointer(b), dataOffset+bucketCnt*2*ptrSize+i*uintptr(t.valuesize))
|
return add(unsafe.Pointer(b), dataOffset+bucketCnt*2*sys.PtrSize+i*uintptr(t.valuesize))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return atomic.Loadp(unsafe.Pointer(&zeroptr))
|
return atomic.Loadp(unsafe.Pointer(&zeroptr))
|
||||||
|
@ -213,12 +214,12 @@ func mapaccess1_faststr(t *maptype, h *hmap, ky string) unsafe.Pointer {
|
||||||
if x == empty {
|
if x == empty {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
k := (*stringStruct)(add(unsafe.Pointer(b), dataOffset+i*2*ptrSize))
|
k := (*stringStruct)(add(unsafe.Pointer(b), dataOffset+i*2*sys.PtrSize))
|
||||||
if k.len != key.len {
|
if k.len != key.len {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if k.str == key.str {
|
if k.str == key.str {
|
||||||
return add(unsafe.Pointer(b), dataOffset+bucketCnt*2*ptrSize+i*uintptr(t.valuesize))
|
return add(unsafe.Pointer(b), dataOffset+bucketCnt*2*sys.PtrSize+i*uintptr(t.valuesize))
|
||||||
}
|
}
|
||||||
// check first 4 bytes
|
// check first 4 bytes
|
||||||
// TODO: on amd64/386 at least, make this compile to one 4-byte comparison instead of
|
// TODO: on amd64/386 at least, make this compile to one 4-byte comparison instead of
|
||||||
|
@ -237,9 +238,9 @@ func mapaccess1_faststr(t *maptype, h *hmap, ky string) unsafe.Pointer {
|
||||||
keymaybe = i
|
keymaybe = i
|
||||||
}
|
}
|
||||||
if keymaybe != bucketCnt {
|
if keymaybe != bucketCnt {
|
||||||
k := (*stringStruct)(add(unsafe.Pointer(b), dataOffset+keymaybe*2*ptrSize))
|
k := (*stringStruct)(add(unsafe.Pointer(b), dataOffset+keymaybe*2*sys.PtrSize))
|
||||||
if memeq(k.str, key.str, uintptr(key.len)) {
|
if memeq(k.str, key.str, uintptr(key.len)) {
|
||||||
return add(unsafe.Pointer(b), dataOffset+bucketCnt*2*ptrSize+keymaybe*uintptr(t.valuesize))
|
return add(unsafe.Pointer(b), dataOffset+bucketCnt*2*sys.PtrSize+keymaybe*uintptr(t.valuesize))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return atomic.Loadp(unsafe.Pointer(&zeroptr))
|
return atomic.Loadp(unsafe.Pointer(&zeroptr))
|
||||||
|
@ -254,7 +255,7 @@ dohash:
|
||||||
b = oldb
|
b = oldb
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
top := uint8(hash >> (ptrSize*8 - 8))
|
top := uint8(hash >> (sys.PtrSize*8 - 8))
|
||||||
if top < minTopHash {
|
if top < minTopHash {
|
||||||
top += minTopHash
|
top += minTopHash
|
||||||
}
|
}
|
||||||
|
@ -264,12 +265,12 @@ dohash:
|
||||||
if x != top {
|
if x != top {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
k := (*stringStruct)(add(unsafe.Pointer(b), dataOffset+i*2*ptrSize))
|
k := (*stringStruct)(add(unsafe.Pointer(b), dataOffset+i*2*sys.PtrSize))
|
||||||
if k.len != key.len {
|
if k.len != key.len {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if k.str == key.str || memeq(k.str, key.str, uintptr(key.len)) {
|
if k.str == key.str || memeq(k.str, key.str, uintptr(key.len)) {
|
||||||
return add(unsafe.Pointer(b), dataOffset+bucketCnt*2*ptrSize+i*uintptr(t.valuesize))
|
return add(unsafe.Pointer(b), dataOffset+bucketCnt*2*sys.PtrSize+i*uintptr(t.valuesize))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
b = b.overflow(t)
|
b = b.overflow(t)
|
||||||
|
@ -298,12 +299,12 @@ func mapaccess2_faststr(t *maptype, h *hmap, ky string) (unsafe.Pointer, bool) {
|
||||||
if x == empty {
|
if x == empty {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
k := (*stringStruct)(add(unsafe.Pointer(b), dataOffset+i*2*ptrSize))
|
k := (*stringStruct)(add(unsafe.Pointer(b), dataOffset+i*2*sys.PtrSize))
|
||||||
if k.len != key.len {
|
if k.len != key.len {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if k.str == key.str || memeq(k.str, key.str, uintptr(key.len)) {
|
if k.str == key.str || memeq(k.str, key.str, uintptr(key.len)) {
|
||||||
return add(unsafe.Pointer(b), dataOffset+bucketCnt*2*ptrSize+i*uintptr(t.valuesize)), true
|
return add(unsafe.Pointer(b), dataOffset+bucketCnt*2*sys.PtrSize+i*uintptr(t.valuesize)), true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return atomic.Loadp(unsafe.Pointer(&zeroptr)), false
|
return atomic.Loadp(unsafe.Pointer(&zeroptr)), false
|
||||||
|
@ -315,12 +316,12 @@ func mapaccess2_faststr(t *maptype, h *hmap, ky string) (unsafe.Pointer, bool) {
|
||||||
if x == empty {
|
if x == empty {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
k := (*stringStruct)(add(unsafe.Pointer(b), dataOffset+i*2*ptrSize))
|
k := (*stringStruct)(add(unsafe.Pointer(b), dataOffset+i*2*sys.PtrSize))
|
||||||
if k.len != key.len {
|
if k.len != key.len {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if k.str == key.str {
|
if k.str == key.str {
|
||||||
return add(unsafe.Pointer(b), dataOffset+bucketCnt*2*ptrSize+i*uintptr(t.valuesize)), true
|
return add(unsafe.Pointer(b), dataOffset+bucketCnt*2*sys.PtrSize+i*uintptr(t.valuesize)), true
|
||||||
}
|
}
|
||||||
// check first 4 bytes
|
// check first 4 bytes
|
||||||
if *((*[4]byte)(key.str)) != *((*[4]byte)(k.str)) {
|
if *((*[4]byte)(key.str)) != *((*[4]byte)(k.str)) {
|
||||||
|
@ -337,9 +338,9 @@ func mapaccess2_faststr(t *maptype, h *hmap, ky string) (unsafe.Pointer, bool) {
|
||||||
keymaybe = i
|
keymaybe = i
|
||||||
}
|
}
|
||||||
if keymaybe != bucketCnt {
|
if keymaybe != bucketCnt {
|
||||||
k := (*stringStruct)(add(unsafe.Pointer(b), dataOffset+keymaybe*2*ptrSize))
|
k := (*stringStruct)(add(unsafe.Pointer(b), dataOffset+keymaybe*2*sys.PtrSize))
|
||||||
if memeq(k.str, key.str, uintptr(key.len)) {
|
if memeq(k.str, key.str, uintptr(key.len)) {
|
||||||
return add(unsafe.Pointer(b), dataOffset+bucketCnt*2*ptrSize+keymaybe*uintptr(t.valuesize)), true
|
return add(unsafe.Pointer(b), dataOffset+bucketCnt*2*sys.PtrSize+keymaybe*uintptr(t.valuesize)), true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return atomic.Loadp(unsafe.Pointer(&zeroptr)), false
|
return atomic.Loadp(unsafe.Pointer(&zeroptr)), false
|
||||||
|
@ -354,7 +355,7 @@ dohash:
|
||||||
b = oldb
|
b = oldb
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
top := uint8(hash >> (ptrSize*8 - 8))
|
top := uint8(hash >> (sys.PtrSize*8 - 8))
|
||||||
if top < minTopHash {
|
if top < minTopHash {
|
||||||
top += minTopHash
|
top += minTopHash
|
||||||
}
|
}
|
||||||
|
@ -364,12 +365,12 @@ dohash:
|
||||||
if x != top {
|
if x != top {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
k := (*stringStruct)(add(unsafe.Pointer(b), dataOffset+i*2*ptrSize))
|
k := (*stringStruct)(add(unsafe.Pointer(b), dataOffset+i*2*sys.PtrSize))
|
||||||
if k.len != key.len {
|
if k.len != key.len {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if k.str == key.str || memeq(k.str, key.str, uintptr(key.len)) {
|
if k.str == key.str || memeq(k.str, key.str, uintptr(key.len)) {
|
||||||
return add(unsafe.Pointer(b), dataOffset+bucketCnt*2*ptrSize+i*uintptr(t.valuesize)), true
|
return add(unsafe.Pointer(b), dataOffset+bucketCnt*2*sys.PtrSize+i*uintptr(t.valuesize)), true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
b = b.overflow(t)
|
b = b.overflow(t)
|
||||||
|
|
|
@ -11,7 +11,10 @@
|
||||||
|
|
||||||
package runtime
|
package runtime
|
||||||
|
|
||||||
import "unsafe"
|
import (
|
||||||
|
"runtime/internal/sys"
|
||||||
|
"unsafe"
|
||||||
|
)
|
||||||
|
|
||||||
//go:linkname runtime_debug_WriteHeapDump runtime/debug.WriteHeapDump
|
//go:linkname runtime_debug_WriteHeapDump runtime/debug.WriteHeapDump
|
||||||
func runtime_debug_WriteHeapDump(fd uintptr) {
|
func runtime_debug_WriteHeapDump(fd uintptr) {
|
||||||
|
@ -233,7 +236,7 @@ func dumpbv(cbv *bitvector, offset uintptr) {
|
||||||
for i := uintptr(0); i < uintptr(bv.n); i++ {
|
for i := uintptr(0); i < uintptr(bv.n); i++ {
|
||||||
if bv.bytedata[i/8]>>(i%8)&1 == 1 {
|
if bv.bytedata[i/8]>>(i%8)&1 == 1 {
|
||||||
dumpint(fieldKindPtr)
|
dumpint(fieldKindPtr)
|
||||||
dumpint(uint64(offset + i*ptrSize))
|
dumpint(uint64(offset + i*sys.PtrSize))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -263,7 +266,7 @@ func dumpframe(s *stkframe, arg unsafe.Pointer) bool {
|
||||||
var bv bitvector
|
var bv bitvector
|
||||||
if stkmap != nil && stkmap.n > 0 {
|
if stkmap != nil && stkmap.n > 0 {
|
||||||
bv = stackmapdata(stkmap, pcdata)
|
bv = stackmapdata(stkmap, pcdata)
|
||||||
dumpbvtypes(&bv, unsafe.Pointer(s.varp-uintptr(bv.n*ptrSize)))
|
dumpbvtypes(&bv, unsafe.Pointer(s.varp-uintptr(bv.n*sys.PtrSize)))
|
||||||
} else {
|
} else {
|
||||||
bv.n = -1
|
bv.n = -1
|
||||||
}
|
}
|
||||||
|
@ -288,7 +291,7 @@ func dumpframe(s *stkframe, arg unsafe.Pointer) bool {
|
||||||
dumpbv(&child.args, child.argoff)
|
dumpbv(&child.args, child.argoff)
|
||||||
} else {
|
} else {
|
||||||
// conservative - everything might be a pointer
|
// conservative - everything might be a pointer
|
||||||
for off := child.argoff; off < child.argoff+child.arglen; off += ptrSize {
|
for off := child.argoff; off < child.argoff+child.arglen; off += sys.PtrSize {
|
||||||
dumpint(fieldKindPtr)
|
dumpint(fieldKindPtr)
|
||||||
dumpint(uint64(off))
|
dumpint(uint64(off))
|
||||||
}
|
}
|
||||||
|
@ -297,21 +300,21 @@ func dumpframe(s *stkframe, arg unsafe.Pointer) bool {
|
||||||
// Dump fields in the local vars section
|
// Dump fields in the local vars section
|
||||||
if stkmap == nil {
|
if stkmap == nil {
|
||||||
// No locals information, dump everything.
|
// No locals information, dump everything.
|
||||||
for off := child.arglen; off < s.varp-s.sp; off += ptrSize {
|
for off := child.arglen; off < s.varp-s.sp; off += sys.PtrSize {
|
||||||
dumpint(fieldKindPtr)
|
dumpint(fieldKindPtr)
|
||||||
dumpint(uint64(off))
|
dumpint(uint64(off))
|
||||||
}
|
}
|
||||||
} else if stkmap.n < 0 {
|
} else if stkmap.n < 0 {
|
||||||
// Locals size information, dump just the locals.
|
// Locals size information, dump just the locals.
|
||||||
size := uintptr(-stkmap.n)
|
size := uintptr(-stkmap.n)
|
||||||
for off := s.varp - size - s.sp; off < s.varp-s.sp; off += ptrSize {
|
for off := s.varp - size - s.sp; off < s.varp-s.sp; off += sys.PtrSize {
|
||||||
dumpint(fieldKindPtr)
|
dumpint(fieldKindPtr)
|
||||||
dumpint(uint64(off))
|
dumpint(uint64(off))
|
||||||
}
|
}
|
||||||
} else if stkmap.n > 0 {
|
} else if stkmap.n > 0 {
|
||||||
// Locals bitmap information, scan just the pointers in
|
// Locals bitmap information, scan just the pointers in
|
||||||
// locals.
|
// locals.
|
||||||
dumpbv(&bv, s.varp-uintptr(bv.n)*ptrSize-s.sp)
|
dumpbv(&bv, s.varp-uintptr(bv.n)*sys.PtrSize-s.sp)
|
||||||
}
|
}
|
||||||
dumpint(fieldKindEol)
|
dumpint(fieldKindEol)
|
||||||
|
|
||||||
|
@ -489,11 +492,11 @@ func dumpparams() {
|
||||||
} else {
|
} else {
|
||||||
dumpbool(true) // big-endian ptrs
|
dumpbool(true) // big-endian ptrs
|
||||||
}
|
}
|
||||||
dumpint(ptrSize)
|
dumpint(sys.PtrSize)
|
||||||
dumpint(uint64(mheap_.arena_start))
|
dumpint(uint64(mheap_.arena_start))
|
||||||
dumpint(uint64(mheap_.arena_used))
|
dumpint(uint64(mheap_.arena_used))
|
||||||
dumpint(thechar)
|
dumpint(sys.TheChar)
|
||||||
dumpstr(goexperiment)
|
dumpstr(sys.Goexperiment)
|
||||||
dumpint(uint64(ncpu))
|
dumpint(uint64(ncpu))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -704,7 +707,7 @@ func dumpbvtypes(bv *bitvector, base unsafe.Pointer) {
|
||||||
|
|
||||||
func makeheapobjbv(p uintptr, size uintptr) bitvector {
|
func makeheapobjbv(p uintptr, size uintptr) bitvector {
|
||||||
// Extend the temp buffer if necessary.
|
// Extend the temp buffer if necessary.
|
||||||
nptr := size / ptrSize
|
nptr := size / sys.PtrSize
|
||||||
if uintptr(len(tmpbuf)) < nptr/8+1 {
|
if uintptr(len(tmpbuf)) < nptr/8+1 {
|
||||||
if tmpbuf != nil {
|
if tmpbuf != nil {
|
||||||
sysFree(unsafe.Pointer(&tmpbuf[0]), uintptr(len(tmpbuf)), &memstats.other_sys)
|
sysFree(unsafe.Pointer(&tmpbuf[0]), uintptr(len(tmpbuf)), &memstats.other_sys)
|
||||||
|
|
|
@ -6,6 +6,7 @@ package runtime
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"runtime/internal/atomic"
|
"runtime/internal/atomic"
|
||||||
|
"runtime/internal/sys"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -69,7 +70,7 @@ func getitab(inter *interfacetype, typ *_type, canfail bool) *itab {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
m = (*itab)(persistentalloc(unsafe.Sizeof(itab{})+uintptr(len(inter.mhdr)-1)*ptrSize, 0, &memstats.other_sys))
|
m = (*itab)(persistentalloc(unsafe.Sizeof(itab{})+uintptr(len(inter.mhdr)-1)*sys.PtrSize, 0, &memstats.other_sys))
|
||||||
m.inter = inter
|
m.inter = inter
|
||||||
m._type = typ
|
m._type = typ
|
||||||
|
|
||||||
|
@ -90,7 +91,7 @@ search:
|
||||||
t := &x.mhdr[j]
|
t := &x.mhdr[j]
|
||||||
if t.mtyp == itype && (t.name == iname || *t.name == *iname) && t.pkgpath == ipkgpath {
|
if t.mtyp == itype && (t.name == iname || *t.name == *iname) && t.pkgpath == ipkgpath {
|
||||||
if m != nil {
|
if m != nil {
|
||||||
*(*unsafe.Pointer)(add(unsafe.Pointer(&m.fun[0]), uintptr(k)*ptrSize)) = t.ifn
|
*(*unsafe.Pointer)(add(unsafe.Pointer(&m.fun[0]), uintptr(k)*sys.PtrSize)) = t.ifn
|
||||||
}
|
}
|
||||||
goto nextimethod
|
goto nextimethod
|
||||||
}
|
}
|
||||||
|
|
19
src/runtime/internal/sys/arch_386.go
Normal file
19
src/runtime/internal/sys/arch_386.go
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
// Copyright 2014 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 sys
|
||||||
|
|
||||||
|
const (
|
||||||
|
TheChar = '8'
|
||||||
|
BigEndian = 0
|
||||||
|
CacheLineSize = 64
|
||||||
|
PhysPageSize = GoosNacl*65536 + (1-GoosNacl)*4096 // 4k normally; 64k on NaCl
|
||||||
|
PCQuantum = 1
|
||||||
|
Int64Align = 4
|
||||||
|
HugePageSize = 1 << 21
|
||||||
|
MinFrameSize = 0
|
||||||
|
)
|
||||||
|
|
||||||
|
type Uintreg uint32
|
||||||
|
type Intptr int32 // TODO(rsc): remove
|
19
src/runtime/internal/sys/arch_amd64.go
Normal file
19
src/runtime/internal/sys/arch_amd64.go
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
// Copyright 2014 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 sys
|
||||||
|
|
||||||
|
const (
|
||||||
|
TheChar = '6'
|
||||||
|
BigEndian = 0
|
||||||
|
CacheLineSize = 64
|
||||||
|
PhysPageSize = 4096
|
||||||
|
PCQuantum = 1
|
||||||
|
Int64Align = 8
|
||||||
|
HugePageSize = 1 << 21
|
||||||
|
MinFrameSize = 0
|
||||||
|
)
|
||||||
|
|
||||||
|
type Uintreg uint64
|
||||||
|
type Intptr int64 // TODO(rsc): remove
|
19
src/runtime/internal/sys/arch_amd64p32.go
Normal file
19
src/runtime/internal/sys/arch_amd64p32.go
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
// Copyright 2014 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 sys
|
||||||
|
|
||||||
|
const (
|
||||||
|
TheChar = '6'
|
||||||
|
BigEndian = 0
|
||||||
|
CacheLineSize = 64
|
||||||
|
PhysPageSize = 65536*GoosNacl + 4096*(1-GoosNacl)
|
||||||
|
PCQuantum = 1
|
||||||
|
Int64Align = 8
|
||||||
|
HugePageSize = 1 << 21
|
||||||
|
MinFrameSize = 0
|
||||||
|
)
|
||||||
|
|
||||||
|
type Uintreg uint64
|
||||||
|
type Intptr int32 // TODO(rsc): remove
|
19
src/runtime/internal/sys/arch_arm.go
Normal file
19
src/runtime/internal/sys/arch_arm.go
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
// Copyright 2014 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 sys
|
||||||
|
|
||||||
|
const (
|
||||||
|
TheChar = '5'
|
||||||
|
BigEndian = 0
|
||||||
|
CacheLineSize = 32
|
||||||
|
PhysPageSize = 65536*GoosNacl + 4096*(1-GoosNacl)
|
||||||
|
PCQuantum = 4
|
||||||
|
Int64Align = 4
|
||||||
|
HugePageSize = 0
|
||||||
|
MinFrameSize = 4
|
||||||
|
)
|
||||||
|
|
||||||
|
type Uintreg uint32
|
||||||
|
type Intptr int32 // TODO(rsc): remove
|
19
src/runtime/internal/sys/arch_arm64.go
Normal file
19
src/runtime/internal/sys/arch_arm64.go
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
// Copyright 2014 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 sys
|
||||||
|
|
||||||
|
const (
|
||||||
|
TheChar = '7'
|
||||||
|
BigEndian = 0
|
||||||
|
CacheLineSize = 32
|
||||||
|
PhysPageSize = 65536
|
||||||
|
PCQuantum = 4
|
||||||
|
Int64Align = 8
|
||||||
|
HugePageSize = 0
|
||||||
|
MinFrameSize = 8
|
||||||
|
)
|
||||||
|
|
||||||
|
type Uintreg uint64
|
||||||
|
type Intptr int64 // TODO(rsc): remove
|
19
src/runtime/internal/sys/arch_ppc64.go
Normal file
19
src/runtime/internal/sys/arch_ppc64.go
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
// Copyright 2014 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 sys
|
||||||
|
|
||||||
|
const (
|
||||||
|
TheChar = '9'
|
||||||
|
BigEndian = 1
|
||||||
|
CacheLineSize = 64
|
||||||
|
PhysPageSize = 65536
|
||||||
|
PCQuantum = 4
|
||||||
|
Int64Align = 8
|
||||||
|
HugePageSize = 0
|
||||||
|
MinFrameSize = 8
|
||||||
|
)
|
||||||
|
|
||||||
|
type Uintreg uint64
|
||||||
|
type Intptr int64 // TODO(rsc): remove
|
19
src/runtime/internal/sys/arch_ppc64le.go
Normal file
19
src/runtime/internal/sys/arch_ppc64le.go
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
// Copyright 2014 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 sys
|
||||||
|
|
||||||
|
const (
|
||||||
|
TheChar = '9'
|
||||||
|
BigEndian = 0
|
||||||
|
CacheLineSize = 64
|
||||||
|
PhysPageSize = 65536
|
||||||
|
PCQuantum = 4
|
||||||
|
Int64Align = 8
|
||||||
|
HugePageSize = 0
|
||||||
|
MinFrameSize = 8
|
||||||
|
)
|
||||||
|
|
||||||
|
type Uintreg uint64
|
||||||
|
type Intptr int64 // TODO(rsc): remove
|
|
@ -18,7 +18,7 @@ import (
|
||||||
var gooses, goarches []string
|
var gooses, goarches []string
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
data, err := ioutil.ReadFile("../go/build/syslist.go")
|
data, err := ioutil.ReadFile("../../../go/build/syslist.go")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -49,14 +49,14 @@ func main() {
|
||||||
if target == "linux" {
|
if target == "linux" {
|
||||||
fmt.Fprintf(&buf, "// +build !android\n\n") // must explicitly exclude android for linux
|
fmt.Fprintf(&buf, "// +build !android\n\n") // must explicitly exclude android for linux
|
||||||
}
|
}
|
||||||
fmt.Fprintf(&buf, "package runtime\n\n")
|
fmt.Fprintf(&buf, "package sys\n\n")
|
||||||
fmt.Fprintf(&buf, "const theGoos = `%s`\n\n", target)
|
fmt.Fprintf(&buf, "const TheGoos = `%s`\n\n", target)
|
||||||
for _, goos := range gooses {
|
for _, goos := range gooses {
|
||||||
value := 0
|
value := 0
|
||||||
if goos == target {
|
if goos == target {
|
||||||
value = 1
|
value = 1
|
||||||
}
|
}
|
||||||
fmt.Fprintf(&buf, "const goos_%s = %d\n", goos, value)
|
fmt.Fprintf(&buf, "const Goos%s = %d\n", strings.Title(goos), value)
|
||||||
}
|
}
|
||||||
err := ioutil.WriteFile("zgoos_"+target+".go", buf.Bytes(), 0666)
|
err := ioutil.WriteFile("zgoos_"+target+".go", buf.Bytes(), 0666)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -67,14 +67,14 @@ func main() {
|
||||||
for _, target := range goarches {
|
for _, target := range goarches {
|
||||||
var buf bytes.Buffer
|
var buf bytes.Buffer
|
||||||
fmt.Fprintf(&buf, "// generated by gengoos.go using 'go generate'\n\n")
|
fmt.Fprintf(&buf, "// generated by gengoos.go using 'go generate'\n\n")
|
||||||
fmt.Fprintf(&buf, "package runtime\n\n")
|
fmt.Fprintf(&buf, "package sys\n\n")
|
||||||
fmt.Fprintf(&buf, "const theGoarch = `%s`\n\n", target)
|
fmt.Fprintf(&buf, "const TheGoarch = `%s`\n\n", target)
|
||||||
for _, goarch := range goarches {
|
for _, goarch := range goarches {
|
||||||
value := 0
|
value := 0
|
||||||
if goarch == target {
|
if goarch == target {
|
||||||
value = 1
|
value = 1
|
||||||
}
|
}
|
||||||
fmt.Fprintf(&buf, "const goarch_%s = %d\n", goarch, value)
|
fmt.Fprintf(&buf, "const Goarch%s = %d\n", strings.Title(goarch), value)
|
||||||
}
|
}
|
||||||
err := ioutil.WriteFile("zgoarch_"+target+".go", buf.Bytes(), 0666)
|
err := ioutil.WriteFile("zgoarch_"+target+".go", buf.Bytes(), 0666)
|
||||||
if err != nil {
|
if err != nil {
|
11
src/runtime/internal/sys/stubs.go
Normal file
11
src/runtime/internal/sys/stubs.go
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
// Copyright 2014 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 sys
|
||||||
|
|
||||||
|
// Declarations for runtime services implemented in C or assembly.
|
||||||
|
|
||||||
|
const PtrSize = 4 << (^uintptr(0) >> 63) // unsafe.Sizeof(uintptr(0)) but an ideal const
|
||||||
|
const RegSize = 4 << (^Uintreg(0) >> 63) // unsafe.Sizeof(uintreg(0)) but an ideal const
|
||||||
|
const SpAlign = 1*(1-GoarchArm64) + 16*GoarchArm64 // SP alignment: 1 normally, 16 for ARM64
|
15
src/runtime/internal/sys/sys.go
Normal file
15
src/runtime/internal/sys/sys.go
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
// Copyright 2015 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 sys contains system- and configuration- and architecture-specific
|
||||||
|
// constants used by the runtime.
|
||||||
|
package sys
|
||||||
|
|
||||||
|
// The next line makes 'go generate' write the zgen_*.go files with
|
||||||
|
// per-OS and per-arch information, including constants
|
||||||
|
// named goos_$GOOS and goarch_$GOARCH for every
|
||||||
|
// known GOOS and GOARCH. The constant is 1 on the
|
||||||
|
// current system, 0 otherwise; multiplying by them is
|
||||||
|
// useful for defining GOOS- or GOARCH-specific constants.
|
||||||
|
//go:generate go run gengoos.go
|
26
src/runtime/internal/sys/zgoarch_386.go
Normal file
26
src/runtime/internal/sys/zgoarch_386.go
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
// generated by gengoos.go using 'go generate'
|
||||||
|
|
||||||
|
package sys
|
||||||
|
|
||||||
|
const TheGoarch = `386`
|
||||||
|
|
||||||
|
const Goarch386 = 1
|
||||||
|
const GoarchAmd64 = 0
|
||||||
|
const GoarchAmd64p32 = 0
|
||||||
|
const GoarchArm = 0
|
||||||
|
const GoarchArmbe = 0
|
||||||
|
const GoarchArm64 = 0
|
||||||
|
const GoarchArm64be = 0
|
||||||
|
const GoarchPpc64 = 0
|
||||||
|
const GoarchPpc64le = 0
|
||||||
|
const GoarchMips = 0
|
||||||
|
const GoarchMipsle = 0
|
||||||
|
const GoarchMips64 = 0
|
||||||
|
const GoarchMips64le = 0
|
||||||
|
const GoarchMips64p32 = 0
|
||||||
|
const GoarchMips64p32le = 0
|
||||||
|
const GoarchPpc = 0
|
||||||
|
const GoarchS390 = 0
|
||||||
|
const GoarchS390x = 0
|
||||||
|
const GoarchSparc = 0
|
||||||
|
const GoarchSparc64 = 0
|
26
src/runtime/internal/sys/zgoarch_amd64.go
Normal file
26
src/runtime/internal/sys/zgoarch_amd64.go
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
// generated by gengoos.go using 'go generate'
|
||||||
|
|
||||||
|
package sys
|
||||||
|
|
||||||
|
const TheGoarch = `amd64`
|
||||||
|
|
||||||
|
const Goarch386 = 0
|
||||||
|
const GoarchAmd64 = 1
|
||||||
|
const GoarchAmd64p32 = 0
|
||||||
|
const GoarchArm = 0
|
||||||
|
const GoarchArmbe = 0
|
||||||
|
const GoarchArm64 = 0
|
||||||
|
const GoarchArm64be = 0
|
||||||
|
const GoarchPpc64 = 0
|
||||||
|
const GoarchPpc64le = 0
|
||||||
|
const GoarchMips = 0
|
||||||
|
const GoarchMipsle = 0
|
||||||
|
const GoarchMips64 = 0
|
||||||
|
const GoarchMips64le = 0
|
||||||
|
const GoarchMips64p32 = 0
|
||||||
|
const GoarchMips64p32le = 0
|
||||||
|
const GoarchPpc = 0
|
||||||
|
const GoarchS390 = 0
|
||||||
|
const GoarchS390x = 0
|
||||||
|
const GoarchSparc = 0
|
||||||
|
const GoarchSparc64 = 0
|
26
src/runtime/internal/sys/zgoarch_amd64p32.go
Normal file
26
src/runtime/internal/sys/zgoarch_amd64p32.go
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
// generated by gengoos.go using 'go generate'
|
||||||
|
|
||||||
|
package sys
|
||||||
|
|
||||||
|
const TheGoarch = `amd64p32`
|
||||||
|
|
||||||
|
const Goarch386 = 0
|
||||||
|
const GoarchAmd64 = 0
|
||||||
|
const GoarchAmd64p32 = 1
|
||||||
|
const GoarchArm = 0
|
||||||
|
const GoarchArmbe = 0
|
||||||
|
const GoarchArm64 = 0
|
||||||
|
const GoarchArm64be = 0
|
||||||
|
const GoarchPpc64 = 0
|
||||||
|
const GoarchPpc64le = 0
|
||||||
|
const GoarchMips = 0
|
||||||
|
const GoarchMipsle = 0
|
||||||
|
const GoarchMips64 = 0
|
||||||
|
const GoarchMips64le = 0
|
||||||
|
const GoarchMips64p32 = 0
|
||||||
|
const GoarchMips64p32le = 0
|
||||||
|
const GoarchPpc = 0
|
||||||
|
const GoarchS390 = 0
|
||||||
|
const GoarchS390x = 0
|
||||||
|
const GoarchSparc = 0
|
||||||
|
const GoarchSparc64 = 0
|
26
src/runtime/internal/sys/zgoarch_arm.go
Normal file
26
src/runtime/internal/sys/zgoarch_arm.go
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
// generated by gengoos.go using 'go generate'
|
||||||
|
|
||||||
|
package sys
|
||||||
|
|
||||||
|
const TheGoarch = `arm`
|
||||||
|
|
||||||
|
const Goarch386 = 0
|
||||||
|
const GoarchAmd64 = 0
|
||||||
|
const GoarchAmd64p32 = 0
|
||||||
|
const GoarchArm = 1
|
||||||
|
const GoarchArmbe = 0
|
||||||
|
const GoarchArm64 = 0
|
||||||
|
const GoarchArm64be = 0
|
||||||
|
const GoarchPpc64 = 0
|
||||||
|
const GoarchPpc64le = 0
|
||||||
|
const GoarchMips = 0
|
||||||
|
const GoarchMipsle = 0
|
||||||
|
const GoarchMips64 = 0
|
||||||
|
const GoarchMips64le = 0
|
||||||
|
const GoarchMips64p32 = 0
|
||||||
|
const GoarchMips64p32le = 0
|
||||||
|
const GoarchPpc = 0
|
||||||
|
const GoarchS390 = 0
|
||||||
|
const GoarchS390x = 0
|
||||||
|
const GoarchSparc = 0
|
||||||
|
const GoarchSparc64 = 0
|
26
src/runtime/internal/sys/zgoarch_arm64.go
Normal file
26
src/runtime/internal/sys/zgoarch_arm64.go
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
// generated by gengoos.go using 'go generate'
|
||||||
|
|
||||||
|
package sys
|
||||||
|
|
||||||
|
const TheGoarch = `arm64`
|
||||||
|
|
||||||
|
const Goarch386 = 0
|
||||||
|
const GoarchAmd64 = 0
|
||||||
|
const GoarchAmd64p32 = 0
|
||||||
|
const GoarchArm = 0
|
||||||
|
const GoarchArmbe = 0
|
||||||
|
const GoarchArm64 = 1
|
||||||
|
const GoarchArm64be = 0
|
||||||
|
const GoarchPpc64 = 0
|
||||||
|
const GoarchPpc64le = 0
|
||||||
|
const GoarchMips = 0
|
||||||
|
const GoarchMipsle = 0
|
||||||
|
const GoarchMips64 = 0
|
||||||
|
const GoarchMips64le = 0
|
||||||
|
const GoarchMips64p32 = 0
|
||||||
|
const GoarchMips64p32le = 0
|
||||||
|
const GoarchPpc = 0
|
||||||
|
const GoarchS390 = 0
|
||||||
|
const GoarchS390x = 0
|
||||||
|
const GoarchSparc = 0
|
||||||
|
const GoarchSparc64 = 0
|
26
src/runtime/internal/sys/zgoarch_ppc64.go
Normal file
26
src/runtime/internal/sys/zgoarch_ppc64.go
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
// generated by gengoos.go using 'go generate'
|
||||||
|
|
||||||
|
package sys
|
||||||
|
|
||||||
|
const TheGoarch = `ppc64`
|
||||||
|
|
||||||
|
const Goarch386 = 0
|
||||||
|
const GoarchAmd64 = 0
|
||||||
|
const GoarchAmd64p32 = 0
|
||||||
|
const GoarchArm = 0
|
||||||
|
const GoarchArmbe = 0
|
||||||
|
const GoarchArm64 = 0
|
||||||
|
const GoarchArm64be = 0
|
||||||
|
const GoarchPpc64 = 1
|
||||||
|
const GoarchPpc64le = 0
|
||||||
|
const GoarchMips = 0
|
||||||
|
const GoarchMipsle = 0
|
||||||
|
const GoarchMips64 = 0
|
||||||
|
const GoarchMips64le = 0
|
||||||
|
const GoarchMips64p32 = 0
|
||||||
|
const GoarchMips64p32le = 0
|
||||||
|
const GoarchPpc = 0
|
||||||
|
const GoarchS390 = 0
|
||||||
|
const GoarchS390x = 0
|
||||||
|
const GoarchSparc = 0
|
||||||
|
const GoarchSparc64 = 0
|
26
src/runtime/internal/sys/zgoarch_ppc64le.go
Normal file
26
src/runtime/internal/sys/zgoarch_ppc64le.go
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
// generated by gengoos.go using 'go generate'
|
||||||
|
|
||||||
|
package sys
|
||||||
|
|
||||||
|
const TheGoarch = `ppc64le`
|
||||||
|
|
||||||
|
const Goarch386 = 0
|
||||||
|
const GoarchAmd64 = 0
|
||||||
|
const GoarchAmd64p32 = 0
|
||||||
|
const GoarchArm = 0
|
||||||
|
const GoarchArmbe = 0
|
||||||
|
const GoarchArm64 = 0
|
||||||
|
const GoarchArm64be = 0
|
||||||
|
const GoarchPpc64 = 0
|
||||||
|
const GoarchPpc64le = 1
|
||||||
|
const GoarchMips = 0
|
||||||
|
const GoarchMipsle = 0
|
||||||
|
const GoarchMips64 = 0
|
||||||
|
const GoarchMips64le = 0
|
||||||
|
const GoarchMips64p32 = 0
|
||||||
|
const GoarchMips64p32le = 0
|
||||||
|
const GoarchPpc = 0
|
||||||
|
const GoarchS390 = 0
|
||||||
|
const GoarchS390x = 0
|
||||||
|
const GoarchSparc = 0
|
||||||
|
const GoarchSparc64 = 0
|
17
src/runtime/internal/sys/zgoos_android.go
Normal file
17
src/runtime/internal/sys/zgoos_android.go
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
// generated by gengoos.go using 'go generate'
|
||||||
|
|
||||||
|
package sys
|
||||||
|
|
||||||
|
const TheGoos = `android`
|
||||||
|
|
||||||
|
const GoosAndroid = 1
|
||||||
|
const GoosDarwin = 0
|
||||||
|
const GoosDragonfly = 0
|
||||||
|
const GoosFreebsd = 0
|
||||||
|
const GoosLinux = 0
|
||||||
|
const GoosNacl = 0
|
||||||
|
const GoosNetbsd = 0
|
||||||
|
const GoosOpenbsd = 0
|
||||||
|
const GoosPlan9 = 0
|
||||||
|
const GoosSolaris = 0
|
||||||
|
const GoosWindows = 0
|
17
src/runtime/internal/sys/zgoos_darwin.go
Normal file
17
src/runtime/internal/sys/zgoos_darwin.go
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
// generated by gengoos.go using 'go generate'
|
||||||
|
|
||||||
|
package sys
|
||||||
|
|
||||||
|
const TheGoos = `darwin`
|
||||||
|
|
||||||
|
const GoosAndroid = 0
|
||||||
|
const GoosDarwin = 1
|
||||||
|
const GoosDragonfly = 0
|
||||||
|
const GoosFreebsd = 0
|
||||||
|
const GoosLinux = 0
|
||||||
|
const GoosNacl = 0
|
||||||
|
const GoosNetbsd = 0
|
||||||
|
const GoosOpenbsd = 0
|
||||||
|
const GoosPlan9 = 0
|
||||||
|
const GoosSolaris = 0
|
||||||
|
const GoosWindows = 0
|
17
src/runtime/internal/sys/zgoos_dragonfly.go
Normal file
17
src/runtime/internal/sys/zgoos_dragonfly.go
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
// generated by gengoos.go using 'go generate'
|
||||||
|
|
||||||
|
package sys
|
||||||
|
|
||||||
|
const TheGoos = `dragonfly`
|
||||||
|
|
||||||
|
const GoosAndroid = 0
|
||||||
|
const GoosDarwin = 0
|
||||||
|
const GoosDragonfly = 1
|
||||||
|
const GoosFreebsd = 0
|
||||||
|
const GoosLinux = 0
|
||||||
|
const GoosNacl = 0
|
||||||
|
const GoosNetbsd = 0
|
||||||
|
const GoosOpenbsd = 0
|
||||||
|
const GoosPlan9 = 0
|
||||||
|
const GoosSolaris = 0
|
||||||
|
const GoosWindows = 0
|
17
src/runtime/internal/sys/zgoos_freebsd.go
Normal file
17
src/runtime/internal/sys/zgoos_freebsd.go
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
// generated by gengoos.go using 'go generate'
|
||||||
|
|
||||||
|
package sys
|
||||||
|
|
||||||
|
const TheGoos = `freebsd`
|
||||||
|
|
||||||
|
const GoosAndroid = 0
|
||||||
|
const GoosDarwin = 0
|
||||||
|
const GoosDragonfly = 0
|
||||||
|
const GoosFreebsd = 1
|
||||||
|
const GoosLinux = 0
|
||||||
|
const GoosNacl = 0
|
||||||
|
const GoosNetbsd = 0
|
||||||
|
const GoosOpenbsd = 0
|
||||||
|
const GoosPlan9 = 0
|
||||||
|
const GoosSolaris = 0
|
||||||
|
const GoosWindows = 0
|
19
src/runtime/internal/sys/zgoos_linux.go
Normal file
19
src/runtime/internal/sys/zgoos_linux.go
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
// generated by gengoos.go using 'go generate'
|
||||||
|
|
||||||
|
// +build !android
|
||||||
|
|
||||||
|
package sys
|
||||||
|
|
||||||
|
const TheGoos = `linux`
|
||||||
|
|
||||||
|
const GoosAndroid = 0
|
||||||
|
const GoosDarwin = 0
|
||||||
|
const GoosDragonfly = 0
|
||||||
|
const GoosFreebsd = 0
|
||||||
|
const GoosLinux = 1
|
||||||
|
const GoosNacl = 0
|
||||||
|
const GoosNetbsd = 0
|
||||||
|
const GoosOpenbsd = 0
|
||||||
|
const GoosPlan9 = 0
|
||||||
|
const GoosSolaris = 0
|
||||||
|
const GoosWindows = 0
|
17
src/runtime/internal/sys/zgoos_nacl.go
Normal file
17
src/runtime/internal/sys/zgoos_nacl.go
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
// generated by gengoos.go using 'go generate'
|
||||||
|
|
||||||
|
package sys
|
||||||
|
|
||||||
|
const TheGoos = `nacl`
|
||||||
|
|
||||||
|
const GoosAndroid = 0
|
||||||
|
const GoosDarwin = 0
|
||||||
|
const GoosDragonfly = 0
|
||||||
|
const GoosFreebsd = 0
|
||||||
|
const GoosLinux = 0
|
||||||
|
const GoosNacl = 1
|
||||||
|
const GoosNetbsd = 0
|
||||||
|
const GoosOpenbsd = 0
|
||||||
|
const GoosPlan9 = 0
|
||||||
|
const GoosSolaris = 0
|
||||||
|
const GoosWindows = 0
|
17
src/runtime/internal/sys/zgoos_netbsd.go
Normal file
17
src/runtime/internal/sys/zgoos_netbsd.go
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
// generated by gengoos.go using 'go generate'
|
||||||
|
|
||||||
|
package sys
|
||||||
|
|
||||||
|
const TheGoos = `netbsd`
|
||||||
|
|
||||||
|
const GoosAndroid = 0
|
||||||
|
const GoosDarwin = 0
|
||||||
|
const GoosDragonfly = 0
|
||||||
|
const GoosFreebsd = 0
|
||||||
|
const GoosLinux = 0
|
||||||
|
const GoosNacl = 0
|
||||||
|
const GoosNetbsd = 1
|
||||||
|
const GoosOpenbsd = 0
|
||||||
|
const GoosPlan9 = 0
|
||||||
|
const GoosSolaris = 0
|
||||||
|
const GoosWindows = 0
|
17
src/runtime/internal/sys/zgoos_openbsd.go
Normal file
17
src/runtime/internal/sys/zgoos_openbsd.go
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
// generated by gengoos.go using 'go generate'
|
||||||
|
|
||||||
|
package sys
|
||||||
|
|
||||||
|
const TheGoos = `openbsd`
|
||||||
|
|
||||||
|
const GoosAndroid = 0
|
||||||
|
const GoosDarwin = 0
|
||||||
|
const GoosDragonfly = 0
|
||||||
|
const GoosFreebsd = 0
|
||||||
|
const GoosLinux = 0
|
||||||
|
const GoosNacl = 0
|
||||||
|
const GoosNetbsd = 0
|
||||||
|
const GoosOpenbsd = 1
|
||||||
|
const GoosPlan9 = 0
|
||||||
|
const GoosSolaris = 0
|
||||||
|
const GoosWindows = 0
|
17
src/runtime/internal/sys/zgoos_plan9.go
Normal file
17
src/runtime/internal/sys/zgoos_plan9.go
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
// generated by gengoos.go using 'go generate'
|
||||||
|
|
||||||
|
package sys
|
||||||
|
|
||||||
|
const TheGoos = `plan9`
|
||||||
|
|
||||||
|
const GoosAndroid = 0
|
||||||
|
const GoosDarwin = 0
|
||||||
|
const GoosDragonfly = 0
|
||||||
|
const GoosFreebsd = 0
|
||||||
|
const GoosLinux = 0
|
||||||
|
const GoosNacl = 0
|
||||||
|
const GoosNetbsd = 0
|
||||||
|
const GoosOpenbsd = 0
|
||||||
|
const GoosPlan9 = 1
|
||||||
|
const GoosSolaris = 0
|
||||||
|
const GoosWindows = 0
|
17
src/runtime/internal/sys/zgoos_solaris.go
Normal file
17
src/runtime/internal/sys/zgoos_solaris.go
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
// generated by gengoos.go using 'go generate'
|
||||||
|
|
||||||
|
package sys
|
||||||
|
|
||||||
|
const TheGoos = `solaris`
|
||||||
|
|
||||||
|
const GoosAndroid = 0
|
||||||
|
const GoosDarwin = 0
|
||||||
|
const GoosDragonfly = 0
|
||||||
|
const GoosFreebsd = 0
|
||||||
|
const GoosLinux = 0
|
||||||
|
const GoosNacl = 0
|
||||||
|
const GoosNetbsd = 0
|
||||||
|
const GoosOpenbsd = 0
|
||||||
|
const GoosPlan9 = 0
|
||||||
|
const GoosSolaris = 1
|
||||||
|
const GoosWindows = 0
|
17
src/runtime/internal/sys/zgoos_windows.go
Normal file
17
src/runtime/internal/sys/zgoos_windows.go
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
// generated by gengoos.go using 'go generate'
|
||||||
|
|
||||||
|
package sys
|
||||||
|
|
||||||
|
const TheGoos = `windows`
|
||||||
|
|
||||||
|
const GoosAndroid = 0
|
||||||
|
const GoosDarwin = 0
|
||||||
|
const GoosDragonfly = 0
|
||||||
|
const GoosFreebsd = 0
|
||||||
|
const GoosLinux = 0
|
||||||
|
const GoosNacl = 0
|
||||||
|
const GoosNetbsd = 0
|
||||||
|
const GoosOpenbsd = 0
|
||||||
|
const GoosPlan9 = 0
|
||||||
|
const GoosSolaris = 0
|
||||||
|
const GoosWindows = 1
|
|
@ -79,7 +79,10 @@
|
||||||
|
|
||||||
package runtime
|
package runtime
|
||||||
|
|
||||||
import "unsafe"
|
import (
|
||||||
|
"runtime/internal/sys"
|
||||||
|
"unsafe"
|
||||||
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
debugMalloc = false
|
debugMalloc = false
|
||||||
|
@ -143,7 +146,7 @@ const (
|
||||||
// windows/32 | 4KB | 3
|
// windows/32 | 4KB | 3
|
||||||
// windows/64 | 8KB | 2
|
// windows/64 | 8KB | 2
|
||||||
// plan9 | 4KB | 3
|
// plan9 | 4KB | 3
|
||||||
_NumStackOrders = 4 - ptrSize/4*goos_windows - 1*goos_plan9
|
_NumStackOrders = 4 - sys.PtrSize/4*sys.GoosWindows - 1*sys.GoosPlan9
|
||||||
|
|
||||||
// Number of bits in page to span calculations (4k pages).
|
// Number of bits in page to span calculations (4k pages).
|
||||||
// On Windows 64-bit we limit the arena to 32GB or 35 bits.
|
// On Windows 64-bit we limit the arena to 32GB or 35 bits.
|
||||||
|
@ -155,7 +158,7 @@ const (
|
||||||
// On Darwin/arm64, we cannot reserve more than ~5GB of virtual memory,
|
// On Darwin/arm64, we cannot reserve more than ~5GB of virtual memory,
|
||||||
// but as most devices have less than 4GB of physical memory anyway, we
|
// but as most devices have less than 4GB of physical memory anyway, we
|
||||||
// try to be conservative here, and only ask for a 2GB heap.
|
// try to be conservative here, and only ask for a 2GB heap.
|
||||||
_MHeapMap_TotalBits = (_64bit*goos_windows)*35 + (_64bit*(1-goos_windows)*(1-goos_darwin*goarch_arm64))*39 + goos_darwin*goarch_arm64*31 + (1-_64bit)*32
|
_MHeapMap_TotalBits = (_64bit*sys.GoosWindows)*35 + (_64bit*(1-sys.GoosWindows)*(1-sys.GoosDarwin*sys.GoarchArm64))*39 + sys.GoosDarwin*sys.GoarchArm64*31 + (1-_64bit)*32
|
||||||
_MHeapMap_Bits = _MHeapMap_TotalBits - _PageShift
|
_MHeapMap_Bits = _MHeapMap_TotalBits - _PageShift
|
||||||
|
|
||||||
_MaxMem = uintptr(1<<_MHeapMap_TotalBits - 1)
|
_MaxMem = uintptr(1<<_MHeapMap_TotalBits - 1)
|
||||||
|
@ -228,7 +231,7 @@ func mallocinit() {
|
||||||
// Set up the allocation arena, a contiguous area of memory where
|
// Set up the allocation arena, a contiguous area of memory where
|
||||||
// allocated data will be found. The arena begins with a bitmap large
|
// allocated data will be found. The arena begins with a bitmap large
|
||||||
// enough to hold 4 bits per allocated word.
|
// enough to hold 4 bits per allocated word.
|
||||||
if ptrSize == 8 && (limit == 0 || limit > 1<<30) {
|
if sys.PtrSize == 8 && (limit == 0 || limit > 1<<30) {
|
||||||
// On a 64-bit machine, allocate from a single contiguous reservation.
|
// On a 64-bit machine, allocate from a single contiguous reservation.
|
||||||
// 512 GB (MaxMem) should be big enough for now.
|
// 512 GB (MaxMem) should be big enough for now.
|
||||||
//
|
//
|
||||||
|
@ -259,8 +262,8 @@ func mallocinit() {
|
||||||
// translation buffers, the user address space is limited to 39 bits
|
// translation buffers, the user address space is limited to 39 bits
|
||||||
// On darwin/arm64, the address space is even smaller.
|
// On darwin/arm64, the address space is even smaller.
|
||||||
arenaSize := round(_MaxMem, _PageSize)
|
arenaSize := round(_MaxMem, _PageSize)
|
||||||
bitmapSize = arenaSize / (ptrSize * 8 / 4)
|
bitmapSize = arenaSize / (sys.PtrSize * 8 / 4)
|
||||||
spansSize = arenaSize / _PageSize * ptrSize
|
spansSize = arenaSize / _PageSize * sys.PtrSize
|
||||||
spansSize = round(spansSize, _PageSize)
|
spansSize = round(spansSize, _PageSize)
|
||||||
for i := 0; i <= 0x7f; i++ {
|
for i := 0; i <= 0x7f; i++ {
|
||||||
switch {
|
switch {
|
||||||
|
@ -308,12 +311,12 @@ func mallocinit() {
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, arenaSize := range arenaSizes {
|
for _, arenaSize := range arenaSizes {
|
||||||
bitmapSize = _MaxArena32 / (ptrSize * 8 / 4)
|
bitmapSize = _MaxArena32 / (sys.PtrSize * 8 / 4)
|
||||||
spansSize = _MaxArena32 / _PageSize * ptrSize
|
spansSize = _MaxArena32 / _PageSize * sys.PtrSize
|
||||||
if limit > 0 && arenaSize+bitmapSize+spansSize > limit {
|
if limit > 0 && arenaSize+bitmapSize+spansSize > limit {
|
||||||
bitmapSize = (limit / 9) &^ ((1 << _PageShift) - 1)
|
bitmapSize = (limit / 9) &^ ((1 << _PageShift) - 1)
|
||||||
arenaSize = bitmapSize * 8
|
arenaSize = bitmapSize * 8
|
||||||
spansSize = arenaSize / _PageSize * ptrSize
|
spansSize = arenaSize / _PageSize * sys.PtrSize
|
||||||
}
|
}
|
||||||
spansSize = round(spansSize, _PageSize)
|
spansSize = round(spansSize, _PageSize)
|
||||||
|
|
||||||
|
@ -368,7 +371,7 @@ func mallocinit() {
|
||||||
// needed. This doesn't work well with the "let the kernel pick an address"
|
// needed. This doesn't work well with the "let the kernel pick an address"
|
||||||
// mode, so don't do that. Pick a high address instead.
|
// mode, so don't do that. Pick a high address instead.
|
||||||
func sysReserveHigh(n uintptr, reserved *bool) unsafe.Pointer {
|
func sysReserveHigh(n uintptr, reserved *bool) unsafe.Pointer {
|
||||||
if ptrSize == 4 {
|
if sys.PtrSize == 4 {
|
||||||
return sysReserve(nil, n, reserved)
|
return sysReserve(nil, n, reserved)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -642,7 +645,7 @@ func mallocgc(size uintptr, typ *_type, flags uint32) unsafe.Pointer {
|
||||||
x = unsafe.Pointer(v)
|
x = unsafe.Pointer(v)
|
||||||
if flags&flagNoZero == 0 {
|
if flags&flagNoZero == 0 {
|
||||||
v.ptr().next = 0
|
v.ptr().next = 0
|
||||||
if size > 2*ptrSize && ((*[2]uintptr)(x))[1] != 0 {
|
if size > 2*sys.PtrSize && ((*[2]uintptr)(x))[1] != 0 {
|
||||||
memclr(unsafe.Pointer(v), size)
|
memclr(unsafe.Pointer(v), size)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,7 +13,10 @@
|
||||||
|
|
||||||
package runtime
|
package runtime
|
||||||
|
|
||||||
import "unsafe"
|
import (
|
||||||
|
"runtime/internal/sys"
|
||||||
|
"unsafe"
|
||||||
|
)
|
||||||
|
|
||||||
// markwb is the mark-phase write barrier, the only barrier we have.
|
// markwb is the mark-phase write barrier, the only barrier we have.
|
||||||
// The rest of this file exists only to make calls to this function.
|
// The rest of this file exists only to make calls to this function.
|
||||||
|
@ -128,7 +131,7 @@ func writebarrierptr(dst *uintptr, src uintptr) {
|
||||||
if !writeBarrierEnabled {
|
if !writeBarrierEnabled {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if src != 0 && (src < _PhysPageSize || src == poisonStack) {
|
if src != 0 && (src < sys.PhysPageSize || src == poisonStack) {
|
||||||
systemstack(func() {
|
systemstack(func() {
|
||||||
print("runtime: writebarrierptr *", dst, " = ", hex(src), "\n")
|
print("runtime: writebarrierptr *", dst, " = ", hex(src), "\n")
|
||||||
throw("bad pointer in write barrier")
|
throw("bad pointer in write barrier")
|
||||||
|
@ -144,7 +147,7 @@ func writebarrierptr_nostore(dst *uintptr, src uintptr) {
|
||||||
if !writeBarrierEnabled {
|
if !writeBarrierEnabled {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if src != 0 && (src < _PhysPageSize || src == poisonStack) {
|
if src != 0 && (src < sys.PhysPageSize || src == poisonStack) {
|
||||||
systemstack(func() { throw("bad pointer in write barrier") })
|
systemstack(func() { throw("bad pointer in write barrier") })
|
||||||
}
|
}
|
||||||
writebarrierptr_nostore1(dst, src)
|
writebarrierptr_nostore1(dst, src)
|
||||||
|
@ -195,15 +198,15 @@ func reflect_typedmemmove(typ *_type, dst, src unsafe.Pointer) {
|
||||||
//go:linkname reflect_typedmemmovepartial reflect.typedmemmovepartial
|
//go:linkname reflect_typedmemmovepartial reflect.typedmemmovepartial
|
||||||
func reflect_typedmemmovepartial(typ *_type, dst, src unsafe.Pointer, off, size uintptr) {
|
func reflect_typedmemmovepartial(typ *_type, dst, src unsafe.Pointer, off, size uintptr) {
|
||||||
memmove(dst, src, size)
|
memmove(dst, src, size)
|
||||||
if !writeBarrierEnabled || typ.kind&kindNoPointers != 0 || size < ptrSize || !inheap(uintptr(dst)) {
|
if !writeBarrierEnabled || typ.kind&kindNoPointers != 0 || size < sys.PtrSize || !inheap(uintptr(dst)) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if frag := -off & (ptrSize - 1); frag != 0 {
|
if frag := -off & (sys.PtrSize - 1); frag != 0 {
|
||||||
dst = add(dst, frag)
|
dst = add(dst, frag)
|
||||||
size -= frag
|
size -= frag
|
||||||
}
|
}
|
||||||
heapBitsBulkBarrier(uintptr(dst), size&^(ptrSize-1))
|
heapBitsBulkBarrier(uintptr(dst), size&^(sys.PtrSize-1))
|
||||||
}
|
}
|
||||||
|
|
||||||
// callwritebarrier is invoked at the end of reflectcall, to execute
|
// callwritebarrier is invoked at the end of reflectcall, to execute
|
||||||
|
@ -215,7 +218,7 @@ func reflect_typedmemmovepartial(typ *_type, dst, src unsafe.Pointer, off, size
|
||||||
// not to be preempted before the write barriers have been run.
|
// not to be preempted before the write barriers have been run.
|
||||||
//go:nosplit
|
//go:nosplit
|
||||||
func callwritebarrier(typ *_type, frame unsafe.Pointer, framesize, retoffset uintptr) {
|
func callwritebarrier(typ *_type, frame unsafe.Pointer, framesize, retoffset uintptr) {
|
||||||
if !writeBarrierEnabled || typ == nil || typ.kind&kindNoPointers != 0 || framesize-retoffset < ptrSize || !inheap(uintptr(frame)) {
|
if !writeBarrierEnabled || typ == nil || typ.kind&kindNoPointers != 0 || framesize-retoffset < sys.PtrSize || !inheap(uintptr(frame)) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
heapBitsBulkBarrier(uintptr(add(frame, retoffset)), framesize-retoffset)
|
heapBitsBulkBarrier(uintptr(add(frame, retoffset)), framesize-retoffset)
|
||||||
|
|
|
@ -68,6 +68,7 @@ package runtime
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"runtime/internal/atomic"
|
"runtime/internal/atomic"
|
||||||
|
"runtime/internal/sys"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -75,8 +76,8 @@ const (
|
||||||
bitPointer = 1 << 0
|
bitPointer = 1 << 0
|
||||||
bitMarked = 1 << 4
|
bitMarked = 1 << 4
|
||||||
|
|
||||||
heapBitsShift = 1 // shift offset between successive bitPointer or bitMarked entries
|
heapBitsShift = 1 // shift offset between successive bitPointer or bitMarked entries
|
||||||
heapBitmapScale = ptrSize * (8 / 2) // number of data bytes described by one heap bitmap byte
|
heapBitmapScale = sys.PtrSize * (8 / 2) // number of data bytes described by one heap bitmap byte
|
||||||
|
|
||||||
// all mark/pointer bits in a byte
|
// all mark/pointer bits in a byte
|
||||||
bitMarkedAll = bitMarked | bitMarked<<heapBitsShift | bitMarked<<(2*heapBitsShift) | bitMarked<<(3*heapBitsShift)
|
bitMarkedAll = bitMarked | bitMarked<<heapBitsShift | bitMarked<<(2*heapBitsShift) | bitMarked<<(3*heapBitsShift)
|
||||||
|
@ -139,7 +140,7 @@ func (h *mheap) mapBits(arena_used uintptr) {
|
||||||
|
|
||||||
n := (arena_used - mheap_.arena_start) / heapBitmapScale
|
n := (arena_used - mheap_.arena_start) / heapBitmapScale
|
||||||
n = round(n, bitmapChunk)
|
n = round(n, bitmapChunk)
|
||||||
n = round(n, _PhysPageSize)
|
n = round(n, sys.PhysPageSize)
|
||||||
if h.bitmap_mapped >= n {
|
if h.bitmap_mapped >= n {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -164,7 +165,7 @@ type heapBits struct {
|
||||||
//go:nosplit
|
//go:nosplit
|
||||||
func heapBitsForAddr(addr uintptr) heapBits {
|
func heapBitsForAddr(addr uintptr) heapBits {
|
||||||
// 2 bits per work, 4 pairs per byte, and a mask is hard coded.
|
// 2 bits per work, 4 pairs per byte, and a mask is hard coded.
|
||||||
off := (addr - mheap_.arena_start) / ptrSize
|
off := (addr - mheap_.arena_start) / sys.PtrSize
|
||||||
return heapBits{(*uint8)(unsafe.Pointer(mheap_.arena_start - off/4 - 1)), uint32(off & 3)}
|
return heapBits{(*uint8)(unsafe.Pointer(mheap_.arena_start - off/4 - 1)), uint32(off & 3)}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -328,7 +329,7 @@ func (h heapBits) isPointer() bool {
|
||||||
// far into the bitmap.
|
// far into the bitmap.
|
||||||
// h must describe the initial word of the object.
|
// h must describe the initial word of the object.
|
||||||
func (h heapBits) hasPointers(size uintptr) bool {
|
func (h heapBits) hasPointers(size uintptr) bool {
|
||||||
if size == ptrSize { // 1-word objects are always pointers
|
if size == sys.PtrSize { // 1-word objects are always pointers
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
// Otherwise, at least a 2-word object, and at least 2-word aligned,
|
// Otherwise, at least a 2-word object, and at least 2-word aligned,
|
||||||
|
@ -339,7 +340,7 @@ func (h heapBits) hasPointers(size uintptr) bool {
|
||||||
if b&(bitPointer|bitPointer<<heapBitsShift) != 0 {
|
if b&(bitPointer|bitPointer<<heapBitsShift) != 0 {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
if size == 2*ptrSize {
|
if size == 2*sys.PtrSize {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
// At least a 4-word object. Check scan bit (aka marked bit) in third word.
|
// At least a 4-word object. Check scan bit (aka marked bit) in third word.
|
||||||
|
@ -354,7 +355,7 @@ func (h heapBits) hasPointers(size uintptr) bool {
|
||||||
// checkmark bit varies by size.
|
// checkmark bit varies by size.
|
||||||
// h must describe the initial word of the object.
|
// h must describe the initial word of the object.
|
||||||
func (h heapBits) isCheckmarked(size uintptr) bool {
|
func (h heapBits) isCheckmarked(size uintptr) bool {
|
||||||
if size == ptrSize {
|
if size == sys.PtrSize {
|
||||||
return (*h.bitp>>h.shift)&bitPointer != 0
|
return (*h.bitp>>h.shift)&bitPointer != 0
|
||||||
}
|
}
|
||||||
// All multiword objects are 2-word aligned,
|
// All multiword objects are 2-word aligned,
|
||||||
|
@ -369,7 +370,7 @@ func (h heapBits) isCheckmarked(size uintptr) bool {
|
||||||
// checkmark bit varies by size.
|
// checkmark bit varies by size.
|
||||||
// h must describe the initial word of the object.
|
// h must describe the initial word of the object.
|
||||||
func (h heapBits) setCheckmarked(size uintptr) {
|
func (h heapBits) setCheckmarked(size uintptr) {
|
||||||
if size == ptrSize {
|
if size == sys.PtrSize {
|
||||||
atomic.Or8(h.bitp, bitPointer<<h.shift)
|
atomic.Or8(h.bitp, bitPointer<<h.shift)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -395,7 +396,7 @@ func (h heapBits) setCheckmarked(size uintptr) {
|
||||||
//
|
//
|
||||||
//go:nosplit
|
//go:nosplit
|
||||||
func heapBitsBulkBarrier(p, size uintptr) {
|
func heapBitsBulkBarrier(p, size uintptr) {
|
||||||
if (p|size)&(ptrSize-1) != 0 {
|
if (p|size)&(sys.PtrSize-1) != 0 {
|
||||||
throw("heapBitsBulkBarrier: unaligned arguments")
|
throw("heapBitsBulkBarrier: unaligned arguments")
|
||||||
}
|
}
|
||||||
if !writeBarrierEnabled {
|
if !writeBarrierEnabled {
|
||||||
|
@ -430,7 +431,7 @@ func heapBitsBulkBarrier(p, size uintptr) {
|
||||||
}
|
}
|
||||||
|
|
||||||
h := heapBitsForAddr(p)
|
h := heapBitsForAddr(p)
|
||||||
for i := uintptr(0); i < size; i += ptrSize {
|
for i := uintptr(0); i < size; i += sys.PtrSize {
|
||||||
if h.isPointer() {
|
if h.isPointer() {
|
||||||
x := (*uintptr)(unsafe.Pointer(p + i))
|
x := (*uintptr)(unsafe.Pointer(p + i))
|
||||||
writebarrierptr_nostore(x, *x)
|
writebarrierptr_nostore(x, *x)
|
||||||
|
@ -470,8 +471,8 @@ func typeBitsBulkBarrier(typ *_type, p, size uintptr) {
|
||||||
}
|
}
|
||||||
ptrmask := typ.gcdata
|
ptrmask := typ.gcdata
|
||||||
var bits uint32
|
var bits uint32
|
||||||
for i := uintptr(0); i < typ.ptrdata; i += ptrSize {
|
for i := uintptr(0); i < typ.ptrdata; i += sys.PtrSize {
|
||||||
if i&(ptrSize*8-1) == 0 {
|
if i&(sys.PtrSize*8-1) == 0 {
|
||||||
bits = uint32(*ptrmask)
|
bits = uint32(*ptrmask)
|
||||||
ptrmask = addb(ptrmask, 1)
|
ptrmask = addb(ptrmask, 1)
|
||||||
} else {
|
} else {
|
||||||
|
@ -498,7 +499,7 @@ func (h heapBits) initSpan(size, n, total uintptr) {
|
||||||
throw("initSpan: unaligned length")
|
throw("initSpan: unaligned length")
|
||||||
}
|
}
|
||||||
nbyte := total / heapBitmapScale
|
nbyte := total / heapBitmapScale
|
||||||
if ptrSize == 8 && size == ptrSize {
|
if sys.PtrSize == 8 && size == sys.PtrSize {
|
||||||
end := h.bitp
|
end := h.bitp
|
||||||
bitp := subtractb(end, nbyte-1)
|
bitp := subtractb(end, nbyte-1)
|
||||||
for {
|
for {
|
||||||
|
@ -517,7 +518,7 @@ func (h heapBits) initSpan(size, n, total uintptr) {
|
||||||
// It clears the checkmark bits, which are set to 1 in normal operation.
|
// It clears the checkmark bits, which are set to 1 in normal operation.
|
||||||
func (h heapBits) initCheckmarkSpan(size, n, total uintptr) {
|
func (h heapBits) initCheckmarkSpan(size, n, total uintptr) {
|
||||||
// The ptrSize == 8 is a compile-time constant false on 32-bit and eliminates this code entirely.
|
// The ptrSize == 8 is a compile-time constant false on 32-bit and eliminates this code entirely.
|
||||||
if ptrSize == 8 && size == ptrSize {
|
if sys.PtrSize == 8 && size == sys.PtrSize {
|
||||||
// Checkmark bit is type bit, bottom bit of every 2-bit entry.
|
// Checkmark bit is type bit, bottom bit of every 2-bit entry.
|
||||||
// Only possible on 64-bit system, since minimum size is 8.
|
// Only possible on 64-bit system, since minimum size is 8.
|
||||||
// Must clear type bit (checkmark bit) of every word.
|
// Must clear type bit (checkmark bit) of every word.
|
||||||
|
@ -531,7 +532,7 @@ func (h heapBits) initCheckmarkSpan(size, n, total uintptr) {
|
||||||
}
|
}
|
||||||
for i := uintptr(0); i < n; i++ {
|
for i := uintptr(0); i < n; i++ {
|
||||||
*h.bitp &^= bitMarked << (heapBitsShift + h.shift)
|
*h.bitp &^= bitMarked << (heapBitsShift + h.shift)
|
||||||
h = h.forward(size / ptrSize)
|
h = h.forward(size / sys.PtrSize)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -541,7 +542,7 @@ func (h heapBits) initCheckmarkSpan(size, n, total uintptr) {
|
||||||
// but consulted by typedmemmove.)
|
// but consulted by typedmemmove.)
|
||||||
func (h heapBits) clearCheckmarkSpan(size, n, total uintptr) {
|
func (h heapBits) clearCheckmarkSpan(size, n, total uintptr) {
|
||||||
// The ptrSize == 8 is a compile-time constant false on 32-bit and eliminates this code entirely.
|
// The ptrSize == 8 is a compile-time constant false on 32-bit and eliminates this code entirely.
|
||||||
if ptrSize == 8 && size == ptrSize {
|
if sys.PtrSize == 8 && size == sys.PtrSize {
|
||||||
// Checkmark bit is type bit, bottom bit of every 2-bit entry.
|
// Checkmark bit is type bit, bottom bit of every 2-bit entry.
|
||||||
// Only possible on 64-bit system, since minimum size is 8.
|
// Only possible on 64-bit system, since minimum size is 8.
|
||||||
// Must clear type bit (checkmark bit) of every word.
|
// Must clear type bit (checkmark bit) of every word.
|
||||||
|
@ -566,7 +567,7 @@ func heapBitsSweepSpan(base, size, n uintptr, f func(uintptr)) {
|
||||||
switch {
|
switch {
|
||||||
default:
|
default:
|
||||||
throw("heapBitsSweepSpan")
|
throw("heapBitsSweepSpan")
|
||||||
case ptrSize == 8 && size == ptrSize:
|
case sys.PtrSize == 8 && size == sys.PtrSize:
|
||||||
// Consider mark bits in all four 2-bit entries of each bitmap byte.
|
// Consider mark bits in all four 2-bit entries of each bitmap byte.
|
||||||
bitp := h.bitp
|
bitp := h.bitp
|
||||||
for i := uintptr(0); i < n; i += 4 {
|
for i := uintptr(0); i < n; i += 4 {
|
||||||
|
@ -579,28 +580,28 @@ func heapBitsSweepSpan(base, size, n uintptr, f func(uintptr)) {
|
||||||
if x&bitMarked != 0 {
|
if x&bitMarked != 0 {
|
||||||
x &^= bitMarked
|
x &^= bitMarked
|
||||||
} else {
|
} else {
|
||||||
f(base + i*ptrSize)
|
f(base + i*sys.PtrSize)
|
||||||
}
|
}
|
||||||
if x&(bitMarked<<heapBitsShift) != 0 {
|
if x&(bitMarked<<heapBitsShift) != 0 {
|
||||||
x &^= bitMarked << heapBitsShift
|
x &^= bitMarked << heapBitsShift
|
||||||
} else {
|
} else {
|
||||||
f(base + (i+1)*ptrSize)
|
f(base + (i+1)*sys.PtrSize)
|
||||||
}
|
}
|
||||||
if x&(bitMarked<<(2*heapBitsShift)) != 0 {
|
if x&(bitMarked<<(2*heapBitsShift)) != 0 {
|
||||||
x &^= bitMarked << (2 * heapBitsShift)
|
x &^= bitMarked << (2 * heapBitsShift)
|
||||||
} else {
|
} else {
|
||||||
f(base + (i+2)*ptrSize)
|
f(base + (i+2)*sys.PtrSize)
|
||||||
}
|
}
|
||||||
if x&(bitMarked<<(3*heapBitsShift)) != 0 {
|
if x&(bitMarked<<(3*heapBitsShift)) != 0 {
|
||||||
x &^= bitMarked << (3 * heapBitsShift)
|
x &^= bitMarked << (3 * heapBitsShift)
|
||||||
} else {
|
} else {
|
||||||
f(base + (i+3)*ptrSize)
|
f(base + (i+3)*sys.PtrSize)
|
||||||
}
|
}
|
||||||
*bitp = uint8(x)
|
*bitp = uint8(x)
|
||||||
bitp = subtract1(bitp)
|
bitp = subtract1(bitp)
|
||||||
}
|
}
|
||||||
|
|
||||||
case size%(4*ptrSize) == 0:
|
case size%(4*sys.PtrSize) == 0:
|
||||||
// Mark bit is in first word of each object.
|
// Mark bit is in first word of each object.
|
||||||
// Each object starts at bit 0 of a heap bitmap byte.
|
// Each object starts at bit 0 of a heap bitmap byte.
|
||||||
bitp := h.bitp
|
bitp := h.bitp
|
||||||
|
@ -617,7 +618,7 @@ func heapBitsSweepSpan(base, size, n uintptr, f func(uintptr)) {
|
||||||
bitp = subtractb(bitp, step)
|
bitp = subtractb(bitp, step)
|
||||||
}
|
}
|
||||||
|
|
||||||
case size%(4*ptrSize) == 2*ptrSize:
|
case size%(4*sys.PtrSize) == 2*sys.PtrSize:
|
||||||
// Mark bit is in first word of each object,
|
// Mark bit is in first word of each object,
|
||||||
// but every other object starts halfway through a heap bitmap byte.
|
// but every other object starts halfway through a heap bitmap byte.
|
||||||
// Unroll loop 2x to handle alternating shift count and step size.
|
// Unroll loop 2x to handle alternating shift count and step size.
|
||||||
|
@ -631,7 +632,7 @@ func heapBitsSweepSpan(base, size, n uintptr, f func(uintptr)) {
|
||||||
} else {
|
} else {
|
||||||
x &^= bitMarked | bitPointer | (bitMarked|bitPointer)<<heapBitsShift
|
x &^= bitMarked | bitPointer | (bitMarked|bitPointer)<<heapBitsShift
|
||||||
f(base + i*size)
|
f(base + i*size)
|
||||||
if size > 2*ptrSize {
|
if size > 2*sys.PtrSize {
|
||||||
x = 0
|
x = 0
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -646,7 +647,7 @@ func heapBitsSweepSpan(base, size, n uintptr, f func(uintptr)) {
|
||||||
} else {
|
} else {
|
||||||
x &^= (bitMarked|bitPointer)<<(2*heapBitsShift) | (bitMarked|bitPointer)<<(3*heapBitsShift)
|
x &^= (bitMarked|bitPointer)<<(2*heapBitsShift) | (bitMarked|bitPointer)<<(3*heapBitsShift)
|
||||||
f(base + (i+1)*size)
|
f(base + (i+1)*size)
|
||||||
if size > 2*ptrSize {
|
if size > 2*sys.PtrSize {
|
||||||
*subtract1(bitp) = 0
|
*subtract1(bitp) = 0
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -686,7 +687,7 @@ func heapBitsSetType(x, size, dataSize uintptr, typ *_type) {
|
||||||
// The checks for size == ptrSize and size == 2*ptrSize can therefore
|
// The checks for size == ptrSize and size == 2*ptrSize can therefore
|
||||||
// assume that dataSize == size without checking it explicitly.
|
// assume that dataSize == size without checking it explicitly.
|
||||||
|
|
||||||
if ptrSize == 8 && size == ptrSize {
|
if sys.PtrSize == 8 && size == sys.PtrSize {
|
||||||
// It's one word and it has pointers, it must be a pointer.
|
// It's one word and it has pointers, it must be a pointer.
|
||||||
// In general we'd need an atomic update here if the
|
// In general we'd need an atomic update here if the
|
||||||
// concurrent GC were marking objects in this span,
|
// concurrent GC were marking objects in this span,
|
||||||
|
@ -712,8 +713,8 @@ func heapBitsSetType(x, size, dataSize uintptr, typ *_type) {
|
||||||
// This is called out as a special case primarily for 32-bit systems,
|
// This is called out as a special case primarily for 32-bit systems,
|
||||||
// so that on 32-bit systems the code below can assume all objects
|
// so that on 32-bit systems the code below can assume all objects
|
||||||
// are 4-word aligned (because they're all 16-byte aligned).
|
// are 4-word aligned (because they're all 16-byte aligned).
|
||||||
if size == 2*ptrSize {
|
if size == 2*sys.PtrSize {
|
||||||
if typ.size == ptrSize {
|
if typ.size == sys.PtrSize {
|
||||||
// We're allocating a block big enough to hold two pointers.
|
// We're allocating a block big enough to hold two pointers.
|
||||||
// On 64-bit, that means the actual object must be two pointers,
|
// On 64-bit, that means the actual object must be two pointers,
|
||||||
// or else we'd have used the one-pointer-sized block.
|
// or else we'd have used the one-pointer-sized block.
|
||||||
|
@ -722,7 +723,7 @@ func heapBitsSetType(x, size, dataSize uintptr, typ *_type) {
|
||||||
// just the smallest block available. Distinguish by checking dataSize.
|
// just the smallest block available. Distinguish by checking dataSize.
|
||||||
// (In general the number of instances of typ being allocated is
|
// (In general the number of instances of typ being allocated is
|
||||||
// dataSize/typ.size.)
|
// dataSize/typ.size.)
|
||||||
if ptrSize == 4 && dataSize == ptrSize {
|
if sys.PtrSize == 4 && dataSize == sys.PtrSize {
|
||||||
// 1 pointer.
|
// 1 pointer.
|
||||||
if gcphase == _GCoff {
|
if gcphase == _GCoff {
|
||||||
*h.bitp |= bitPointer << h.shift
|
*h.bitp |= bitPointer << h.shift
|
||||||
|
@ -741,7 +742,7 @@ func heapBitsSetType(x, size, dataSize uintptr, typ *_type) {
|
||||||
}
|
}
|
||||||
// Otherwise typ.size must be 2*ptrSize, and typ.kind&kindGCProg == 0.
|
// Otherwise typ.size must be 2*ptrSize, and typ.kind&kindGCProg == 0.
|
||||||
if doubleCheck {
|
if doubleCheck {
|
||||||
if typ.size != 2*ptrSize || typ.kind&kindGCProg != 0 {
|
if typ.size != 2*sys.PtrSize || typ.kind&kindGCProg != 0 {
|
||||||
print("runtime: heapBitsSetType size=", size, " but typ.size=", typ.size, " gcprog=", typ.kind&kindGCProg != 0, "\n")
|
print("runtime: heapBitsSetType size=", size, " but typ.size=", typ.size, " gcprog=", typ.kind&kindGCProg != 0, "\n")
|
||||||
throw("heapBitsSetType")
|
throw("heapBitsSetType")
|
||||||
}
|
}
|
||||||
|
@ -842,8 +843,8 @@ func heapBitsSetType(x, size, dataSize uintptr, typ *_type) {
|
||||||
// Filling in bits for an array of typ.
|
// Filling in bits for an array of typ.
|
||||||
// Set up for repetition of ptrmask during main loop.
|
// Set up for repetition of ptrmask during main loop.
|
||||||
// Note that ptrmask describes only a prefix of
|
// Note that ptrmask describes only a prefix of
|
||||||
const maxBits = ptrSize*8 - 7
|
const maxBits = sys.PtrSize*8 - 7
|
||||||
if typ.ptrdata/ptrSize <= maxBits {
|
if typ.ptrdata/sys.PtrSize <= maxBits {
|
||||||
// Entire ptrmask fits in uintptr with room for a byte fragment.
|
// Entire ptrmask fits in uintptr with room for a byte fragment.
|
||||||
// Load into pbits and never read from ptrmask again.
|
// Load into pbits and never read from ptrmask again.
|
||||||
// This is especially important when the ptrmask has
|
// This is especially important when the ptrmask has
|
||||||
|
@ -854,12 +855,12 @@ func heapBitsSetType(x, size, dataSize uintptr, typ *_type) {
|
||||||
// Accumulate ptrmask into b.
|
// Accumulate ptrmask into b.
|
||||||
// ptrmask is sized to describe only typ.ptrdata, but we record
|
// ptrmask is sized to describe only typ.ptrdata, but we record
|
||||||
// it as describing typ.size bytes, since all the high bits are zero.
|
// it as describing typ.size bytes, since all the high bits are zero.
|
||||||
nb = typ.ptrdata / ptrSize
|
nb = typ.ptrdata / sys.PtrSize
|
||||||
for i := uintptr(0); i < nb; i += 8 {
|
for i := uintptr(0); i < nb; i += 8 {
|
||||||
b |= uintptr(*p) << i
|
b |= uintptr(*p) << i
|
||||||
p = add1(p)
|
p = add1(p)
|
||||||
}
|
}
|
||||||
nb = typ.size / ptrSize
|
nb = typ.size / sys.PtrSize
|
||||||
|
|
||||||
// Replicate ptrmask to fill entire pbits uintptr.
|
// Replicate ptrmask to fill entire pbits uintptr.
|
||||||
// Doubling and truncating is fewer steps than
|
// Doubling and truncating is fewer steps than
|
||||||
|
@ -870,7 +871,7 @@ func heapBitsSetType(x, size, dataSize uintptr, typ *_type) {
|
||||||
pbits = b
|
pbits = b
|
||||||
endnb = nb
|
endnb = nb
|
||||||
if nb+nb <= maxBits {
|
if nb+nb <= maxBits {
|
||||||
for endnb <= ptrSize*8 {
|
for endnb <= sys.PtrSize*8 {
|
||||||
pbits |= pbits << endnb
|
pbits |= pbits << endnb
|
||||||
endnb += endnb
|
endnb += endnb
|
||||||
}
|
}
|
||||||
|
@ -887,9 +888,9 @@ func heapBitsSetType(x, size, dataSize uintptr, typ *_type) {
|
||||||
endp = nil
|
endp = nil
|
||||||
} else {
|
} else {
|
||||||
// Ptrmask is larger. Read it multiple times.
|
// Ptrmask is larger. Read it multiple times.
|
||||||
n := (typ.ptrdata/ptrSize+7)/8 - 1
|
n := (typ.ptrdata/sys.PtrSize+7)/8 - 1
|
||||||
endp = addb(ptrmask, n)
|
endp = addb(ptrmask, n)
|
||||||
endnb = typ.size/ptrSize - n*8
|
endnb = typ.size/sys.PtrSize - n*8
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if p != nil {
|
if p != nil {
|
||||||
|
@ -900,12 +901,12 @@ func heapBitsSetType(x, size, dataSize uintptr, typ *_type) {
|
||||||
|
|
||||||
if typ.size == dataSize {
|
if typ.size == dataSize {
|
||||||
// Single entry: can stop once we reach the non-pointer data.
|
// Single entry: can stop once we reach the non-pointer data.
|
||||||
nw = typ.ptrdata / ptrSize
|
nw = typ.ptrdata / sys.PtrSize
|
||||||
} else {
|
} else {
|
||||||
// Repeated instances of typ in an array.
|
// Repeated instances of typ in an array.
|
||||||
// Have to process first N-1 entries in full, but can stop
|
// Have to process first N-1 entries in full, but can stop
|
||||||
// once we reach the non-pointer data in the final entry.
|
// once we reach the non-pointer data in the final entry.
|
||||||
nw = ((dataSize/typ.size-1)*typ.size + typ.ptrdata) / ptrSize
|
nw = ((dataSize/typ.size-1)*typ.size + typ.ptrdata) / sys.PtrSize
|
||||||
}
|
}
|
||||||
if nw == 0 {
|
if nw == 0 {
|
||||||
// No pointers! Caller was supposed to check.
|
// No pointers! Caller was supposed to check.
|
||||||
|
@ -945,7 +946,7 @@ func heapBitsSetType(x, size, dataSize uintptr, typ *_type) {
|
||||||
b >>= 4
|
b >>= 4
|
||||||
nb -= 4
|
nb -= 4
|
||||||
|
|
||||||
case ptrSize == 8 && h.shift == 2:
|
case sys.PtrSize == 8 && h.shift == 2:
|
||||||
// Ptrmask and heap bitmap are misaligned.
|
// Ptrmask and heap bitmap are misaligned.
|
||||||
// The bits for the first two words are in a byte shared with another object
|
// The bits for the first two words are in a byte shared with another object
|
||||||
// and must be updated atomically.
|
// and must be updated atomically.
|
||||||
|
@ -1058,7 +1059,7 @@ Phase3:
|
||||||
}
|
}
|
||||||
|
|
||||||
// Change nw from counting possibly-pointer words to total words in allocation.
|
// Change nw from counting possibly-pointer words to total words in allocation.
|
||||||
nw = size / ptrSize
|
nw = size / sys.PtrSize
|
||||||
|
|
||||||
// Write whole bitmap bytes.
|
// Write whole bitmap bytes.
|
||||||
// The first is hb, the rest are zero.
|
// The first is hb, the rest are zero.
|
||||||
|
@ -1105,11 +1106,11 @@ Phase4:
|
||||||
// Double-check that bits to be written were written correctly.
|
// Double-check that bits to be written were written correctly.
|
||||||
// Does not check that other bits were not written, unfortunately.
|
// Does not check that other bits were not written, unfortunately.
|
||||||
h := heapBitsForAddr(x)
|
h := heapBitsForAddr(x)
|
||||||
nptr := typ.ptrdata / ptrSize
|
nptr := typ.ptrdata / sys.PtrSize
|
||||||
ndata := typ.size / ptrSize
|
ndata := typ.size / sys.PtrSize
|
||||||
count := dataSize / typ.size
|
count := dataSize / typ.size
|
||||||
totalptr := ((count-1)*typ.size + typ.ptrdata) / ptrSize
|
totalptr := ((count-1)*typ.size + typ.ptrdata) / sys.PtrSize
|
||||||
for i := uintptr(0); i < size/ptrSize; i++ {
|
for i := uintptr(0); i < size/sys.PtrSize; i++ {
|
||||||
j := i % ndata
|
j := i % ndata
|
||||||
var have, want uint8
|
var have, want uint8
|
||||||
have = (*h.bitp >> h.shift) & (bitPointer | bitMarked)
|
have = (*h.bitp >> h.shift) & (bitPointer | bitMarked)
|
||||||
|
@ -1137,7 +1138,7 @@ Phase4:
|
||||||
print("initial bits h0.bitp=", h0.bitp, " h0.shift=", h0.shift, "\n")
|
print("initial bits h0.bitp=", h0.bitp, " h0.shift=", h0.shift, "\n")
|
||||||
print("current bits h.bitp=", h.bitp, " h.shift=", h.shift, " *h.bitp=", hex(*h.bitp), "\n")
|
print("current bits h.bitp=", h.bitp, " h.shift=", h.shift, " *h.bitp=", hex(*h.bitp), "\n")
|
||||||
print("ptrmask=", ptrmask, " p=", p, " endp=", endp, " endnb=", endnb, " pbits=", hex(pbits), " b=", hex(b), " nb=", nb, "\n")
|
print("ptrmask=", ptrmask, " p=", p, " endp=", endp, " endnb=", endnb, " pbits=", hex(pbits), " b=", hex(b), " nb=", nb, "\n")
|
||||||
println("at word", i, "offset", i*ptrSize, "have", have, "want", want)
|
println("at word", i, "offset", i*sys.PtrSize, "have", have, "want", want)
|
||||||
if typ.kind&kindGCProg != 0 {
|
if typ.kind&kindGCProg != 0 {
|
||||||
println("GC program:")
|
println("GC program:")
|
||||||
dumpGCProg(addb(typ.gcdata, 4))
|
dumpGCProg(addb(typ.gcdata, 4))
|
||||||
|
@ -1168,14 +1169,14 @@ var debugPtrmask struct {
|
||||||
// so that the relevant bitmap bytes are not shared with surrounding
|
// so that the relevant bitmap bytes are not shared with surrounding
|
||||||
// objects and need not be accessed with atomic instructions.
|
// objects and need not be accessed with atomic instructions.
|
||||||
func heapBitsSetTypeGCProg(h heapBits, progSize, elemSize, dataSize, allocSize uintptr, prog *byte) {
|
func heapBitsSetTypeGCProg(h heapBits, progSize, elemSize, dataSize, allocSize uintptr, prog *byte) {
|
||||||
if ptrSize == 8 && allocSize%(4*ptrSize) != 0 {
|
if sys.PtrSize == 8 && allocSize%(4*sys.PtrSize) != 0 {
|
||||||
// Alignment will be wrong.
|
// Alignment will be wrong.
|
||||||
throw("heapBitsSetTypeGCProg: small allocation")
|
throw("heapBitsSetTypeGCProg: small allocation")
|
||||||
}
|
}
|
||||||
var totalBits uintptr
|
var totalBits uintptr
|
||||||
if elemSize == dataSize {
|
if elemSize == dataSize {
|
||||||
totalBits = runGCProg(prog, nil, h.bitp, 2)
|
totalBits = runGCProg(prog, nil, h.bitp, 2)
|
||||||
if totalBits*ptrSize != progSize {
|
if totalBits*sys.PtrSize != progSize {
|
||||||
println("runtime: heapBitsSetTypeGCProg: total bits", totalBits, "but progSize", progSize)
|
println("runtime: heapBitsSetTypeGCProg: total bits", totalBits, "but progSize", progSize)
|
||||||
throw("heapBitsSetTypeGCProg: unexpected bit count")
|
throw("heapBitsSetTypeGCProg: unexpected bit count")
|
||||||
}
|
}
|
||||||
|
@ -1190,7 +1191,7 @@ func heapBitsSetTypeGCProg(h heapBits, progSize, elemSize, dataSize, allocSize u
|
||||||
// repeats that first element to fill the array.
|
// repeats that first element to fill the array.
|
||||||
var trailer [40]byte // 3 varints (max 10 each) + some bytes
|
var trailer [40]byte // 3 varints (max 10 each) + some bytes
|
||||||
i := 0
|
i := 0
|
||||||
if n := elemSize/ptrSize - progSize/ptrSize; n > 0 {
|
if n := elemSize/sys.PtrSize - progSize/sys.PtrSize; n > 0 {
|
||||||
// literal(0)
|
// literal(0)
|
||||||
trailer[i] = 0x01
|
trailer[i] = 0x01
|
||||||
i++
|
i++
|
||||||
|
@ -1212,7 +1213,7 @@ func heapBitsSetTypeGCProg(h heapBits, progSize, elemSize, dataSize, allocSize u
|
||||||
// repeat(elemSize/ptrSize, count-1)
|
// repeat(elemSize/ptrSize, count-1)
|
||||||
trailer[i] = 0x80
|
trailer[i] = 0x80
|
||||||
i++
|
i++
|
||||||
n := elemSize / ptrSize
|
n := elemSize / sys.PtrSize
|
||||||
for ; n >= 0x80; n >>= 7 {
|
for ; n >= 0x80; n >>= 7 {
|
||||||
trailer[i] = byte(n | 0x80)
|
trailer[i] = byte(n | 0x80)
|
||||||
i++
|
i++
|
||||||
|
@ -1236,7 +1237,7 @@ func heapBitsSetTypeGCProg(h heapBits, progSize, elemSize, dataSize, allocSize u
|
||||||
// last element. This will cause the code below to
|
// last element. This will cause the code below to
|
||||||
// memclr the dead section of the final array element,
|
// memclr the dead section of the final array element,
|
||||||
// so that scanobject can stop early in the final element.
|
// so that scanobject can stop early in the final element.
|
||||||
totalBits = (elemSize*(count-1) + progSize) / ptrSize
|
totalBits = (elemSize*(count-1) + progSize) / sys.PtrSize
|
||||||
}
|
}
|
||||||
endProg := unsafe.Pointer(subtractb(h.bitp, (totalBits+3)/4))
|
endProg := unsafe.Pointer(subtractb(h.bitp, (totalBits+3)/4))
|
||||||
endAlloc := unsafe.Pointer(subtractb(h.bitp, allocSize/heapBitmapScale))
|
endAlloc := unsafe.Pointer(subtractb(h.bitp, allocSize/heapBitmapScale))
|
||||||
|
@ -1247,7 +1248,7 @@ func heapBitsSetTypeGCProg(h heapBits, progSize, elemSize, dataSize, allocSize u
|
||||||
// size the size of the region described by prog, in bytes.
|
// size the size of the region described by prog, in bytes.
|
||||||
// The resulting bitvector will have no more than size/ptrSize bits.
|
// The resulting bitvector will have no more than size/ptrSize bits.
|
||||||
func progToPointerMask(prog *byte, size uintptr) bitvector {
|
func progToPointerMask(prog *byte, size uintptr) bitvector {
|
||||||
n := (size/ptrSize + 7) / 8
|
n := (size/sys.PtrSize + 7) / 8
|
||||||
x := (*[1 << 30]byte)(persistentalloc(n+1, 1, &memstats.buckhash_sys))[:n+1]
|
x := (*[1 << 30]byte)(persistentalloc(n+1, 1, &memstats.buckhash_sys))[:n+1]
|
||||||
x[len(x)-1] = 0xa1 // overflow check sentinel
|
x[len(x)-1] = 0xa1 // overflow check sentinel
|
||||||
n = runGCProg(prog, nil, &x[0], 1)
|
n = runGCProg(prog, nil, &x[0], 1)
|
||||||
|
@ -1385,7 +1386,7 @@ Run:
|
||||||
// the pattern to a bit buffer holding at most 7 bits (a partial byte)
|
// the pattern to a bit buffer holding at most 7 bits (a partial byte)
|
||||||
// it will not overflow.
|
// it will not overflow.
|
||||||
src := dst
|
src := dst
|
||||||
const maxBits = ptrSize*8 - 7
|
const maxBits = sys.PtrSize*8 - 7
|
||||||
if n <= maxBits {
|
if n <= maxBits {
|
||||||
// Start with bits in output buffer.
|
// Start with bits in output buffer.
|
||||||
pattern := bits
|
pattern := bits
|
||||||
|
@ -1438,7 +1439,7 @@ Run:
|
||||||
nb := npattern
|
nb := npattern
|
||||||
if nb+nb <= maxBits {
|
if nb+nb <= maxBits {
|
||||||
// Double pattern until the whole uintptr is filled.
|
// Double pattern until the whole uintptr is filled.
|
||||||
for nb <= ptrSize*8 {
|
for nb <= sys.PtrSize*8 {
|
||||||
b |= b << nb
|
b |= b << nb
|
||||||
nb += nb
|
nb += nb
|
||||||
}
|
}
|
||||||
|
@ -1627,7 +1628,7 @@ func getgcmaskcb(frame *stkframe, ctxt unsafe.Pointer) bool {
|
||||||
func reflect_gcbits(x interface{}) []byte {
|
func reflect_gcbits(x interface{}) []byte {
|
||||||
ret := getgcmask(x)
|
ret := getgcmask(x)
|
||||||
typ := (*ptrtype)(unsafe.Pointer(efaceOf(&x)._type)).elem
|
typ := (*ptrtype)(unsafe.Pointer(efaceOf(&x)._type)).elem
|
||||||
nptr := typ.ptrdata / ptrSize
|
nptr := typ.ptrdata / sys.PtrSize
|
||||||
for uintptr(len(ret)) > nptr && ret[len(ret)-1] == 0 {
|
for uintptr(len(ret)) > nptr && ret[len(ret)-1] == 0 {
|
||||||
ret = ret[:len(ret)-1]
|
ret = ret[:len(ret)-1]
|
||||||
}
|
}
|
||||||
|
@ -1645,10 +1646,10 @@ func getgcmask(ep interface{}) (mask []byte) {
|
||||||
if datap.data <= uintptr(p) && uintptr(p) < datap.edata {
|
if datap.data <= uintptr(p) && uintptr(p) < datap.edata {
|
||||||
bitmap := datap.gcdatamask.bytedata
|
bitmap := datap.gcdatamask.bytedata
|
||||||
n := (*ptrtype)(unsafe.Pointer(t)).elem.size
|
n := (*ptrtype)(unsafe.Pointer(t)).elem.size
|
||||||
mask = make([]byte, n/ptrSize)
|
mask = make([]byte, n/sys.PtrSize)
|
||||||
for i := uintptr(0); i < n; i += ptrSize {
|
for i := uintptr(0); i < n; i += sys.PtrSize {
|
||||||
off := (uintptr(p) + i - datap.data) / ptrSize
|
off := (uintptr(p) + i - datap.data) / sys.PtrSize
|
||||||
mask[i/ptrSize] = (*addb(bitmap, off/8) >> (off % 8)) & 1
|
mask[i/sys.PtrSize] = (*addb(bitmap, off/8) >> (off % 8)) & 1
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -1657,10 +1658,10 @@ func getgcmask(ep interface{}) (mask []byte) {
|
||||||
if datap.bss <= uintptr(p) && uintptr(p) < datap.ebss {
|
if datap.bss <= uintptr(p) && uintptr(p) < datap.ebss {
|
||||||
bitmap := datap.gcbssmask.bytedata
|
bitmap := datap.gcbssmask.bytedata
|
||||||
n := (*ptrtype)(unsafe.Pointer(t)).elem.size
|
n := (*ptrtype)(unsafe.Pointer(t)).elem.size
|
||||||
mask = make([]byte, n/ptrSize)
|
mask = make([]byte, n/sys.PtrSize)
|
||||||
for i := uintptr(0); i < n; i += ptrSize {
|
for i := uintptr(0); i < n; i += sys.PtrSize {
|
||||||
off := (uintptr(p) + i - datap.bss) / ptrSize
|
off := (uintptr(p) + i - datap.bss) / sys.PtrSize
|
||||||
mask[i/ptrSize] = (*addb(bitmap, off/8) >> (off % 8)) & 1
|
mask[i/sys.PtrSize] = (*addb(bitmap, off/8) >> (off % 8)) & 1
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -1670,14 +1671,14 @@ func getgcmask(ep interface{}) (mask []byte) {
|
||||||
var n uintptr
|
var n uintptr
|
||||||
var base uintptr
|
var base uintptr
|
||||||
if mlookup(uintptr(p), &base, &n, nil) != 0 {
|
if mlookup(uintptr(p), &base, &n, nil) != 0 {
|
||||||
mask = make([]byte, n/ptrSize)
|
mask = make([]byte, n/sys.PtrSize)
|
||||||
for i := uintptr(0); i < n; i += ptrSize {
|
for i := uintptr(0); i < n; i += sys.PtrSize {
|
||||||
hbits := heapBitsForAddr(base + i)
|
hbits := heapBitsForAddr(base + i)
|
||||||
if hbits.isPointer() {
|
if hbits.isPointer() {
|
||||||
mask[i/ptrSize] = 1
|
mask[i/sys.PtrSize] = 1
|
||||||
}
|
}
|
||||||
if i >= 2*ptrSize && !hbits.isMarked() {
|
if i >= 2*sys.PtrSize && !hbits.isMarked() {
|
||||||
mask = mask[:i/ptrSize]
|
mask = mask[:i/sys.PtrSize]
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1708,13 +1709,13 @@ func getgcmask(ep interface{}) (mask []byte) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
bv := stackmapdata(stkmap, pcdata)
|
bv := stackmapdata(stkmap, pcdata)
|
||||||
size := uintptr(bv.n) * ptrSize
|
size := uintptr(bv.n) * sys.PtrSize
|
||||||
n := (*ptrtype)(unsafe.Pointer(t)).elem.size
|
n := (*ptrtype)(unsafe.Pointer(t)).elem.size
|
||||||
mask = make([]byte, n/ptrSize)
|
mask = make([]byte, n/sys.PtrSize)
|
||||||
for i := uintptr(0); i < n; i += ptrSize {
|
for i := uintptr(0); i < n; i += sys.PtrSize {
|
||||||
bitmap := bv.bytedata
|
bitmap := bv.bytedata
|
||||||
off := (uintptr(p) + i - frame.varp + size) / ptrSize
|
off := (uintptr(p) + i - frame.varp + size) / sys.PtrSize
|
||||||
mask[i/ptrSize] = (*addb(bitmap, off/8) >> (off % 8)) & 1
|
mask[i/sys.PtrSize] = (*addb(bitmap, off/8) >> (off % 8)) & 1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
|
|
|
@ -6,7 +6,10 @@
|
||||||
|
|
||||||
package runtime
|
package runtime
|
||||||
|
|
||||||
import "unsafe"
|
import (
|
||||||
|
"runtime/internal/sys"
|
||||||
|
"unsafe"
|
||||||
|
)
|
||||||
|
|
||||||
// Don't split the stack as this function may be invoked without a valid G,
|
// Don't split the stack as this function may be invoked without a valid G,
|
||||||
// which prevents us from allocating more stack.
|
// which prevents us from allocating more stack.
|
||||||
|
@ -43,7 +46,7 @@ func sysReserve(v unsafe.Pointer, n uintptr, reserved *bool) unsafe.Pointer {
|
||||||
// On 64-bit, people with ulimit -v set complain if we reserve too
|
// On 64-bit, people with ulimit -v set complain if we reserve too
|
||||||
// much address space. Instead, assume that the reservation is okay
|
// much address space. Instead, assume that the reservation is okay
|
||||||
// and check the assumption in SysMap.
|
// and check the assumption in SysMap.
|
||||||
if ptrSize == 8 && uint64(n) > 1<<32 || goos_nacl != 0 {
|
if sys.PtrSize == 8 && uint64(n) > 1<<32 || sys.GoosNacl != 0 {
|
||||||
*reserved = false
|
*reserved = false
|
||||||
return v
|
return v
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,10 +4,13 @@
|
||||||
|
|
||||||
package runtime
|
package runtime
|
||||||
|
|
||||||
import "unsafe"
|
import (
|
||||||
|
"runtime/internal/sys"
|
||||||
|
"unsafe"
|
||||||
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
_PAGE_SIZE = _PhysPageSize
|
_PAGE_SIZE = sys.PhysPageSize
|
||||||
_EACCES = 13
|
_EACCES = 13
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -94,8 +97,8 @@ func sysUnused(v unsafe.Pointer, n uintptr) {
|
||||||
// gets most of the benefit of huge pages while keeping the
|
// gets most of the benefit of huge pages while keeping the
|
||||||
// number of VMAs under control. With hugePageSize = 2MB, even
|
// number of VMAs under control. With hugePageSize = 2MB, even
|
||||||
// a pessimal heap can reach 128GB before running out of VMAs.
|
// a pessimal heap can reach 128GB before running out of VMAs.
|
||||||
if hugePageSize != 0 {
|
if sys.HugePageSize != 0 {
|
||||||
var s uintptr = hugePageSize // division by constant 0 is a compile-time error :(
|
var s uintptr = sys.HugePageSize // division by constant 0 is a compile-time error :(
|
||||||
|
|
||||||
// If it's a large allocation, we want to leave huge
|
// If it's a large allocation, we want to leave huge
|
||||||
// pages enabled. Hence, we only adjust the huge page
|
// pages enabled. Hence, we only adjust the huge page
|
||||||
|
@ -114,17 +117,17 @@ func sysUnused(v unsafe.Pointer, n uintptr) {
|
||||||
// Note that madvise will return EINVAL if the flag is
|
// Note that madvise will return EINVAL if the flag is
|
||||||
// already set, which is quite likely. We ignore
|
// already set, which is quite likely. We ignore
|
||||||
// errors.
|
// errors.
|
||||||
if head != 0 && head+hugePageSize == tail {
|
if head != 0 && head+sys.HugePageSize == tail {
|
||||||
// head and tail are different but adjacent,
|
// head and tail are different but adjacent,
|
||||||
// so do this in one call.
|
// so do this in one call.
|
||||||
madvise(unsafe.Pointer(head), 2*hugePageSize, _MADV_NOHUGEPAGE)
|
madvise(unsafe.Pointer(head), 2*sys.HugePageSize, _MADV_NOHUGEPAGE)
|
||||||
} else {
|
} else {
|
||||||
// Advise the huge pages containing v and v+n-1.
|
// Advise the huge pages containing v and v+n-1.
|
||||||
if head != 0 {
|
if head != 0 {
|
||||||
madvise(unsafe.Pointer(head), hugePageSize, _MADV_NOHUGEPAGE)
|
madvise(unsafe.Pointer(head), sys.HugePageSize, _MADV_NOHUGEPAGE)
|
||||||
}
|
}
|
||||||
if tail != 0 && tail != head {
|
if tail != 0 && tail != head {
|
||||||
madvise(unsafe.Pointer(tail), hugePageSize, _MADV_NOHUGEPAGE)
|
madvise(unsafe.Pointer(tail), sys.HugePageSize, _MADV_NOHUGEPAGE)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -133,7 +136,7 @@ func sysUnused(v unsafe.Pointer, n uintptr) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func sysUsed(v unsafe.Pointer, n uintptr) {
|
func sysUsed(v unsafe.Pointer, n uintptr) {
|
||||||
if hugePageSize != 0 {
|
if sys.HugePageSize != 0 {
|
||||||
// Partially undo the NOHUGEPAGE marks from sysUnused
|
// Partially undo the NOHUGEPAGE marks from sysUnused
|
||||||
// for whole huge pages between v and v+n. This may
|
// for whole huge pages between v and v+n. This may
|
||||||
// leave huge pages off at the end points v and v+n
|
// leave huge pages off at the end points v and v+n
|
||||||
|
@ -142,7 +145,7 @@ func sysUsed(v unsafe.Pointer, n uintptr) {
|
||||||
// the end points as well, but it's probably not worth
|
// the end points as well, but it's probably not worth
|
||||||
// the cost because when neighboring allocations are
|
// the cost because when neighboring allocations are
|
||||||
// freed sysUnused will just set NOHUGEPAGE again.
|
// freed sysUnused will just set NOHUGEPAGE again.
|
||||||
var s uintptr = hugePageSize
|
var s uintptr = sys.HugePageSize
|
||||||
|
|
||||||
// Round v up to a huge page boundary.
|
// Round v up to a huge page boundary.
|
||||||
beg := (uintptr(v) + (s - 1)) &^ (s - 1)
|
beg := (uintptr(v) + (s - 1)) &^ (s - 1)
|
||||||
|
@ -172,7 +175,7 @@ func sysReserve(v unsafe.Pointer, n uintptr, reserved *bool) unsafe.Pointer {
|
||||||
// much address space. Instead, assume that the reservation is okay
|
// much address space. Instead, assume that the reservation is okay
|
||||||
// if we can reserve at least 64K and check the assumption in SysMap.
|
// if we can reserve at least 64K and check the assumption in SysMap.
|
||||||
// Only user-mode Linux (UML) rejects these requests.
|
// Only user-mode Linux (UML) rejects these requests.
|
||||||
if ptrSize == 8 && uint64(n) > 1<<32 {
|
if sys.PtrSize == 8 && uint64(n) > 1<<32 {
|
||||||
p := mmap_fixed(v, 64<<10, _PROT_NONE, _MAP_ANON|_MAP_PRIVATE, -1, 0)
|
p := mmap_fixed(v, 64<<10, _PROT_NONE, _MAP_ANON|_MAP_PRIVATE, -1, 0)
|
||||||
if p != v {
|
if p != v {
|
||||||
if uintptr(p) >= 4096 {
|
if uintptr(p) >= 4096 {
|
||||||
|
|
|
@ -8,6 +8,7 @@ package runtime
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"runtime/internal/atomic"
|
"runtime/internal/atomic"
|
||||||
|
"runtime/internal/sys"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -16,14 +17,14 @@ type finblock struct {
|
||||||
next *finblock
|
next *finblock
|
||||||
cnt int32
|
cnt int32
|
||||||
_ int32
|
_ int32
|
||||||
fin [(_FinBlockSize - 2*ptrSize - 2*4) / unsafe.Sizeof(finalizer{})]finalizer
|
fin [(_FinBlockSize - 2*sys.PtrSize - 2*4) / unsafe.Sizeof(finalizer{})]finalizer
|
||||||
}
|
}
|
||||||
|
|
||||||
var finlock mutex // protects the following variables
|
var finlock mutex // protects the following variables
|
||||||
var fing *g // goroutine that runs finalizers
|
var fing *g // goroutine that runs finalizers
|
||||||
var finq *finblock // list of finalizers that are to be executed
|
var finq *finblock // list of finalizers that are to be executed
|
||||||
var finc *finblock // cache of free blocks
|
var finc *finblock // cache of free blocks
|
||||||
var finptrmask [_FinBlockSize / ptrSize / 8]byte
|
var finptrmask [_FinBlockSize / sys.PtrSize / 8]byte
|
||||||
var fingwait bool
|
var fingwait bool
|
||||||
var fingwake bool
|
var fingwake bool
|
||||||
var allfin *finblock // list of all blocks
|
var allfin *finblock // list of all blocks
|
||||||
|
@ -76,12 +77,12 @@ func queuefinalizer(p unsafe.Pointer, fn *funcval, nret uintptr, fint *_type, ot
|
||||||
if finptrmask[0] == 0 {
|
if finptrmask[0] == 0 {
|
||||||
// Build pointer mask for Finalizer array in block.
|
// Build pointer mask for Finalizer array in block.
|
||||||
// Check assumptions made in finalizer1 array above.
|
// Check assumptions made in finalizer1 array above.
|
||||||
if (unsafe.Sizeof(finalizer{}) != 5*ptrSize ||
|
if (unsafe.Sizeof(finalizer{}) != 5*sys.PtrSize ||
|
||||||
unsafe.Offsetof(finalizer{}.fn) != 0 ||
|
unsafe.Offsetof(finalizer{}.fn) != 0 ||
|
||||||
unsafe.Offsetof(finalizer{}.arg) != ptrSize ||
|
unsafe.Offsetof(finalizer{}.arg) != sys.PtrSize ||
|
||||||
unsafe.Offsetof(finalizer{}.nret) != 2*ptrSize ||
|
unsafe.Offsetof(finalizer{}.nret) != 2*sys.PtrSize ||
|
||||||
unsafe.Offsetof(finalizer{}.fint) != 3*ptrSize ||
|
unsafe.Offsetof(finalizer{}.fint) != 3*sys.PtrSize ||
|
||||||
unsafe.Offsetof(finalizer{}.ot) != 4*ptrSize) {
|
unsafe.Offsetof(finalizer{}.ot) != 4*sys.PtrSize) {
|
||||||
throw("finalizer out of sync")
|
throw("finalizer out of sync")
|
||||||
}
|
}
|
||||||
for i := range finptrmask {
|
for i := range finptrmask {
|
||||||
|
@ -361,7 +362,7 @@ okarg:
|
||||||
for _, t := range ft.out {
|
for _, t := range ft.out {
|
||||||
nret = round(nret, uintptr(t.align)) + uintptr(t.size)
|
nret = round(nret, uintptr(t.align)) + uintptr(t.size)
|
||||||
}
|
}
|
||||||
nret = round(nret, ptrSize)
|
nret = round(nret, sys.PtrSize)
|
||||||
|
|
||||||
// make sure we have a finalizer goroutine
|
// make sure we have a finalizer goroutine
|
||||||
createfing()
|
createfing()
|
||||||
|
@ -379,7 +380,7 @@ okarg:
|
||||||
func findObject(v unsafe.Pointer) (s *mspan, x unsafe.Pointer, n uintptr) {
|
func findObject(v unsafe.Pointer) (s *mspan, x unsafe.Pointer, n uintptr) {
|
||||||
c := gomcache()
|
c := gomcache()
|
||||||
c.local_nlookup++
|
c.local_nlookup++
|
||||||
if ptrSize == 4 && c.local_nlookup >= 1<<30 {
|
if sys.PtrSize == 4 && c.local_nlookup >= 1<<30 {
|
||||||
// purge cache stats to prevent overflow
|
// purge cache stats to prevent overflow
|
||||||
lock(&mheap_.lock)
|
lock(&mheap_.lock)
|
||||||
purgecachedstats(c)
|
purgecachedstats(c)
|
||||||
|
@ -394,7 +395,7 @@ func findObject(v unsafe.Pointer) (s *mspan, x unsafe.Pointer, n uintptr) {
|
||||||
}
|
}
|
||||||
p := uintptr(v) >> pageShift
|
p := uintptr(v) >> pageShift
|
||||||
q := p - arena_start>>pageShift
|
q := p - arena_start>>pageShift
|
||||||
s = *(**mspan)(add(unsafe.Pointer(mheap_.spans), q*ptrSize))
|
s = *(**mspan)(add(unsafe.Pointer(mheap_.spans), q*sys.PtrSize))
|
||||||
if s == nil {
|
if s == nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
|
@ -122,6 +122,7 @@ package runtime
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"runtime/internal/atomic"
|
"runtime/internal/atomic"
|
||||||
|
"runtime/internal/sys"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -370,7 +371,7 @@ type gcControllerState struct {
|
||||||
// at the end of of each cycle.
|
// at the end of of each cycle.
|
||||||
triggerRatio float64
|
triggerRatio float64
|
||||||
|
|
||||||
_ [_CacheLineSize]byte
|
_ [sys.CacheLineSize]byte
|
||||||
|
|
||||||
// fractionalMarkWorkersNeeded is the number of fractional
|
// fractionalMarkWorkersNeeded is the number of fractional
|
||||||
// mark workers that need to be started. This is either 0 or
|
// mark workers that need to be started. This is either 0 or
|
||||||
|
@ -378,7 +379,7 @@ type gcControllerState struct {
|
||||||
// scheduling point (hence it gets its own cache line).
|
// scheduling point (hence it gets its own cache line).
|
||||||
fractionalMarkWorkersNeeded int64
|
fractionalMarkWorkersNeeded int64
|
||||||
|
|
||||||
_ [_CacheLineSize]byte
|
_ [sys.CacheLineSize]byte
|
||||||
}
|
}
|
||||||
|
|
||||||
// startCycle resets the GC controller's state and computes estimates
|
// startCycle resets the GC controller's state and computes estimates
|
||||||
|
@ -730,9 +731,9 @@ const gcAssistTimeSlack = 5000
|
||||||
const gcOverAssistBytes = 1 << 20
|
const gcOverAssistBytes = 1 << 20
|
||||||
|
|
||||||
var work struct {
|
var work struct {
|
||||||
full uint64 // lock-free list of full blocks workbuf
|
full uint64 // lock-free list of full blocks workbuf
|
||||||
empty uint64 // lock-free list of empty blocks workbuf
|
empty uint64 // lock-free list of empty blocks workbuf
|
||||||
pad0 [_CacheLineSize]uint8 // prevents false-sharing between full/empty and nproc/nwait
|
pad0 [sys.CacheLineSize]uint8 // prevents false-sharing between full/empty and nproc/nwait
|
||||||
|
|
||||||
markrootNext uint32 // next markroot job
|
markrootNext uint32 // next markroot job
|
||||||
markrootJobs uint32 // number of markroot jobs
|
markrootJobs uint32 // number of markroot jobs
|
||||||
|
|
|
@ -8,6 +8,7 @@ package runtime
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"runtime/internal/atomic"
|
"runtime/internal/atomic"
|
||||||
|
"runtime/internal/sys"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -201,7 +202,7 @@ func markroot(i uint32) {
|
||||||
//
|
//
|
||||||
//go:nowritebarrier
|
//go:nowritebarrier
|
||||||
func markrootBlock(b0, n0 uintptr, ptrmask0 *uint8, gcw *gcWork, shard int) {
|
func markrootBlock(b0, n0 uintptr, ptrmask0 *uint8, gcw *gcWork, shard int) {
|
||||||
if rootBlockBytes%(8*ptrSize) != 0 {
|
if rootBlockBytes%(8*sys.PtrSize) != 0 {
|
||||||
// This is necessary to pick byte offsets in ptrmask0.
|
// This is necessary to pick byte offsets in ptrmask0.
|
||||||
throw("rootBlockBytes must be a multiple of 8*ptrSize")
|
throw("rootBlockBytes must be a multiple of 8*ptrSize")
|
||||||
}
|
}
|
||||||
|
@ -210,7 +211,7 @@ func markrootBlock(b0, n0 uintptr, ptrmask0 *uint8, gcw *gcWork, shard int) {
|
||||||
if b >= b0+n0 {
|
if b >= b0+n0 {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
ptrmask := (*uint8)(add(unsafe.Pointer(ptrmask0), uintptr(shard)*(rootBlockBytes/(8*ptrSize))))
|
ptrmask := (*uint8)(add(unsafe.Pointer(ptrmask0), uintptr(shard)*(rootBlockBytes/(8*sys.PtrSize))))
|
||||||
n := uintptr(rootBlockBytes)
|
n := uintptr(rootBlockBytes)
|
||||||
if b+n > b0+n0 {
|
if b+n > b0+n0 {
|
||||||
n = b0 + n0 - b
|
n = b0 + n0 - b
|
||||||
|
@ -300,7 +301,7 @@ func markrootSpans(gcw *gcWork, shard int) {
|
||||||
scanobject(p, gcw)
|
scanobject(p, gcw)
|
||||||
|
|
||||||
// The special itself is a root.
|
// The special itself is a root.
|
||||||
scanblock(uintptr(unsafe.Pointer(&spf.fn)), ptrSize, &oneptrmask[0], gcw)
|
scanblock(uintptr(unsafe.Pointer(&spf.fn)), sys.PtrSize, &oneptrmask[0], gcw)
|
||||||
}
|
}
|
||||||
|
|
||||||
unlock(&s.speciallock)
|
unlock(&s.speciallock)
|
||||||
|
@ -704,11 +705,11 @@ func scanframeworker(frame *stkframe, cache *pcvalueCache, gcw *gcWork) {
|
||||||
// Scan local variables if stack frame has been allocated.
|
// Scan local variables if stack frame has been allocated.
|
||||||
size := frame.varp - frame.sp
|
size := frame.varp - frame.sp
|
||||||
var minsize uintptr
|
var minsize uintptr
|
||||||
switch thechar {
|
switch sys.TheChar {
|
||||||
case '7':
|
case '7':
|
||||||
minsize = spAlign
|
minsize = sys.SpAlign
|
||||||
default:
|
default:
|
||||||
minsize = minFrameSize
|
minsize = sys.MinFrameSize
|
||||||
}
|
}
|
||||||
if size > minsize {
|
if size > minsize {
|
||||||
stkmap := (*stackmap)(funcdata(f, _FUNCDATA_LocalsPointerMaps))
|
stkmap := (*stackmap)(funcdata(f, _FUNCDATA_LocalsPointerMaps))
|
||||||
|
@ -724,7 +725,7 @@ func scanframeworker(frame *stkframe, cache *pcvalueCache, gcw *gcWork) {
|
||||||
throw("scanframe: bad symbol table")
|
throw("scanframe: bad symbol table")
|
||||||
}
|
}
|
||||||
bv := stackmapdata(stkmap, pcdata)
|
bv := stackmapdata(stkmap, pcdata)
|
||||||
size = uintptr(bv.n) * ptrSize
|
size = uintptr(bv.n) * sys.PtrSize
|
||||||
scanblock(frame.varp-size, size, bv.bytedata, gcw)
|
scanblock(frame.varp-size, size, bv.bytedata, gcw)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -746,7 +747,7 @@ func scanframeworker(frame *stkframe, cache *pcvalueCache, gcw *gcWork) {
|
||||||
}
|
}
|
||||||
bv = stackmapdata(stkmap, pcdata)
|
bv = stackmapdata(stkmap, pcdata)
|
||||||
}
|
}
|
||||||
scanblock(frame.argp, uintptr(bv.n)*ptrSize, bv.bytedata, gcw)
|
scanblock(frame.argp, uintptr(bv.n)*sys.PtrSize, bv.bytedata, gcw)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -912,9 +913,9 @@ func scanblock(b0, n0 uintptr, ptrmask *uint8, gcw *gcWork) {
|
||||||
|
|
||||||
for i := uintptr(0); i < n; {
|
for i := uintptr(0); i < n; {
|
||||||
// Find bits for the next word.
|
// Find bits for the next word.
|
||||||
bits := uint32(*addb(ptrmask, i/(ptrSize*8)))
|
bits := uint32(*addb(ptrmask, i/(sys.PtrSize*8)))
|
||||||
if bits == 0 {
|
if bits == 0 {
|
||||||
i += ptrSize * 8
|
i += sys.PtrSize * 8
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
for j := 0; j < 8 && i < n; j++ {
|
for j := 0; j < 8 && i < n; j++ {
|
||||||
|
@ -928,7 +929,7 @@ func scanblock(b0, n0 uintptr, ptrmask *uint8, gcw *gcWork) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
bits >>= 1
|
bits >>= 1
|
||||||
i += ptrSize
|
i += sys.PtrSize
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -962,7 +963,7 @@ func scanobject(b uintptr, gcw *gcWork) {
|
||||||
}
|
}
|
||||||
|
|
||||||
var i uintptr
|
var i uintptr
|
||||||
for i = 0; i < n; i += ptrSize {
|
for i = 0; i < n; i += sys.PtrSize {
|
||||||
// Find bits for this word.
|
// Find bits for this word.
|
||||||
if i != 0 {
|
if i != 0 {
|
||||||
// Avoid needless hbits.next() on last iteration.
|
// Avoid needless hbits.next() on last iteration.
|
||||||
|
@ -973,7 +974,7 @@ func scanobject(b uintptr, gcw *gcWork) {
|
||||||
// are pointers, or else they'd be merged with other non-pointer
|
// are pointers, or else they'd be merged with other non-pointer
|
||||||
// data into larger allocations.
|
// data into larger allocations.
|
||||||
bits := hbits.bits()
|
bits := hbits.bits()
|
||||||
if i >= 2*ptrSize && bits&bitMarked == 0 {
|
if i >= 2*sys.PtrSize && bits&bitMarked == 0 {
|
||||||
break // no more pointers in this object
|
break // no more pointers in this object
|
||||||
}
|
}
|
||||||
if bits&bitPointer == 0 {
|
if bits&bitPointer == 0 {
|
||||||
|
@ -1019,7 +1020,7 @@ func shade(b uintptr) {
|
||||||
//go:nowritebarrier
|
//go:nowritebarrier
|
||||||
func greyobject(obj, base, off uintptr, hbits heapBits, span *mspan, gcw *gcWork) {
|
func greyobject(obj, base, off uintptr, hbits heapBits, span *mspan, gcw *gcWork) {
|
||||||
// obj should be start of allocation, and so must be at least pointer-aligned.
|
// obj should be start of allocation, and so must be at least pointer-aligned.
|
||||||
if obj&(ptrSize-1) != 0 {
|
if obj&(sys.PtrSize-1) != 0 {
|
||||||
throw("greyobject: obj not pointer-aligned")
|
throw("greyobject: obj not pointer-aligned")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1087,11 +1088,11 @@ func gcDumpObject(label string, obj, off uintptr) {
|
||||||
}
|
}
|
||||||
print(" s.start*_PageSize=", hex(s.start*_PageSize), " s.limit=", hex(s.limit), " s.sizeclass=", s.sizeclass, " s.elemsize=", s.elemsize, "\n")
|
print(" s.start*_PageSize=", hex(s.start*_PageSize), " s.limit=", hex(s.limit), " s.sizeclass=", s.sizeclass, " s.elemsize=", s.elemsize, "\n")
|
||||||
skipped := false
|
skipped := false
|
||||||
for i := uintptr(0); i < s.elemsize; i += ptrSize {
|
for i := uintptr(0); i < s.elemsize; i += sys.PtrSize {
|
||||||
// For big objects, just print the beginning (because
|
// For big objects, just print the beginning (because
|
||||||
// that usually hints at the object's type) and the
|
// that usually hints at the object's type) and the
|
||||||
// fields around off.
|
// fields around off.
|
||||||
if !(i < 128*ptrSize || off-16*ptrSize < i && i < off+16*ptrSize) {
|
if !(i < 128*sys.PtrSize || off-16*sys.PtrSize < i && i < off+16*sys.PtrSize) {
|
||||||
skipped = true
|
skipped = true
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,6 +8,7 @@ package runtime
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"runtime/internal/atomic"
|
"runtime/internal/atomic"
|
||||||
|
"runtime/internal/sys"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -280,10 +281,10 @@ func (s *mspan) sweep(preserve bool) bool {
|
||||||
freeToHeap = true
|
freeToHeap = true
|
||||||
} else {
|
} else {
|
||||||
// Free small object.
|
// Free small object.
|
||||||
if size > 2*ptrSize {
|
if size > 2*sys.PtrSize {
|
||||||
*(*uintptr)(unsafe.Pointer(p + ptrSize)) = uintptrMask & 0xdeaddeaddeaddead // mark as "needs to be zeroed"
|
*(*uintptr)(unsafe.Pointer(p + sys.PtrSize)) = uintptrMask & 0xdeaddeaddeaddead // mark as "needs to be zeroed"
|
||||||
} else if size > ptrSize {
|
} else if size > sys.PtrSize {
|
||||||
*(*uintptr)(unsafe.Pointer(p + ptrSize)) = 0
|
*(*uintptr)(unsafe.Pointer(p + sys.PtrSize)) = 0
|
||||||
}
|
}
|
||||||
if head.ptr() == nil {
|
if head.ptr() == nil {
|
||||||
head = gclinkptr(p)
|
head = gclinkptr(p)
|
||||||
|
|
|
@ -6,6 +6,7 @@ package runtime
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"runtime/internal/atomic"
|
"runtime/internal/atomic"
|
||||||
|
"runtime/internal/sys"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -265,7 +266,7 @@ type workbufhdr struct {
|
||||||
type workbuf struct {
|
type workbuf struct {
|
||||||
workbufhdr
|
workbufhdr
|
||||||
// account for the above fields
|
// account for the above fields
|
||||||
obj [(_WorkbufSize - unsafe.Sizeof(workbufhdr{})) / ptrSize]uintptr
|
obj [(_WorkbufSize - unsafe.Sizeof(workbufhdr{})) / sys.PtrSize]uintptr
|
||||||
}
|
}
|
||||||
|
|
||||||
// workbuf factory routines. These funcs are used to manage the
|
// workbuf factory routines. These funcs are used to manage the
|
||||||
|
@ -343,7 +344,7 @@ func getempty(entry int) *workbuf {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if b == nil {
|
if b == nil {
|
||||||
b = (*workbuf)(persistentalloc(unsafe.Sizeof(*b), _CacheLineSize, &memstats.gc_sys))
|
b = (*workbuf)(persistentalloc(unsafe.Sizeof(*b), sys.CacheLineSize, &memstats.gc_sys))
|
||||||
}
|
}
|
||||||
b.logget(entry)
|
b.logget(entry)
|
||||||
return b
|
return b
|
||||||
|
|
|
@ -10,6 +10,7 @@ package runtime
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"runtime/internal/atomic"
|
"runtime/internal/atomic"
|
||||||
|
"runtime/internal/sys"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -58,7 +59,7 @@ type mheap struct {
|
||||||
// gets its own cache line.
|
// gets its own cache line.
|
||||||
central [_NumSizeClasses]struct {
|
central [_NumSizeClasses]struct {
|
||||||
mcentral mcentral
|
mcentral mcentral
|
||||||
pad [_CacheLineSize]byte
|
pad [sys.CacheLineSize]byte
|
||||||
}
|
}
|
||||||
|
|
||||||
spanalloc fixalloc // allocator for span*
|
spanalloc fixalloc // allocator for span*
|
||||||
|
@ -169,13 +170,13 @@ func recordspan(vh unsafe.Pointer, p unsafe.Pointer) {
|
||||||
h := (*mheap)(vh)
|
h := (*mheap)(vh)
|
||||||
s := (*mspan)(p)
|
s := (*mspan)(p)
|
||||||
if len(h_allspans) >= cap(h_allspans) {
|
if len(h_allspans) >= cap(h_allspans) {
|
||||||
n := 64 * 1024 / ptrSize
|
n := 64 * 1024 / sys.PtrSize
|
||||||
if n < cap(h_allspans)*3/2 {
|
if n < cap(h_allspans)*3/2 {
|
||||||
n = cap(h_allspans) * 3 / 2
|
n = cap(h_allspans) * 3 / 2
|
||||||
}
|
}
|
||||||
var new []*mspan
|
var new []*mspan
|
||||||
sp := (*slice)(unsafe.Pointer(&new))
|
sp := (*slice)(unsafe.Pointer(&new))
|
||||||
sp.array = sysAlloc(uintptr(n)*ptrSize, &memstats.other_sys)
|
sp.array = sysAlloc(uintptr(n)*sys.PtrSize, &memstats.other_sys)
|
||||||
if sp.array == nil {
|
if sp.array == nil {
|
||||||
throw("runtime: cannot allocate memory")
|
throw("runtime: cannot allocate memory")
|
||||||
}
|
}
|
||||||
|
@ -186,7 +187,7 @@ func recordspan(vh unsafe.Pointer, p unsafe.Pointer) {
|
||||||
// Don't free the old array if it's referenced by sweep.
|
// Don't free the old array if it's referenced by sweep.
|
||||||
// See the comment in mgc.go.
|
// See the comment in mgc.go.
|
||||||
if h.allspans != mheap_.gcspans {
|
if h.allspans != mheap_.gcspans {
|
||||||
sysFree(unsafe.Pointer(h.allspans), uintptr(cap(h_allspans))*ptrSize, &memstats.other_sys)
|
sysFree(unsafe.Pointer(h.allspans), uintptr(cap(h_allspans))*sys.PtrSize, &memstats.other_sys)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
h_allspans = new
|
h_allspans = new
|
||||||
|
@ -239,7 +240,7 @@ func mlookup(v uintptr, base *uintptr, size *uintptr, sp **mspan) int32 {
|
||||||
_g_ := getg()
|
_g_ := getg()
|
||||||
|
|
||||||
_g_.m.mcache.local_nlookup++
|
_g_.m.mcache.local_nlookup++
|
||||||
if ptrSize == 4 && _g_.m.mcache.local_nlookup >= 1<<30 {
|
if sys.PtrSize == 4 && _g_.m.mcache.local_nlookup >= 1<<30 {
|
||||||
// purge cache stats to prevent overflow
|
// purge cache stats to prevent overflow
|
||||||
lock(&mheap_.lock)
|
lock(&mheap_.lock)
|
||||||
purgecachedstats(_g_.m.mcache)
|
purgecachedstats(_g_.m.mcache)
|
||||||
|
@ -305,8 +306,8 @@ func (h *mheap) init(spans_size uintptr) {
|
||||||
|
|
||||||
sp := (*slice)(unsafe.Pointer(&h_spans))
|
sp := (*slice)(unsafe.Pointer(&h_spans))
|
||||||
sp.array = unsafe.Pointer(h.spans)
|
sp.array = unsafe.Pointer(h.spans)
|
||||||
sp.len = int(spans_size / ptrSize)
|
sp.len = int(spans_size / sys.PtrSize)
|
||||||
sp.cap = int(spans_size / ptrSize)
|
sp.cap = int(spans_size / sys.PtrSize)
|
||||||
}
|
}
|
||||||
|
|
||||||
// mHeap_MapSpans makes sure that the spans are mapped
|
// mHeap_MapSpans makes sure that the spans are mapped
|
||||||
|
@ -321,8 +322,8 @@ func (h *mheap) mapSpans(arena_used uintptr) {
|
||||||
// Map spans array, PageSize at a time.
|
// Map spans array, PageSize at a time.
|
||||||
n := arena_used
|
n := arena_used
|
||||||
n -= h.arena_start
|
n -= h.arena_start
|
||||||
n = n / _PageSize * ptrSize
|
n = n / _PageSize * sys.PtrSize
|
||||||
n = round(n, _PhysPageSize)
|
n = round(n, sys.PhysPageSize)
|
||||||
if h.spans_mapped >= n {
|
if h.spans_mapped >= n {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -797,7 +798,7 @@ func (h *mheap) freeSpanLocked(s *mspan, acctinuse, acctidle bool, unusedsince i
|
||||||
h.spanalloc.free(unsafe.Pointer(t))
|
h.spanalloc.free(unsafe.Pointer(t))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (p+s.npages)*ptrSize < h.spans_mapped {
|
if (p+s.npages)*sys.PtrSize < h.spans_mapped {
|
||||||
t := h_spans[p+s.npages]
|
t := h_spans[p+s.npages]
|
||||||
if t != nil && t.state == _MSpanFree {
|
if t != nil && t.state == _MSpanFree {
|
||||||
s.npages += t.npages
|
s.npages += t.npages
|
||||||
|
@ -829,7 +830,7 @@ func (h *mheap) busyList(npages uintptr) *mSpanList {
|
||||||
}
|
}
|
||||||
|
|
||||||
func scavengelist(list *mSpanList, now, limit uint64) uintptr {
|
func scavengelist(list *mSpanList, now, limit uint64) uintptr {
|
||||||
if _PhysPageSize > _PageSize {
|
if sys.PhysPageSize > _PageSize {
|
||||||
// golang.org/issue/9993
|
// golang.org/issue/9993
|
||||||
// If the physical page size of the machine is larger than
|
// If the physical page size of the machine is larger than
|
||||||
// our logical heap page size the kernel may round up the
|
// our logical heap page size the kernel may round up the
|
||||||
|
@ -1098,7 +1099,7 @@ func addfinalizer(p unsafe.Pointer, f *funcval, nret uintptr, fint *_type, ot *p
|
||||||
scanobject(uintptr(base), gcw)
|
scanobject(uintptr(base), gcw)
|
||||||
// Mark the finalizer itself, since the
|
// Mark the finalizer itself, since the
|
||||||
// special isn't part of the GC'd heap.
|
// special isn't part of the GC'd heap.
|
||||||
scanblock(uintptr(unsafe.Pointer(&s.fn)), ptrSize, &oneptrmask[0], gcw)
|
scanblock(uintptr(unsafe.Pointer(&s.fn)), sys.PtrSize, &oneptrmask[0], gcw)
|
||||||
if gcBlackenPromptly {
|
if gcBlackenPromptly {
|
||||||
gcw.dispose()
|
gcw.dispose()
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,6 +8,7 @@ package runtime
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"runtime/internal/atomic"
|
"runtime/internal/atomic"
|
||||||
|
"runtime/internal/sys"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -369,7 +370,7 @@ func purgecachedstats(c *mcache) {
|
||||||
// overflow errors.
|
// overflow errors.
|
||||||
//go:nosplit
|
//go:nosplit
|
||||||
func mSysStatInc(sysStat *uint64, n uintptr) {
|
func mSysStatInc(sysStat *uint64, n uintptr) {
|
||||||
if _BigEndian != 0 {
|
if sys.BigEndian != 0 {
|
||||||
atomic.Xadd64(sysStat, int64(n))
|
atomic.Xadd64(sysStat, int64(n))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -383,7 +384,7 @@ func mSysStatInc(sysStat *uint64, n uintptr) {
|
||||||
// mSysStatInc apply.
|
// mSysStatInc apply.
|
||||||
//go:nosplit
|
//go:nosplit
|
||||||
func mSysStatDec(sysStat *uint64, n uintptr) {
|
func mSysStatDec(sysStat *uint64, n uintptr) {
|
||||||
if _BigEndian != 0 {
|
if sys.BigEndian != 0 {
|
||||||
atomic.Xadd64(sysStat, -int64(n))
|
atomic.Xadd64(sysStat, -int64(n))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
|
@ -105,7 +105,10 @@
|
||||||
|
|
||||||
package runtime
|
package runtime
|
||||||
|
|
||||||
import "unsafe"
|
import (
|
||||||
|
"runtime/internal/sys"
|
||||||
|
"unsafe"
|
||||||
|
)
|
||||||
|
|
||||||
const debugStackBarrier = false
|
const debugStackBarrier = false
|
||||||
|
|
||||||
|
@ -170,9 +173,9 @@ func gcInstallStackBarrier(gp *g, frame *stkframe) bool {
|
||||||
if usesLR {
|
if usesLR {
|
||||||
lrUintptr = frame.sp
|
lrUintptr = frame.sp
|
||||||
} else {
|
} else {
|
||||||
lrUintptr = frame.fp - regSize
|
lrUintptr = frame.fp - sys.RegSize
|
||||||
}
|
}
|
||||||
lrPtr := (*uintreg)(unsafe.Pointer(lrUintptr))
|
lrPtr := (*sys.Uintreg)(unsafe.Pointer(lrUintptr))
|
||||||
if debugStackBarrier {
|
if debugStackBarrier {
|
||||||
print("install stack barrier at ", hex(lrUintptr), " over ", hex(*lrPtr), ", goid=", gp.goid, "\n")
|
print("install stack barrier at ", hex(lrUintptr), " over ", hex(*lrPtr), ", goid=", gp.goid, "\n")
|
||||||
if uintptr(*lrPtr) != frame.lr {
|
if uintptr(*lrPtr) != frame.lr {
|
||||||
|
@ -185,7 +188,7 @@ func gcInstallStackBarrier(gp *g, frame *stkframe) bool {
|
||||||
stkbar := &gp.stkbar[len(gp.stkbar)-1]
|
stkbar := &gp.stkbar[len(gp.stkbar)-1]
|
||||||
stkbar.savedLRPtr = lrUintptr
|
stkbar.savedLRPtr = lrUintptr
|
||||||
stkbar.savedLRVal = uintptr(*lrPtr)
|
stkbar.savedLRVal = uintptr(*lrPtr)
|
||||||
*lrPtr = uintreg(stackBarrierPC)
|
*lrPtr = sys.Uintreg(stackBarrierPC)
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -218,8 +221,8 @@ func gcRemoveStackBarrier(gp *g, stkbar stkbar) {
|
||||||
if debugStackBarrier {
|
if debugStackBarrier {
|
||||||
print("remove stack barrier at ", hex(stkbar.savedLRPtr), " with ", hex(stkbar.savedLRVal), ", goid=", gp.goid, "\n")
|
print("remove stack barrier at ", hex(stkbar.savedLRPtr), " with ", hex(stkbar.savedLRVal), ", goid=", gp.goid, "\n")
|
||||||
}
|
}
|
||||||
lrPtr := (*uintreg)(unsafe.Pointer(stkbar.savedLRPtr))
|
lrPtr := (*sys.Uintreg)(unsafe.Pointer(stkbar.savedLRPtr))
|
||||||
if val := *lrPtr; val != uintreg(stackBarrierPC) {
|
if val := *lrPtr; val != sys.Uintreg(stackBarrierPC) {
|
||||||
printlock()
|
printlock()
|
||||||
print("at *", hex(stkbar.savedLRPtr), " expected stack barrier PC ", hex(stackBarrierPC), ", found ", hex(val), ", goid=", gp.goid, "\n")
|
print("at *", hex(stkbar.savedLRPtr), " expected stack barrier PC ", hex(stackBarrierPC), ", found ", hex(val), ", goid=", gp.goid, "\n")
|
||||||
print("gp.stkbar=")
|
print("gp.stkbar=")
|
||||||
|
@ -227,7 +230,7 @@ func gcRemoveStackBarrier(gp *g, stkbar stkbar) {
|
||||||
print(", gp.stkbarPos=", gp.stkbarPos, ", gp.stack=[", hex(gp.stack.lo), ",", hex(gp.stack.hi), ")\n")
|
print(", gp.stkbarPos=", gp.stkbarPos, ", gp.stack=[", hex(gp.stack.lo), ",", hex(gp.stack.hi), ")\n")
|
||||||
throw("stack barrier lost")
|
throw("stack barrier lost")
|
||||||
}
|
}
|
||||||
*lrPtr = uintreg(stkbar.savedLRVal)
|
*lrPtr = sys.Uintreg(stkbar.savedLRVal)
|
||||||
}
|
}
|
||||||
|
|
||||||
// gcPrintStkbars prints a []stkbar for debugging.
|
// gcPrintStkbars prints a []stkbar for debugging.
|
||||||
|
|
|
@ -4,7 +4,10 @@
|
||||||
|
|
||||||
package runtime
|
package runtime
|
||||||
|
|
||||||
import "unsafe"
|
import (
|
||||||
|
"runtime/internal/sys"
|
||||||
|
"unsafe"
|
||||||
|
)
|
||||||
|
|
||||||
// From FreeBSD's <sys/sysctl.h>
|
// From FreeBSD's <sys/sysctl.h>
|
||||||
const (
|
const (
|
||||||
|
@ -133,7 +136,7 @@ func minit() {
|
||||||
|
|
||||||
// m.procid is a uint64, but thr_new writes a uint32 on 32-bit systems.
|
// m.procid is a uint64, but thr_new writes a uint32 on 32-bit systems.
|
||||||
// Fix it up. (Only matters on big-endian, but be clean anyway.)
|
// Fix it up. (Only matters on big-endian, but be clean anyway.)
|
||||||
if ptrSize == 4 {
|
if sys.PtrSize == 4 {
|
||||||
_g_.m.procid = uint64(*(*uint32)(unsafe.Pointer(&_g_.m.procid)))
|
_g_.m.procid = uint64(*(*uint32)(unsafe.Pointer(&_g_.m.procid)))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,10 @@
|
||||||
|
|
||||||
package runtime
|
package runtime
|
||||||
|
|
||||||
import "unsafe"
|
import (
|
||||||
|
"runtime/internal/sys"
|
||||||
|
"unsafe"
|
||||||
|
)
|
||||||
|
|
||||||
// Linux futex.
|
// Linux futex.
|
||||||
//
|
//
|
||||||
|
@ -44,7 +47,7 @@ func futexsleep(addr *uint32, val uint32, ns int64) {
|
||||||
// But on real 64-bit systems, where words are larger but the stack limit
|
// But on real 64-bit systems, where words are larger but the stack limit
|
||||||
// is not, even timediv is too heavy, and we really need to use just an
|
// is not, even timediv is too heavy, and we really need to use just an
|
||||||
// ordinary machine instruction.
|
// ordinary machine instruction.
|
||||||
if ptrSize == 8 {
|
if sys.PtrSize == 8 {
|
||||||
ts.set_sec(ns / 1000000000)
|
ts.set_sec(ns / 1000000000)
|
||||||
ts.set_nsec(int32(ns % 1000000000))
|
ts.set_nsec(int32(ns % 1000000000))
|
||||||
} else {
|
} else {
|
||||||
|
@ -81,10 +84,10 @@ func getproccount() int32 {
|
||||||
// buffers, but we don't have a dynamic memory allocator at the
|
// buffers, but we don't have a dynamic memory allocator at the
|
||||||
// moment, so that's a bit tricky and seems like overkill.
|
// moment, so that's a bit tricky and seems like overkill.
|
||||||
const maxCPUs = 64 * 1024
|
const maxCPUs = 64 * 1024
|
||||||
var buf [maxCPUs / (ptrSize * 8)]uintptr
|
var buf [maxCPUs / (sys.PtrSize * 8)]uintptr
|
||||||
r := sched_getaffinity(0, unsafe.Sizeof(buf), &buf[0])
|
r := sched_getaffinity(0, unsafe.Sizeof(buf), &buf[0])
|
||||||
n := int32(0)
|
n := int32(0)
|
||||||
for _, v := range buf[:r/ptrSize] {
|
for _, v := range buf[:r/sys.PtrSize] {
|
||||||
for v != 0 {
|
for v != 0 {
|
||||||
n += int32(v & 1)
|
n += int32(v & 1)
|
||||||
v >>= 1
|
v >>= 1
|
||||||
|
|
|
@ -4,7 +4,10 @@
|
||||||
|
|
||||||
package runtime
|
package runtime
|
||||||
|
|
||||||
import "unsafe"
|
import (
|
||||||
|
"runtime/internal/sys"
|
||||||
|
"unsafe"
|
||||||
|
)
|
||||||
|
|
||||||
// May run during STW, so write barriers are not allowed.
|
// May run during STW, so write barriers are not allowed.
|
||||||
//go:nowritebarrier
|
//go:nowritebarrier
|
||||||
|
@ -69,11 +72,11 @@ func sighandler(_ureg *ureg, note *byte, gp *g) int {
|
||||||
// to sigpanic instead. (Otherwise the trace will end at
|
// to sigpanic instead. (Otherwise the trace will end at
|
||||||
// sigpanic and we won't get to see who faulted).
|
// sigpanic and we won't get to see who faulted).
|
||||||
if pc != 0 {
|
if pc != 0 {
|
||||||
if regSize > ptrSize {
|
if sys.RegSize > sys.PtrSize {
|
||||||
sp -= ptrSize
|
sp -= sys.PtrSize
|
||||||
*(*uintptr)(unsafe.Pointer(sp)) = 0
|
*(*uintptr)(unsafe.Pointer(sp)) = 0
|
||||||
}
|
}
|
||||||
sp -= ptrSize
|
sp -= sys.PtrSize
|
||||||
*(*uintptr)(unsafe.Pointer(sp)) = pc
|
*(*uintptr)(unsafe.Pointer(sp)) = pc
|
||||||
c.setsp(sp)
|
c.setsp(sp)
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,7 +4,10 @@
|
||||||
|
|
||||||
package runtime
|
package runtime
|
||||||
|
|
||||||
import "unsafe"
|
import (
|
||||||
|
"runtime/internal/sys"
|
||||||
|
"unsafe"
|
||||||
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
_AT_NULL = 0
|
_AT_NULL = 0
|
||||||
|
@ -21,7 +24,7 @@ func sysargs(argc int32, argv **byte) {
|
||||||
n++
|
n++
|
||||||
}
|
}
|
||||||
n++
|
n++
|
||||||
auxv := (*[1 << 28]uint32)(add(unsafe.Pointer(argv), uintptr(n)*ptrSize))
|
auxv := (*[1 << 28]uint32)(add(unsafe.Pointer(argv), uintptr(n)*sys.PtrSize))
|
||||||
|
|
||||||
for i := 0; auxv[i] != _AT_NULL; i += 2 {
|
for i := 0; auxv[i] != _AT_NULL; i += 2 {
|
||||||
switch auxv[i] {
|
switch auxv[i] {
|
||||||
|
|
|
@ -4,7 +4,10 @@
|
||||||
|
|
||||||
package runtime
|
package runtime
|
||||||
|
|
||||||
import "unsafe"
|
import (
|
||||||
|
"runtime/internal/sys"
|
||||||
|
"unsafe"
|
||||||
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
_AT_NULL = 0
|
_AT_NULL = 0
|
||||||
|
@ -40,7 +43,7 @@ func sysargs(argc int32, argv **byte) {
|
||||||
n++
|
n++
|
||||||
}
|
}
|
||||||
n++
|
n++
|
||||||
auxv := (*[1 << 28]uint32)(add(unsafe.Pointer(argv), uintptr(n)*ptrSize))
|
auxv := (*[1 << 28]uint32)(add(unsafe.Pointer(argv), uintptr(n)*sys.PtrSize))
|
||||||
|
|
||||||
for i := 0; auxv[i] != _AT_NULL; i += 2 {
|
for i := 0; auxv[i] != _AT_NULL; i += 2 {
|
||||||
switch auxv[i] {
|
switch auxv[i] {
|
||||||
|
|
|
@ -6,7 +6,10 @@
|
||||||
|
|
||||||
package runtime
|
package runtime
|
||||||
|
|
||||||
import "runtime/internal/atomic"
|
import (
|
||||||
|
"runtime/internal/atomic"
|
||||||
|
"runtime/internal/sys"
|
||||||
|
)
|
||||||
|
|
||||||
// A parfor holds state for the parallel for operation.
|
// A parfor holds state for the parallel for operation.
|
||||||
type parfor struct {
|
type parfor struct {
|
||||||
|
@ -38,7 +41,7 @@ type parforthread struct {
|
||||||
nprocyield uint64
|
nprocyield uint64
|
||||||
nosyield uint64
|
nosyield uint64
|
||||||
nsleep uint64
|
nsleep uint64
|
||||||
pad [_CacheLineSize]byte
|
pad [sys.CacheLineSize]byte
|
||||||
}
|
}
|
||||||
|
|
||||||
func parforalloc(nthrmax uint32) *parfor {
|
func parforalloc(nthrmax uint32) *parfor {
|
||||||
|
|
|
@ -6,6 +6,7 @@ package runtime
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"runtime/internal/atomic"
|
"runtime/internal/atomic"
|
||||||
|
"runtime/internal/sys"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -55,7 +56,7 @@ func main() {
|
||||||
// Max stack size is 1 GB on 64-bit, 250 MB on 32-bit.
|
// Max stack size is 1 GB on 64-bit, 250 MB on 32-bit.
|
||||||
// Using decimal instead of binary GB and MB because
|
// Using decimal instead of binary GB and MB because
|
||||||
// they look nicer in the stack overflow failure message.
|
// they look nicer in the stack overflow failure message.
|
||||||
if ptrSize == 8 {
|
if sys.PtrSize == 8 {
|
||||||
maxstacksize = 1000000000
|
maxstacksize = 1000000000
|
||||||
} else {
|
} else {
|
||||||
maxstacksize = 250000000
|
maxstacksize = 250000000
|
||||||
|
@ -306,7 +307,7 @@ func releaseSudog(s *sudog) {
|
||||||
// It assumes that f is a func value. Otherwise the behavior is undefined.
|
// It assumes that f is a func value. Otherwise the behavior is undefined.
|
||||||
//go:nosplit
|
//go:nosplit
|
||||||
func funcPC(f interface{}) uintptr {
|
func funcPC(f interface{}) uintptr {
|
||||||
return **(**uintptr)(add(unsafe.Pointer(&f), ptrSize))
|
return **(**uintptr)(add(unsafe.Pointer(&f), sys.PtrSize))
|
||||||
}
|
}
|
||||||
|
|
||||||
// called from assembly
|
// called from assembly
|
||||||
|
@ -393,10 +394,10 @@ func schedinit() {
|
||||||
throw("unknown runnable goroutine during bootstrap")
|
throw("unknown runnable goroutine during bootstrap")
|
||||||
}
|
}
|
||||||
|
|
||||||
if buildVersion == "" {
|
if sys.BuildVersion == "" {
|
||||||
// Condition should never trigger. This code just serves
|
// Condition should never trigger. This code just serves
|
||||||
// to ensure runtime·buildVersion is kept in the resulting binary.
|
// to ensure runtime·buildVersion is kept in the resulting binary.
|
||||||
buildVersion = "unknown"
|
sys.BuildVersion = "unknown"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -999,7 +1000,7 @@ func mstart() {
|
||||||
// Cgo may have left stack size in stack.hi.
|
// Cgo may have left stack size in stack.hi.
|
||||||
size := _g_.stack.hi
|
size := _g_.stack.hi
|
||||||
if size == 0 {
|
if size == 0 {
|
||||||
size = 8192 * stackGuardMultiplier
|
size = 8192 * sys.StackGuardMultiplier
|
||||||
}
|
}
|
||||||
_g_.stack.hi = uintptr(noescape(unsafe.Pointer(&size)))
|
_g_.stack.hi = uintptr(noescape(unsafe.Pointer(&size)))
|
||||||
_g_.stack.lo = _g_.stack.hi - size + 1024
|
_g_.stack.lo = _g_.stack.hi - size + 1024
|
||||||
|
@ -1202,7 +1203,7 @@ func allocm(_p_ *p, fn func()) *m {
|
||||||
if iscgo || GOOS == "solaris" || GOOS == "windows" || GOOS == "plan9" {
|
if iscgo || GOOS == "solaris" || GOOS == "windows" || GOOS == "plan9" {
|
||||||
mp.g0 = malg(-1)
|
mp.g0 = malg(-1)
|
||||||
} else {
|
} else {
|
||||||
mp.g0 = malg(8192 * stackGuardMultiplier)
|
mp.g0 = malg(8192 * sys.StackGuardMultiplier)
|
||||||
}
|
}
|
||||||
mp.g0.m = mp
|
mp.g0.m = mp
|
||||||
|
|
||||||
|
@ -1305,9 +1306,9 @@ func newextram() {
|
||||||
// the goroutine stack ends.
|
// the goroutine stack ends.
|
||||||
mp := allocm(nil, nil)
|
mp := allocm(nil, nil)
|
||||||
gp := malg(4096)
|
gp := malg(4096)
|
||||||
gp.sched.pc = funcPC(goexit) + _PCQuantum
|
gp.sched.pc = funcPC(goexit) + sys.PCQuantum
|
||||||
gp.sched.sp = gp.stack.hi
|
gp.sched.sp = gp.stack.hi
|
||||||
gp.sched.sp -= 4 * regSize // extra space in case of reads slightly beyond frame
|
gp.sched.sp -= 4 * sys.RegSize // extra space in case of reads slightly beyond frame
|
||||||
gp.sched.lr = 0
|
gp.sched.lr = 0
|
||||||
gp.sched.g = guintptr(unsafe.Pointer(gp))
|
gp.sched.g = guintptr(unsafe.Pointer(gp))
|
||||||
gp.syscallpc = gp.sched.pc
|
gp.syscallpc = gp.sched.pc
|
||||||
|
@ -2535,7 +2536,7 @@ func malg(stacksize int32) *g {
|
||||||
// copied if a stack split occurred.
|
// copied if a stack split occurred.
|
||||||
//go:nosplit
|
//go:nosplit
|
||||||
func newproc(siz int32, fn *funcval) {
|
func newproc(siz int32, fn *funcval) {
|
||||||
argp := add(unsafe.Pointer(&fn), ptrSize)
|
argp := add(unsafe.Pointer(&fn), sys.PtrSize)
|
||||||
pc := getcallerpc(unsafe.Pointer(&siz))
|
pc := getcallerpc(unsafe.Pointer(&siz))
|
||||||
systemstack(func() {
|
systemstack(func() {
|
||||||
newproc1(fn, (*uint8)(argp), siz, 0, pc)
|
newproc1(fn, (*uint8)(argp), siz, 0, pc)
|
||||||
|
@ -2561,7 +2562,7 @@ func newproc1(fn *funcval, argp *uint8, narg int32, nret int32, callerpc uintptr
|
||||||
// Not worth it: this is almost always an error.
|
// Not worth it: this is almost always an error.
|
||||||
// 4*sizeof(uintreg): extra space added below
|
// 4*sizeof(uintreg): extra space added below
|
||||||
// sizeof(uintreg): caller's LR (arm) or return address (x86, in gostartcall).
|
// sizeof(uintreg): caller's LR (arm) or return address (x86, in gostartcall).
|
||||||
if siz >= _StackMin-4*regSize-regSize {
|
if siz >= _StackMin-4*sys.RegSize-sys.RegSize {
|
||||||
throw("newproc: function arguments too large for new goroutine")
|
throw("newproc: function arguments too large for new goroutine")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2580,21 +2581,21 @@ func newproc1(fn *funcval, argp *uint8, narg int32, nret int32, callerpc uintptr
|
||||||
throw("newproc1: new g is not Gdead")
|
throw("newproc1: new g is not Gdead")
|
||||||
}
|
}
|
||||||
|
|
||||||
totalSize := 4*regSize + uintptr(siz) + minFrameSize // extra space in case of reads slightly beyond frame
|
totalSize := 4*sys.RegSize + uintptr(siz) + sys.MinFrameSize // extra space in case of reads slightly beyond frame
|
||||||
totalSize += -totalSize & (spAlign - 1) // align to spAlign
|
totalSize += -totalSize & (sys.SpAlign - 1) // align to spAlign
|
||||||
sp := newg.stack.hi - totalSize
|
sp := newg.stack.hi - totalSize
|
||||||
spArg := sp
|
spArg := sp
|
||||||
if usesLR {
|
if usesLR {
|
||||||
// caller's LR
|
// caller's LR
|
||||||
*(*unsafe.Pointer)(unsafe.Pointer(sp)) = nil
|
*(*unsafe.Pointer)(unsafe.Pointer(sp)) = nil
|
||||||
spArg += minFrameSize
|
spArg += sys.MinFrameSize
|
||||||
}
|
}
|
||||||
memmove(unsafe.Pointer(spArg), unsafe.Pointer(argp), uintptr(narg))
|
memmove(unsafe.Pointer(spArg), unsafe.Pointer(argp), uintptr(narg))
|
||||||
|
|
||||||
memclr(unsafe.Pointer(&newg.sched), unsafe.Sizeof(newg.sched))
|
memclr(unsafe.Pointer(&newg.sched), unsafe.Sizeof(newg.sched))
|
||||||
newg.sched.sp = sp
|
newg.sched.sp = sp
|
||||||
newg.stktopsp = sp
|
newg.stktopsp = sp
|
||||||
newg.sched.pc = funcPC(goexit) + _PCQuantum // +PCQuantum so that previous instruction is in same function
|
newg.sched.pc = funcPC(goexit) + sys.PCQuantum // +PCQuantum so that previous instruction is in same function
|
||||||
newg.sched.g = guintptr(unsafe.Pointer(newg))
|
newg.sched.g = guintptr(unsafe.Pointer(newg))
|
||||||
gostartcallfn(&newg.sched, fn)
|
gostartcallfn(&newg.sched, fn)
|
||||||
newg.gopc = callerpc
|
newg.gopc = callerpc
|
||||||
|
@ -2928,13 +2929,13 @@ func sigprof(pc, sp, lr uintptr, gp *g, mp *m) {
|
||||||
n = 2
|
n = 2
|
||||||
// "ExternalCode" is better than "etext".
|
// "ExternalCode" is better than "etext".
|
||||||
if pc > firstmoduledata.etext {
|
if pc > firstmoduledata.etext {
|
||||||
pc = funcPC(_ExternalCode) + _PCQuantum
|
pc = funcPC(_ExternalCode) + sys.PCQuantum
|
||||||
}
|
}
|
||||||
stk[0] = pc
|
stk[0] = pc
|
||||||
if mp.preemptoff != "" || mp.helpgc != 0 {
|
if mp.preemptoff != "" || mp.helpgc != 0 {
|
||||||
stk[1] = funcPC(_GC) + _PCQuantum
|
stk[1] = funcPC(_GC) + sys.PCQuantum
|
||||||
} else {
|
} else {
|
||||||
stk[1] = funcPC(_System) + _PCQuantum
|
stk[1] = funcPC(_System) + sys.PCQuantum
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3981,7 +3982,7 @@ func setMaxThreads(in int) (out int) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func haveexperiment(name string) bool {
|
func haveexperiment(name string) bool {
|
||||||
x := goexperiment
|
x := sys.Goexperiment
|
||||||
for x != "" {
|
for x != "" {
|
||||||
xname := ""
|
xname := ""
|
||||||
i := index(x, ",")
|
i := index(x, ",")
|
||||||
|
|
|
@ -6,6 +6,7 @@ package runtime
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"runtime/internal/atomic"
|
"runtime/internal/atomic"
|
||||||
|
"runtime/internal/sys"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -52,7 +53,7 @@ var (
|
||||||
// nosplit for use in linux/386 startup linux_setup_vdso
|
// nosplit for use in linux/386 startup linux_setup_vdso
|
||||||
//go:nosplit
|
//go:nosplit
|
||||||
func argv_index(argv **byte, i int32) *byte {
|
func argv_index(argv **byte, i int32) *byte {
|
||||||
return *(**byte)(add(unsafe.Pointer(argv), uintptr(i)*ptrSize))
|
return *(**byte)(add(unsafe.Pointer(argv), uintptr(i)*sys.PtrSize))
|
||||||
}
|
}
|
||||||
|
|
||||||
func args(c int32, v **byte) {
|
func args(c int32, v **byte) {
|
||||||
|
@ -192,10 +193,10 @@ func check() {
|
||||||
if unsafe.Sizeof(j) != 8 {
|
if unsafe.Sizeof(j) != 8 {
|
||||||
throw("bad j")
|
throw("bad j")
|
||||||
}
|
}
|
||||||
if unsafe.Sizeof(k) != ptrSize {
|
if unsafe.Sizeof(k) != sys.PtrSize {
|
||||||
throw("bad k")
|
throw("bad k")
|
||||||
}
|
}
|
||||||
if unsafe.Sizeof(l) != ptrSize {
|
if unsafe.Sizeof(l) != sys.PtrSize {
|
||||||
throw("bad l")
|
throw("bad l")
|
||||||
}
|
}
|
||||||
if unsafe.Sizeof(x1) != 1 {
|
if unsafe.Sizeof(x1) != 1 {
|
||||||
|
@ -238,7 +239,7 @@ func check() {
|
||||||
}
|
}
|
||||||
|
|
||||||
k = unsafe.Pointer(uintptr(0xfedcb123))
|
k = unsafe.Pointer(uintptr(0xfedcb123))
|
||||||
if ptrSize == 8 {
|
if sys.PtrSize == 8 {
|
||||||
k = unsafe.Pointer(uintptr(unsafe.Pointer(k)) << 10)
|
k = unsafe.Pointer(uintptr(unsafe.Pointer(k)) << 10)
|
||||||
}
|
}
|
||||||
if casp(&k, nil, nil) {
|
if casp(&k, nil, nil) {
|
||||||
|
|
|
@ -6,6 +6,7 @@ package runtime
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"runtime/internal/atomic"
|
"runtime/internal/atomic"
|
||||||
|
"runtime/internal/sys"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -48,14 +49,6 @@ const (
|
||||||
_Pdead
|
_Pdead
|
||||||
)
|
)
|
||||||
|
|
||||||
// The next line makes 'go generate' write the zgen_*.go files with
|
|
||||||
// per-OS and per-arch information, including constants
|
|
||||||
// named goos_$GOOS and goarch_$GOARCH for every
|
|
||||||
// known GOOS and GOARCH. The constant is 1 on the
|
|
||||||
// current system, 0 otherwise; multiplying by them is
|
|
||||||
// useful for defining GOOS- or GOARCH-specific constants.
|
|
||||||
//go:generate go run gengoos.go
|
|
||||||
|
|
||||||
type mutex struct {
|
type mutex struct {
|
||||||
// Futex-based impl treats it as uint32 key,
|
// Futex-based impl treats it as uint32 key,
|
||||||
// while sema-based impl as M* waitm.
|
// while sema-based impl as M* waitm.
|
||||||
|
@ -151,7 +144,7 @@ type gobuf struct {
|
||||||
pc uintptr
|
pc uintptr
|
||||||
g guintptr
|
g guintptr
|
||||||
ctxt unsafe.Pointer // this has to be a pointer so that gc scans it
|
ctxt unsafe.Pointer // this has to be a pointer so that gc scans it
|
||||||
ret uintreg
|
ret sys.Uintreg
|
||||||
lr uintptr
|
lr uintptr
|
||||||
bp uintptr // for GOEXPERIMENT=framepointer
|
bp uintptr // for GOEXPERIMENT=framepointer
|
||||||
}
|
}
|
||||||
|
@ -533,7 +526,7 @@ type forcegcstate struct {
|
||||||
* known to compiler
|
* known to compiler
|
||||||
*/
|
*/
|
||||||
const (
|
const (
|
||||||
_Structrnd = regSize
|
_Structrnd = sys.RegSize
|
||||||
)
|
)
|
||||||
|
|
||||||
// startup_random_data holds random bytes initialized at startup. These come from
|
// startup_random_data holds random bytes initialized at startup. These come from
|
||||||
|
@ -553,7 +546,7 @@ func extendRandom(r []byte, n int) {
|
||||||
w = 16
|
w = 16
|
||||||
}
|
}
|
||||||
h := memhash(unsafe.Pointer(&r[n-w]), uintptr(nanotime()), uintptr(w))
|
h := memhash(unsafe.Pointer(&r[n-w]), uintptr(nanotime()), uintptr(w))
|
||||||
for i := 0; i < ptrSize && n < len(r); i++ {
|
for i := 0; i < sys.PtrSize && n < len(r); i++ {
|
||||||
r[n] = byte(h)
|
r[n] = byte(h)
|
||||||
n++
|
n++
|
||||||
h >>= 8
|
h >>= 8
|
||||||
|
|
|
@ -6,7 +6,10 @@ package runtime
|
||||||
|
|
||||||
// This file contains the implementation of Go select statements.
|
// This file contains the implementation of Go select statements.
|
||||||
|
|
||||||
import "unsafe"
|
import (
|
||||||
|
"runtime/internal/sys"
|
||||||
|
"unsafe"
|
||||||
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
debugSelect = false
|
debugSelect = false
|
||||||
|
@ -51,7 +54,7 @@ func selectsize(size uintptr) uintptr {
|
||||||
(size-1)*unsafe.Sizeof(hselect{}.scase[0]) +
|
(size-1)*unsafe.Sizeof(hselect{}.scase[0]) +
|
||||||
size*unsafe.Sizeof(*hselect{}.lockorder) +
|
size*unsafe.Sizeof(*hselect{}.lockorder) +
|
||||||
size*unsafe.Sizeof(*hselect{}.pollorder)
|
size*unsafe.Sizeof(*hselect{}.pollorder)
|
||||||
return round(selsize, _Int64Align)
|
return round(selsize, sys.Int64Align)
|
||||||
}
|
}
|
||||||
|
|
||||||
func newselect(sel *hselect, selsize int64, size int32) {
|
func newselect(sel *hselect, selsize int64, size int32) {
|
||||||
|
|
|
@ -21,6 +21,7 @@ package runtime
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"runtime/internal/atomic"
|
"runtime/internal/atomic"
|
||||||
|
"runtime/internal/sys"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -38,7 +39,7 @@ const semTabSize = 251
|
||||||
|
|
||||||
var semtable [semTabSize]struct {
|
var semtable [semTabSize]struct {
|
||||||
root semaRoot
|
root semaRoot
|
||||||
pad [_CacheLineSize - unsafe.Sizeof(semaRoot{})]byte
|
pad [sys.CacheLineSize - unsafe.Sizeof(semaRoot{})]byte
|
||||||
}
|
}
|
||||||
|
|
||||||
//go:linkname sync_runtime_Semacquire sync.runtime_Semacquire
|
//go:linkname sync_runtime_Semacquire sync.runtime_Semacquire
|
||||||
|
|
|
@ -6,6 +6,8 @@
|
||||||
|
|
||||||
package runtime
|
package runtime
|
||||||
|
|
||||||
|
import "runtime/internal/sys"
|
||||||
|
|
||||||
const (
|
const (
|
||||||
_SIG_DFL uintptr = 0
|
_SIG_DFL uintptr = 0
|
||||||
_SIG_IGN uintptr = 1
|
_SIG_IGN uintptr = 1
|
||||||
|
@ -185,7 +187,7 @@ func crash() {
|
||||||
// this means the OS X core file will be >128 GB and even on a zippy
|
// this means the OS X core file will be >128 GB and even on a zippy
|
||||||
// workstation can take OS X well over an hour to write (uninterruptible).
|
// workstation can take OS X well over an hour to write (uninterruptible).
|
||||||
// Save users from making that mistake.
|
// Save users from making that mistake.
|
||||||
if ptrSize == 8 {
|
if sys.PtrSize == 8 {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,7 +6,10 @@
|
||||||
|
|
||||||
package runtime
|
package runtime
|
||||||
|
|
||||||
import "unsafe"
|
import (
|
||||||
|
"runtime/internal/sys"
|
||||||
|
"unsafe"
|
||||||
|
)
|
||||||
|
|
||||||
func dumpregs(c *sigctxt) {
|
func dumpregs(c *sigctxt) {
|
||||||
print("eax ", hex(c.eax()), "\n")
|
print("eax ", hex(c.eax()), "\n")
|
||||||
|
@ -85,11 +88,11 @@ func sighandler(sig uint32, info *siginfo, ctxt unsafe.Pointer, gp *g) {
|
||||||
// (Otherwise the trace will end at runtime.sigpanic and we
|
// (Otherwise the trace will end at runtime.sigpanic and we
|
||||||
// won't get to see who faulted.)
|
// won't get to see who faulted.)
|
||||||
if pc != 0 {
|
if pc != 0 {
|
||||||
if regSize > ptrSize {
|
if sys.RegSize > sys.PtrSize {
|
||||||
sp -= ptrSize
|
sp -= sys.PtrSize
|
||||||
*(*uintptr)(unsafe.Pointer(sp)) = 0
|
*(*uintptr)(unsafe.Pointer(sp)) = 0
|
||||||
}
|
}
|
||||||
sp -= ptrSize
|
sp -= sys.PtrSize
|
||||||
*(*uintptr)(unsafe.Pointer(sp)) = pc
|
*(*uintptr)(unsafe.Pointer(sp)) = pc
|
||||||
c.set_esp(uint32(sp))
|
c.set_esp(uint32(sp))
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
package runtime
|
package runtime
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"runtime/internal/sys"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -119,11 +120,11 @@ func sighandler(sig uint32, info *siginfo, ctxt unsafe.Pointer, gp *g) {
|
||||||
// (Otherwise the trace will end at runtime.sigpanic and we
|
// (Otherwise the trace will end at runtime.sigpanic and we
|
||||||
// won't get to see who faulted.)
|
// won't get to see who faulted.)
|
||||||
if pc != 0 {
|
if pc != 0 {
|
||||||
if regSize > ptrSize {
|
if sys.RegSize > sys.PtrSize {
|
||||||
sp -= ptrSize
|
sp -= sys.PtrSize
|
||||||
*(*uintptr)(unsafe.Pointer(sp)) = 0
|
*(*uintptr)(unsafe.Pointer(sp)) = 0
|
||||||
}
|
}
|
||||||
sp -= ptrSize
|
sp -= sys.PtrSize
|
||||||
*(*uintptr)(unsafe.Pointer(sp)) = pc
|
*(*uintptr)(unsafe.Pointer(sp)) = pc
|
||||||
c.set_rsp(uint64(sp))
|
c.set_rsp(uint64(sp))
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,7 +6,10 @@
|
||||||
|
|
||||||
package runtime
|
package runtime
|
||||||
|
|
||||||
import "unsafe"
|
import (
|
||||||
|
"runtime/internal/sys"
|
||||||
|
"unsafe"
|
||||||
|
)
|
||||||
|
|
||||||
func dumpregs(c *sigctxt) {
|
func dumpregs(c *sigctxt) {
|
||||||
print("r0 ", hex(c.r0()), "\n")
|
print("r0 ", hex(c.r0()), "\n")
|
||||||
|
@ -78,7 +81,7 @@ func sighandler(sig uint32, info *siginfo, ctxt unsafe.Pointer, gp *g) {
|
||||||
// functions are correctly handled. This smashes
|
// functions are correctly handled. This smashes
|
||||||
// the stack frame but we're not going back there
|
// the stack frame but we're not going back there
|
||||||
// anyway.
|
// anyway.
|
||||||
sp := c.sp() - spAlign // needs only sizeof uint64, but must align the stack
|
sp := c.sp() - sys.SpAlign // needs only sizeof uint64, but must align the stack
|
||||||
c.set_sp(sp)
|
c.set_sp(sp)
|
||||||
*(*uint64)(unsafe.Pointer(uintptr(sp))) = c.lr()
|
*(*uint64)(unsafe.Pointer(uintptr(sp))) = c.lr()
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,10 @@
|
||||||
|
|
||||||
package runtime
|
package runtime
|
||||||
|
|
||||||
import "unsafe"
|
import (
|
||||||
|
"runtime/internal/sys"
|
||||||
|
"unsafe"
|
||||||
|
)
|
||||||
|
|
||||||
type sigctxt struct {
|
type sigctxt struct {
|
||||||
info *siginfo
|
info *siginfo
|
||||||
|
@ -32,5 +35,5 @@ func (c *sigctxt) set_eip(x uint32) { c.regs().eip = x }
|
||||||
func (c *sigctxt) set_esp(x uint32) { c.regs().esp = x }
|
func (c *sigctxt) set_esp(x uint32) { c.regs().esp = x }
|
||||||
func (c *sigctxt) set_sigcode(x uint32) { c.info.si_code = int32(x) }
|
func (c *sigctxt) set_sigcode(x uint32) { c.info.si_code = int32(x) }
|
||||||
func (c *sigctxt) set_sigaddr(x uint32) {
|
func (c *sigctxt) set_sigaddr(x uint32) {
|
||||||
*(*uintptr)(add(unsafe.Pointer(c.info), 2*ptrSize)) = uintptr(x)
|
*(*uintptr)(add(unsafe.Pointer(c.info), 2*sys.PtrSize)) = uintptr(x)
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,7 +4,10 @@
|
||||||
|
|
||||||
package runtime
|
package runtime
|
||||||
|
|
||||||
import "unsafe"
|
import (
|
||||||
|
"runtime/internal/sys"
|
||||||
|
"unsafe"
|
||||||
|
)
|
||||||
|
|
||||||
type sigctxt struct {
|
type sigctxt struct {
|
||||||
info *siginfo
|
info *siginfo
|
||||||
|
@ -42,5 +45,5 @@ func (c *sigctxt) set_rip(x uint64) { c.regs().rip = x }
|
||||||
func (c *sigctxt) set_rsp(x uint64) { c.regs().rsp = x }
|
func (c *sigctxt) set_rsp(x uint64) { c.regs().rsp = x }
|
||||||
func (c *sigctxt) set_sigcode(x uint64) { c.info.si_code = int32(x) }
|
func (c *sigctxt) set_sigcode(x uint64) { c.info.si_code = int32(x) }
|
||||||
func (c *sigctxt) set_sigaddr(x uint64) {
|
func (c *sigctxt) set_sigaddr(x uint64) {
|
||||||
*(*uintptr)(add(unsafe.Pointer(c.info), 2*ptrSize)) = uintptr(x)
|
*(*uintptr)(add(unsafe.Pointer(c.info), 2*sys.PtrSize)) = uintptr(x)
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,7 +4,10 @@
|
||||||
|
|
||||||
package runtime
|
package runtime
|
||||||
|
|
||||||
import "unsafe"
|
import (
|
||||||
|
"runtime/internal/sys"
|
||||||
|
"unsafe"
|
||||||
|
)
|
||||||
|
|
||||||
type sigctxt struct {
|
type sigctxt struct {
|
||||||
info *siginfo
|
info *siginfo
|
||||||
|
@ -44,5 +47,5 @@ func (c *sigctxt) set_r10(x uint32) { c.regs().r10 = x }
|
||||||
|
|
||||||
func (c *sigctxt) set_sigcode(x uint32) { c.info.si_code = int32(x) }
|
func (c *sigctxt) set_sigcode(x uint32) { c.info.si_code = int32(x) }
|
||||||
func (c *sigctxt) set_sigaddr(x uint32) {
|
func (c *sigctxt) set_sigaddr(x uint32) {
|
||||||
*(*uintptr)(add(unsafe.Pointer(c.info), 2*ptrSize)) = uintptr(x)
|
*(*uintptr)(add(unsafe.Pointer(c.info), 2*sys.PtrSize)) = uintptr(x)
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,7 +4,10 @@
|
||||||
|
|
||||||
package runtime
|
package runtime
|
||||||
|
|
||||||
import "unsafe"
|
import (
|
||||||
|
"runtime/internal/sys"
|
||||||
|
"unsafe"
|
||||||
|
)
|
||||||
|
|
||||||
type sigctxt struct {
|
type sigctxt struct {
|
||||||
info *siginfo
|
info *siginfo
|
||||||
|
@ -57,5 +60,5 @@ func (c *sigctxt) set_lr(x uint64) { c.regs().regs[30] = x }
|
||||||
func (c *sigctxt) set_r28(x uint64) { c.regs().regs[28] = x }
|
func (c *sigctxt) set_r28(x uint64) { c.regs().regs[28] = x }
|
||||||
|
|
||||||
func (c *sigctxt) set_sigaddr(x uint64) {
|
func (c *sigctxt) set_sigaddr(x uint64) {
|
||||||
*(*uintptr)(add(unsafe.Pointer(c.info), 2*ptrSize)) = uintptr(x)
|
*(*uintptr)(add(unsafe.Pointer(c.info), 2*sys.PtrSize)) = uintptr(x)
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,7 +7,10 @@
|
||||||
|
|
||||||
package runtime
|
package runtime
|
||||||
|
|
||||||
import "unsafe"
|
import (
|
||||||
|
"runtime/internal/sys"
|
||||||
|
"unsafe"
|
||||||
|
)
|
||||||
|
|
||||||
type sigctxt struct {
|
type sigctxt struct {
|
||||||
info *siginfo
|
info *siginfo
|
||||||
|
@ -67,5 +70,5 @@ func (c *sigctxt) set_link(x uint64) { c.regs().link = x }
|
||||||
|
|
||||||
func (c *sigctxt) set_sigcode(x uint32) { c.info.si_code = int32(x) }
|
func (c *sigctxt) set_sigcode(x uint32) { c.info.si_code = int32(x) }
|
||||||
func (c *sigctxt) set_sigaddr(x uint64) {
|
func (c *sigctxt) set_sigaddr(x uint64) {
|
||||||
*(*uintptr)(add(unsafe.Pointer(c.info), 2*ptrSize)) = uintptr(x)
|
*(*uintptr)(add(unsafe.Pointer(c.info), 2*sys.PtrSize)) = uintptr(x)
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,7 +7,10 @@
|
||||||
|
|
||||||
package runtime
|
package runtime
|
||||||
|
|
||||||
import "unsafe"
|
import (
|
||||||
|
"runtime/internal/sys"
|
||||||
|
"unsafe"
|
||||||
|
)
|
||||||
|
|
||||||
func dumpregs(c *sigctxt) {
|
func dumpregs(c *sigctxt) {
|
||||||
print("r0 ", hex(c.r0()), "\t")
|
print("r0 ", hex(c.r0()), "\t")
|
||||||
|
@ -82,7 +85,7 @@ func sighandler(sig uint32, info *siginfo, ctxt unsafe.Pointer, gp *g) {
|
||||||
// functions are correctly handled. This smashes
|
// functions are correctly handled. This smashes
|
||||||
// the stack frame but we're not going back there
|
// the stack frame but we're not going back there
|
||||||
// anyway.
|
// anyway.
|
||||||
sp := c.sp() - minFrameSize
|
sp := c.sp() - sys.MinFrameSize
|
||||||
c.set_sp(sp)
|
c.set_sp(sp)
|
||||||
*(*uint64)(unsafe.Pointer(uintptr(sp))) = c.link()
|
*(*uint64)(unsafe.Pointer(uintptr(sp))) = c.link()
|
||||||
|
|
||||||
|
|
|
@ -6,6 +6,7 @@ package runtime
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"runtime/internal/atomic"
|
"runtime/internal/atomic"
|
||||||
|
"runtime/internal/sys"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -64,7 +65,7 @@ const (
|
||||||
// to each stack below the usual guard area for OS-specific
|
// to each stack below the usual guard area for OS-specific
|
||||||
// purposes like signal handling. Used on Windows, Plan 9,
|
// purposes like signal handling. Used on Windows, Plan 9,
|
||||||
// and Darwin/ARM because they do not use a separate stack.
|
// and Darwin/ARM because they do not use a separate stack.
|
||||||
_StackSystem = goos_windows*512*ptrSize + goos_plan9*512 + goos_darwin*goarch_arm*1024
|
_StackSystem = sys.GoosWindows*512*sys.PtrSize + sys.GoosPlan9*512 + sys.GoosDarwin*sys.GoarchArm*1024
|
||||||
|
|
||||||
// The minimum size of stack used by Go code
|
// The minimum size of stack used by Go code
|
||||||
_StackMin = 2048
|
_StackMin = 2048
|
||||||
|
@ -89,7 +90,7 @@ const (
|
||||||
|
|
||||||
// The stack guard is a pointer this many bytes above the
|
// The stack guard is a pointer this many bytes above the
|
||||||
// bottom of the stack.
|
// bottom of the stack.
|
||||||
_StackGuard = 640*stackGuardMultiplier + _StackSystem
|
_StackGuard = 640*sys.StackGuardMultiplier + _StackSystem
|
||||||
|
|
||||||
// After a stack split check the SP is allowed to be this
|
// After a stack split check the SP is allowed to be this
|
||||||
// many bytes below the stack guard. This saves an instruction
|
// many bytes below the stack guard. This saves an instruction
|
||||||
|
@ -125,7 +126,7 @@ const (
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
uintptrMask = 1<<(8*ptrSize) - 1
|
uintptrMask = 1<<(8*sys.PtrSize) - 1
|
||||||
poisonStack = uintptrMask & 0x6868686868686868
|
poisonStack = uintptrMask & 0x6868686868686868
|
||||||
|
|
||||||
// Goroutine preemption request.
|
// Goroutine preemption request.
|
||||||
|
@ -536,10 +537,10 @@ func adjustpointers(scanp unsafe.Pointer, cbv *bitvector, adjinfo *adjustinfo, f
|
||||||
num := uintptr(bv.n)
|
num := uintptr(bv.n)
|
||||||
for i := uintptr(0); i < num; i++ {
|
for i := uintptr(0); i < num; i++ {
|
||||||
if stackDebug >= 4 {
|
if stackDebug >= 4 {
|
||||||
print(" ", add(scanp, i*ptrSize), ":", ptrnames[ptrbit(&bv, i)], ":", hex(*(*uintptr)(add(scanp, i*ptrSize))), " # ", i, " ", bv.bytedata[i/8], "\n")
|
print(" ", add(scanp, i*sys.PtrSize), ":", ptrnames[ptrbit(&bv, i)], ":", hex(*(*uintptr)(add(scanp, i*sys.PtrSize))), " # ", i, " ", bv.bytedata[i/8], "\n")
|
||||||
}
|
}
|
||||||
if ptrbit(&bv, i) == 1 {
|
if ptrbit(&bv, i) == 1 {
|
||||||
pp := (*uintptr)(add(scanp, i*ptrSize))
|
pp := (*uintptr)(add(scanp, i*sys.PtrSize))
|
||||||
p := *pp
|
p := *pp
|
||||||
if f != nil && 0 < p && p < _PageSize && debug.invalidptr != 0 || p == poisonStack {
|
if f != nil && 0 < p && p < _PageSize && debug.invalidptr != 0 || p == poisonStack {
|
||||||
// Looks like a junk value in a pointer slot.
|
// Looks like a junk value in a pointer slot.
|
||||||
|
@ -587,11 +588,11 @@ func adjustframe(frame *stkframe, arg unsafe.Pointer) bool {
|
||||||
// Adjust local variables if stack frame has been allocated.
|
// Adjust local variables if stack frame has been allocated.
|
||||||
size := frame.varp - frame.sp
|
size := frame.varp - frame.sp
|
||||||
var minsize uintptr
|
var minsize uintptr
|
||||||
switch thechar {
|
switch sys.TheChar {
|
||||||
case '7':
|
case '7':
|
||||||
minsize = spAlign
|
minsize = sys.SpAlign
|
||||||
default:
|
default:
|
||||||
minsize = minFrameSize
|
minsize = sys.MinFrameSize
|
||||||
}
|
}
|
||||||
if size > minsize {
|
if size > minsize {
|
||||||
var bv bitvector
|
var bv bitvector
|
||||||
|
@ -607,15 +608,15 @@ func adjustframe(frame *stkframe, arg unsafe.Pointer) bool {
|
||||||
throw("bad symbol table")
|
throw("bad symbol table")
|
||||||
}
|
}
|
||||||
bv = stackmapdata(stackmap, pcdata)
|
bv = stackmapdata(stackmap, pcdata)
|
||||||
size = uintptr(bv.n) * ptrSize
|
size = uintptr(bv.n) * sys.PtrSize
|
||||||
if stackDebug >= 3 {
|
if stackDebug >= 3 {
|
||||||
print(" locals ", pcdata, "/", stackmap.n, " ", size/ptrSize, " words ", bv.bytedata, "\n")
|
print(" locals ", pcdata, "/", stackmap.n, " ", size/sys.PtrSize, " words ", bv.bytedata, "\n")
|
||||||
}
|
}
|
||||||
adjustpointers(unsafe.Pointer(frame.varp-size), &bv, adjinfo, f)
|
adjustpointers(unsafe.Pointer(frame.varp-size), &bv, adjinfo, f)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Adjust saved base pointer if there is one.
|
// Adjust saved base pointer if there is one.
|
||||||
if thechar == '6' && frame.argp-frame.varp == 2*regSize {
|
if sys.TheChar == '6' && frame.argp-frame.varp == 2*sys.RegSize {
|
||||||
if !framepointer_enabled {
|
if !framepointer_enabled {
|
||||||
print("runtime: found space for saved base pointer, but no framepointer experiment\n")
|
print("runtime: found space for saved base pointer, but no framepointer experiment\n")
|
||||||
print("argp=", hex(frame.argp), " varp=", hex(frame.varp), "\n")
|
print("argp=", hex(frame.argp), " varp=", hex(frame.varp), "\n")
|
||||||
|
@ -841,9 +842,9 @@ func newstack() {
|
||||||
throw("missing stack in newstack")
|
throw("missing stack in newstack")
|
||||||
}
|
}
|
||||||
sp := gp.sched.sp
|
sp := gp.sched.sp
|
||||||
if thechar == '6' || thechar == '8' {
|
if sys.TheChar == '6' || sys.TheChar == '8' {
|
||||||
// The call to morestack cost a word.
|
// The call to morestack cost a word.
|
||||||
sp -= ptrSize
|
sp -= sys.PtrSize
|
||||||
}
|
}
|
||||||
if stackDebug >= 1 || sp < gp.stack.lo {
|
if stackDebug >= 1 || sp < gp.stack.lo {
|
||||||
print("runtime: newstack sp=", hex(sp), " stack=[", hex(gp.stack.lo), ", ", hex(gp.stack.hi), "]\n",
|
print("runtime: newstack sp=", hex(sp), " stack=[", hex(gp.stack.lo), ", ", hex(gp.stack.hi), "]\n",
|
||||||
|
@ -978,7 +979,7 @@ func shrinkstack(gp *g) {
|
||||||
if gp.syscallsp != 0 {
|
if gp.syscallsp != 0 {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if goos_windows != 0 && gp.m != nil && gp.m.libcallsp != 0 {
|
if sys.GoosWindows != 0 && gp.m != nil && gp.m.libcallsp != 0 {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -6,12 +6,6 @@ package runtime
|
||||||
|
|
||||||
import "unsafe"
|
import "unsafe"
|
||||||
|
|
||||||
// Declarations for runtime services implemented in C or assembly.
|
|
||||||
|
|
||||||
const ptrSize = 4 << (^uintptr(0) >> 63) // unsafe.Sizeof(uintptr(0)) but an ideal const
|
|
||||||
const regSize = 4 << (^uintreg(0) >> 63) // unsafe.Sizeof(uintreg(0)) but an ideal const
|
|
||||||
const spAlign = 1*(1-goarch_arm64) + 16*goarch_arm64 // SP alignment: 1 normally, 16 for ARM64
|
|
||||||
|
|
||||||
// Should be a built-in for unsafe.Pointer?
|
// Should be a built-in for unsafe.Pointer?
|
||||||
//go:nosplit
|
//go:nosplit
|
||||||
func add(p unsafe.Pointer, x uintptr) unsafe.Pointer {
|
func add(p unsafe.Pointer, x uintptr) unsafe.Pointer {
|
||||||
|
|
|
@ -4,7 +4,10 @@
|
||||||
|
|
||||||
package runtime
|
package runtime
|
||||||
|
|
||||||
import "unsafe"
|
import (
|
||||||
|
"runtime/internal/sys"
|
||||||
|
"unsafe"
|
||||||
|
)
|
||||||
|
|
||||||
// NOTE: Func does not expose the actual unexported fields, because we return *Func
|
// NOTE: Func does not expose the actual unexported fields, because we return *Func
|
||||||
// values to users, and we want to keep them from being able to overwrite the data
|
// values to users, and we want to keep them from being able to overwrite the data
|
||||||
|
@ -105,7 +108,7 @@ func moduledataverify1(datap *moduledata) {
|
||||||
// and a byte giving the pointer width in bytes.
|
// and a byte giving the pointer width in bytes.
|
||||||
pcln := *(**[8]byte)(unsafe.Pointer(&datap.pclntable))
|
pcln := *(**[8]byte)(unsafe.Pointer(&datap.pclntable))
|
||||||
pcln32 := *(**[2]uint32)(unsafe.Pointer(&datap.pclntable))
|
pcln32 := *(**[2]uint32)(unsafe.Pointer(&datap.pclntable))
|
||||||
if pcln32[0] != 0xfffffffb || pcln[4] != 0 || pcln[5] != 0 || pcln[6] != _PCQuantum || pcln[7] != ptrSize {
|
if pcln32[0] != 0xfffffffb || pcln[4] != 0 || pcln[5] != 0 || pcln[6] != sys.PCQuantum || pcln[7] != sys.PtrSize {
|
||||||
println("runtime: function symbol table header:", hex(pcln32[0]), hex(pcln[4]), hex(pcln[5]), hex(pcln[6]), hex(pcln[7]))
|
println("runtime: function symbol table header:", hex(pcln32[0]), hex(pcln[4]), hex(pcln[5]), hex(pcln[6]), hex(pcln[7]))
|
||||||
throw("invalid function symbol table\n")
|
throw("invalid function symbol table\n")
|
||||||
}
|
}
|
||||||
|
@ -358,7 +361,7 @@ func funcline(f *_func, targetpc uintptr) (file string, line int32) {
|
||||||
|
|
||||||
func funcspdelta(f *_func, targetpc uintptr, cache *pcvalueCache) int32 {
|
func funcspdelta(f *_func, targetpc uintptr, cache *pcvalueCache) int32 {
|
||||||
x := pcvalue(f, f.pcsp, targetpc, cache, true)
|
x := pcvalue(f, f.pcsp, targetpc, cache, true)
|
||||||
if x&(ptrSize-1) != 0 {
|
if x&(sys.PtrSize-1) != 0 {
|
||||||
print("invalid spdelta ", funcname(f), " ", hex(f.entry), " ", hex(targetpc), " ", hex(f.pcsp), " ", x, "\n")
|
print("invalid spdelta ", funcname(f), " ", hex(f.entry), " ", hex(targetpc), " ", hex(f.pcsp), " ", x, "\n")
|
||||||
}
|
}
|
||||||
return x
|
return x
|
||||||
|
@ -377,13 +380,13 @@ func funcdata(f *_func, i int32) unsafe.Pointer {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
p := add(unsafe.Pointer(&f.nfuncdata), unsafe.Sizeof(f.nfuncdata)+uintptr(f.npcdata)*4)
|
p := add(unsafe.Pointer(&f.nfuncdata), unsafe.Sizeof(f.nfuncdata)+uintptr(f.npcdata)*4)
|
||||||
if ptrSize == 8 && uintptr(p)&4 != 0 {
|
if sys.PtrSize == 8 && uintptr(p)&4 != 0 {
|
||||||
if uintptr(unsafe.Pointer(f))&4 != 0 {
|
if uintptr(unsafe.Pointer(f))&4 != 0 {
|
||||||
println("runtime: misaligned func", f)
|
println("runtime: misaligned func", f)
|
||||||
}
|
}
|
||||||
p = add(p, 4)
|
p = add(p, 4)
|
||||||
}
|
}
|
||||||
return *(*unsafe.Pointer)(add(p, uintptr(i)*ptrSize))
|
return *(*unsafe.Pointer)(add(p, uintptr(i)*sys.PtrSize))
|
||||||
}
|
}
|
||||||
|
|
||||||
// step advances to the next pc, value pair in the encoded table.
|
// step advances to the next pc, value pair in the encoded table.
|
||||||
|
@ -399,7 +402,7 @@ func step(p []byte, pc *uintptr, val *int32, first bool) (newp []byte, ok bool)
|
||||||
}
|
}
|
||||||
vdelta := int32(uvdelta)
|
vdelta := int32(uvdelta)
|
||||||
p, pcdelta := readvarint(p)
|
p, pcdelta := readvarint(p)
|
||||||
*pc += uintptr(pcdelta * _PCQuantum)
|
*pc += uintptr(pcdelta * sys.PCQuantum)
|
||||||
*val += vdelta
|
*val += vdelta
|
||||||
return p, true
|
return p, true
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,17 +6,20 @@
|
||||||
|
|
||||||
package runtime
|
package runtime
|
||||||
|
|
||||||
import "unsafe"
|
import (
|
||||||
|
"runtime/internal/sys"
|
||||||
|
"unsafe"
|
||||||
|
)
|
||||||
|
|
||||||
// adjust Gobuf as it if executed a call to fn with context ctxt
|
// adjust Gobuf as it if executed a call to fn with context ctxt
|
||||||
// and then did an immediate gosave.
|
// and then did an immediate gosave.
|
||||||
func gostartcall(buf *gobuf, fn, ctxt unsafe.Pointer) {
|
func gostartcall(buf *gobuf, fn, ctxt unsafe.Pointer) {
|
||||||
sp := buf.sp
|
sp := buf.sp
|
||||||
if regSize > ptrSize {
|
if sys.RegSize > sys.PtrSize {
|
||||||
sp -= ptrSize
|
sp -= sys.PtrSize
|
||||||
*(*uintptr)(unsafe.Pointer(sp)) = 0
|
*(*uintptr)(unsafe.Pointer(sp)) = 0
|
||||||
}
|
}
|
||||||
sp -= ptrSize
|
sp -= sys.PtrSize
|
||||||
*(*uintptr)(unsafe.Pointer(sp)) = buf.pc
|
*(*uintptr)(unsafe.Pointer(sp)) = buf.pc
|
||||||
buf.sp = sp
|
buf.sp = sp
|
||||||
buf.pc = uintptr(fn)
|
buf.pc = uintptr(fn)
|
||||||
|
|
|
@ -14,6 +14,7 @@ package runtime
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"runtime/internal/atomic"
|
"runtime/internal/atomic"
|
||||||
|
"runtime/internal/sys"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -69,7 +70,7 @@ const (
|
||||||
// and ppc64le.
|
// and ppc64le.
|
||||||
// Tracing won't work reliably for architectures where cputicks is emulated
|
// Tracing won't work reliably for architectures where cputicks is emulated
|
||||||
// by nanotime, so the value doesn't matter for those architectures.
|
// by nanotime, so the value doesn't matter for those architectures.
|
||||||
traceTickDiv = 16 + 48*(goarch_386|goarch_amd64|goarch_amd64p32)
|
traceTickDiv = 16 + 48*(sys.Goarch386|sys.GoarchAmd64|sys.GoarchAmd64p32)
|
||||||
// Maximum number of PCs in a single stack trace.
|
// Maximum number of PCs in a single stack trace.
|
||||||
// Since events contain only stack id rather than whole stack trace,
|
// Since events contain only stack id rather than whole stack trace,
|
||||||
// we can allow quite large values here.
|
// we can allow quite large values here.
|
||||||
|
@ -704,7 +705,7 @@ Search:
|
||||||
|
|
||||||
// newStack allocates a new stack of size n.
|
// newStack allocates a new stack of size n.
|
||||||
func (tab *traceStackTable) newStack(n int) *traceStack {
|
func (tab *traceStackTable) newStack(n int) *traceStack {
|
||||||
return (*traceStack)(tab.mem.alloc(unsafe.Sizeof(traceStack{}) + uintptr(n)*ptrSize))
|
return (*traceStack)(tab.mem.alloc(unsafe.Sizeof(traceStack{}) + uintptr(n)*sys.PtrSize))
|
||||||
}
|
}
|
||||||
|
|
||||||
// dump writes all previously cached stacks to trace buffers,
|
// dump writes all previously cached stacks to trace buffers,
|
||||||
|
@ -751,12 +752,12 @@ type traceAlloc struct {
|
||||||
// traceAllocBlock is a block in traceAlloc.
|
// traceAllocBlock is a block in traceAlloc.
|
||||||
type traceAllocBlock struct {
|
type traceAllocBlock struct {
|
||||||
next *traceAllocBlock
|
next *traceAllocBlock
|
||||||
data [64<<10 - ptrSize]byte
|
data [64<<10 - sys.PtrSize]byte
|
||||||
}
|
}
|
||||||
|
|
||||||
// alloc allocates n-byte block.
|
// alloc allocates n-byte block.
|
||||||
func (a *traceAlloc) alloc(n uintptr) unsafe.Pointer {
|
func (a *traceAlloc) alloc(n uintptr) unsafe.Pointer {
|
||||||
n = round(n, ptrSize)
|
n = round(n, sys.PtrSize)
|
||||||
if a.head == nil || a.off+n > uintptr(len(a.head.data)) {
|
if a.head == nil || a.off+n > uintptr(len(a.head.data)) {
|
||||||
if n > uintptr(len(a.head.data)) {
|
if n > uintptr(len(a.head.data)) {
|
||||||
throw("trace: alloc too large")
|
throw("trace: alloc too large")
|
||||||
|
|
|
@ -4,7 +4,10 @@
|
||||||
|
|
||||||
package runtime
|
package runtime
|
||||||
|
|
||||||
import "unsafe"
|
import (
|
||||||
|
"runtime/internal/sys"
|
||||||
|
"unsafe"
|
||||||
|
)
|
||||||
|
|
||||||
// The code in this file implements stack trace walking for all architectures.
|
// The code in this file implements stack trace walking for all architectures.
|
||||||
// The most important fact about a given architecture is whether it uses a link register.
|
// The most important fact about a given architecture is whether it uses a link register.
|
||||||
|
@ -29,7 +32,7 @@ import "unsafe"
|
||||||
// usesLR is defined below in terms of minFrameSize, which is defined in
|
// usesLR is defined below in terms of minFrameSize, which is defined in
|
||||||
// arch_$GOARCH.go. ptrSize and regSize are defined in stubs.go.
|
// arch_$GOARCH.go. ptrSize and regSize are defined in stubs.go.
|
||||||
|
|
||||||
const usesLR = minFrameSize > 0
|
const usesLR = sys.MinFrameSize > 0
|
||||||
|
|
||||||
var (
|
var (
|
||||||
// initialized in tracebackinit
|
// initialized in tracebackinit
|
||||||
|
@ -181,8 +184,8 @@ func gentraceback(pc0, sp0, lr0 uintptr, gp *g, skip int, pcbuf *uintptr, max in
|
||||||
frame.pc = *(*uintptr)(unsafe.Pointer(frame.sp))
|
frame.pc = *(*uintptr)(unsafe.Pointer(frame.sp))
|
||||||
frame.lr = 0
|
frame.lr = 0
|
||||||
} else {
|
} else {
|
||||||
frame.pc = uintptr(*(*uintreg)(unsafe.Pointer(frame.sp)))
|
frame.pc = uintptr(*(*sys.Uintreg)(unsafe.Pointer(frame.sp)))
|
||||||
frame.sp += regSize
|
frame.sp += sys.RegSize
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -222,7 +225,7 @@ func gentraceback(pc0, sp0, lr0 uintptr, gp *g, skip int, pcbuf *uintptr, max in
|
||||||
frame.fp = sp + uintptr(funcspdelta(f, frame.pc, &cache))
|
frame.fp = sp + uintptr(funcspdelta(f, frame.pc, &cache))
|
||||||
if !usesLR {
|
if !usesLR {
|
||||||
// On x86, call instruction pushes return PC before entering new function.
|
// On x86, call instruction pushes return PC before entering new function.
|
||||||
frame.fp += regSize
|
frame.fp += sys.RegSize
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
var flr *_func
|
var flr *_func
|
||||||
|
@ -249,8 +252,8 @@ func gentraceback(pc0, sp0, lr0 uintptr, gp *g, skip int, pcbuf *uintptr, max in
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if frame.lr == 0 {
|
if frame.lr == 0 {
|
||||||
lrPtr = frame.fp - regSize
|
lrPtr = frame.fp - sys.RegSize
|
||||||
frame.lr = uintptr(*(*uintreg)(unsafe.Pointer(lrPtr)))
|
frame.lr = uintptr(*(*sys.Uintreg)(unsafe.Pointer(lrPtr)))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if frame.lr == stackBarrierPC {
|
if frame.lr == stackBarrierPC {
|
||||||
|
@ -280,13 +283,13 @@ func gentraceback(pc0, sp0, lr0 uintptr, gp *g, skip int, pcbuf *uintptr, max in
|
||||||
frame.varp = frame.fp
|
frame.varp = frame.fp
|
||||||
if !usesLR {
|
if !usesLR {
|
||||||
// On x86, call instruction pushes return PC before entering new function.
|
// On x86, call instruction pushes return PC before entering new function.
|
||||||
frame.varp -= regSize
|
frame.varp -= sys.RegSize
|
||||||
}
|
}
|
||||||
|
|
||||||
// If framepointer_enabled and there's a frame, then
|
// If framepointer_enabled and there's a frame, then
|
||||||
// there's a saved bp here.
|
// there's a saved bp here.
|
||||||
if framepointer_enabled && GOARCH == "amd64" && frame.varp > frame.sp {
|
if framepointer_enabled && GOARCH == "amd64" && frame.varp > frame.sp {
|
||||||
frame.varp -= regSize
|
frame.varp -= sys.RegSize
|
||||||
}
|
}
|
||||||
|
|
||||||
// Derive size of arguments.
|
// Derive size of arguments.
|
||||||
|
@ -296,7 +299,7 @@ func gentraceback(pc0, sp0, lr0 uintptr, gp *g, skip int, pcbuf *uintptr, max in
|
||||||
// in package runtime and reflect, and for those we use call-specific
|
// in package runtime and reflect, and for those we use call-specific
|
||||||
// metadata recorded by f's caller.
|
// metadata recorded by f's caller.
|
||||||
if callback != nil || printing {
|
if callback != nil || printing {
|
||||||
frame.argp = frame.fp + minFrameSize
|
frame.argp = frame.fp + sys.MinFrameSize
|
||||||
setArgInfo(&frame, f, callback != nil)
|
setArgInfo(&frame, f, callback != nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -349,7 +352,7 @@ func gentraceback(pc0, sp0, lr0 uintptr, gp *g, skip int, pcbuf *uintptr, max in
|
||||||
}
|
}
|
||||||
print(funcname(f), "(")
|
print(funcname(f), "(")
|
||||||
argp := (*[100]uintptr)(unsafe.Pointer(frame.argp))
|
argp := (*[100]uintptr)(unsafe.Pointer(frame.argp))
|
||||||
for i := uintptr(0); i < frame.arglen/ptrSize; i++ {
|
for i := uintptr(0); i < frame.arglen/sys.PtrSize; i++ {
|
||||||
if i >= 10 {
|
if i >= 10 {
|
||||||
print(", ...")
|
print(", ...")
|
||||||
break
|
break
|
||||||
|
@ -394,10 +397,10 @@ func gentraceback(pc0, sp0, lr0 uintptr, gp *g, skip int, pcbuf *uintptr, max in
|
||||||
// before faking a call to sigpanic.
|
// before faking a call to sigpanic.
|
||||||
if usesLR && waspanic {
|
if usesLR && waspanic {
|
||||||
x := *(*uintptr)(unsafe.Pointer(frame.sp))
|
x := *(*uintptr)(unsafe.Pointer(frame.sp))
|
||||||
frame.sp += minFrameSize
|
frame.sp += sys.MinFrameSize
|
||||||
if GOARCH == "arm64" {
|
if GOARCH == "arm64" {
|
||||||
// arm64 needs 16-byte aligned SP, always
|
// arm64 needs 16-byte aligned SP, always
|
||||||
frame.sp += ptrSize
|
frame.sp += sys.PtrSize
|
||||||
}
|
}
|
||||||
f = findfunc(frame.pc)
|
f = findfunc(frame.pc)
|
||||||
frame.fn = f
|
frame.fn = f
|
||||||
|
@ -494,14 +497,14 @@ func setArgInfo(frame *stkframe, f *_func, needArgMap bool) {
|
||||||
// Extract argument bitmaps for reflect stubs from the calls they made to reflect.
|
// Extract argument bitmaps for reflect stubs from the calls they made to reflect.
|
||||||
switch funcname(f) {
|
switch funcname(f) {
|
||||||
case "reflect.makeFuncStub", "reflect.methodValueCall":
|
case "reflect.makeFuncStub", "reflect.methodValueCall":
|
||||||
arg0 := frame.sp + minFrameSize
|
arg0 := frame.sp + sys.MinFrameSize
|
||||||
fn := *(**[2]uintptr)(unsafe.Pointer(arg0))
|
fn := *(**[2]uintptr)(unsafe.Pointer(arg0))
|
||||||
if fn[0] != f.entry {
|
if fn[0] != f.entry {
|
||||||
print("runtime: confused by ", funcname(f), "\n")
|
print("runtime: confused by ", funcname(f), "\n")
|
||||||
throw("reflect mismatch")
|
throw("reflect mismatch")
|
||||||
}
|
}
|
||||||
bv := (*bitvector)(unsafe.Pointer(fn[1]))
|
bv := (*bitvector)(unsafe.Pointer(fn[1]))
|
||||||
frame.arglen = uintptr(bv.n * ptrSize)
|
frame.arglen = uintptr(bv.n * sys.PtrSize)
|
||||||
frame.argmap = bv
|
frame.argmap = bv
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -515,7 +518,7 @@ func printcreatedby(gp *g) {
|
||||||
print("created by ", funcname(f), "\n")
|
print("created by ", funcname(f), "\n")
|
||||||
tracepc := pc // back up to CALL instruction for funcline.
|
tracepc := pc // back up to CALL instruction for funcline.
|
||||||
if pc > f.entry {
|
if pc > f.entry {
|
||||||
tracepc -= _PCQuantum
|
tracepc -= sys.PCQuantum
|
||||||
}
|
}
|
||||||
file, line := funcline(f, tracepc)
|
file, line := funcline(f, tracepc)
|
||||||
print("\t", file, ":", line)
|
print("\t", file, ":", line)
|
||||||
|
|
|
@ -4,7 +4,10 @@
|
||||||
|
|
||||||
package runtime
|
package runtime
|
||||||
|
|
||||||
import "unsafe"
|
import (
|
||||||
|
"runtime/internal/sys"
|
||||||
|
"unsafe"
|
||||||
|
)
|
||||||
|
|
||||||
// Look up symbols in the Linux vDSO.
|
// Look up symbols in the Linux vDSO.
|
||||||
|
|
||||||
|
@ -303,7 +306,7 @@ func sysargs(argc int32, argv **byte) {
|
||||||
n++
|
n++
|
||||||
|
|
||||||
// now argv+n is auxv
|
// now argv+n is auxv
|
||||||
auxv := (*[1 << 32]elf64Auxv)(add(unsafe.Pointer(argv), uintptr(n)*ptrSize))
|
auxv := (*[1 << 32]elf64Auxv)(add(unsafe.Pointer(argv), uintptr(n)*sys.PtrSize))
|
||||||
|
|
||||||
for i := 0; auxv[i].a_type != _AT_NULL; i++ {
|
for i := 0; auxv[i].a_type != _AT_NULL; i++ {
|
||||||
av := &auxv[i]
|
av := &auxv[i]
|
||||||
|
|
|
@ -1,17 +0,0 @@
|
||||||
// generated by gengoos.go using 'go generate'
|
|
||||||
|
|
||||||
package runtime
|
|
||||||
|
|
||||||
const theGoos = `android`
|
|
||||||
|
|
||||||
const goos_android = 1
|
|
||||||
const goos_darwin = 0
|
|
||||||
const goos_dragonfly = 0
|
|
||||||
const goos_freebsd = 0
|
|
||||||
const goos_linux = 0
|
|
||||||
const goos_nacl = 0
|
|
||||||
const goos_netbsd = 0
|
|
||||||
const goos_openbsd = 0
|
|
||||||
const goos_plan9 = 0
|
|
||||||
const goos_solaris = 0
|
|
||||||
const goos_windows = 0
|
|
|
@ -1,17 +0,0 @@
|
||||||
// generated by gengoos.go using 'go generate'
|
|
||||||
|
|
||||||
package runtime
|
|
||||||
|
|
||||||
const theGoos = `darwin`
|
|
||||||
|
|
||||||
const goos_android = 0
|
|
||||||
const goos_darwin = 1
|
|
||||||
const goos_dragonfly = 0
|
|
||||||
const goos_freebsd = 0
|
|
||||||
const goos_linux = 0
|
|
||||||
const goos_nacl = 0
|
|
||||||
const goos_netbsd = 0
|
|
||||||
const goos_openbsd = 0
|
|
||||||
const goos_plan9 = 0
|
|
||||||
const goos_solaris = 0
|
|
||||||
const goos_windows = 0
|
|
|
@ -1,17 +0,0 @@
|
||||||
// generated by gengoos.go using 'go generate'
|
|
||||||
|
|
||||||
package runtime
|
|
||||||
|
|
||||||
const theGoos = `dragonfly`
|
|
||||||
|
|
||||||
const goos_android = 0
|
|
||||||
const goos_darwin = 0
|
|
||||||
const goos_dragonfly = 1
|
|
||||||
const goos_freebsd = 0
|
|
||||||
const goos_linux = 0
|
|
||||||
const goos_nacl = 0
|
|
||||||
const goos_netbsd = 0
|
|
||||||
const goos_openbsd = 0
|
|
||||||
const goos_plan9 = 0
|
|
||||||
const goos_solaris = 0
|
|
||||||
const goos_windows = 0
|
|
|
@ -1,17 +0,0 @@
|
||||||
// generated by gengoos.go using 'go generate'
|
|
||||||
|
|
||||||
package runtime
|
|
||||||
|
|
||||||
const theGoos = `freebsd`
|
|
||||||
|
|
||||||
const goos_android = 0
|
|
||||||
const goos_darwin = 0
|
|
||||||
const goos_dragonfly = 0
|
|
||||||
const goos_freebsd = 1
|
|
||||||
const goos_linux = 0
|
|
||||||
const goos_nacl = 0
|
|
||||||
const goos_netbsd = 0
|
|
||||||
const goos_openbsd = 0
|
|
||||||
const goos_plan9 = 0
|
|
||||||
const goos_solaris = 0
|
|
||||||
const goos_windows = 0
|
|
|
@ -1,19 +0,0 @@
|
||||||
// generated by gengoos.go using 'go generate'
|
|
||||||
|
|
||||||
// +build !android
|
|
||||||
|
|
||||||
package runtime
|
|
||||||
|
|
||||||
const theGoos = `linux`
|
|
||||||
|
|
||||||
const goos_android = 0
|
|
||||||
const goos_darwin = 0
|
|
||||||
const goos_dragonfly = 0
|
|
||||||
const goos_freebsd = 0
|
|
||||||
const goos_linux = 1
|
|
||||||
const goos_nacl = 0
|
|
||||||
const goos_netbsd = 0
|
|
||||||
const goos_openbsd = 0
|
|
||||||
const goos_plan9 = 0
|
|
||||||
const goos_solaris = 0
|
|
||||||
const goos_windows = 0
|
|
|
@ -1,17 +0,0 @@
|
||||||
// generated by gengoos.go using 'go generate'
|
|
||||||
|
|
||||||
package runtime
|
|
||||||
|
|
||||||
const theGoos = `nacl`
|
|
||||||
|
|
||||||
const goos_android = 0
|
|
||||||
const goos_darwin = 0
|
|
||||||
const goos_dragonfly = 0
|
|
||||||
const goos_freebsd = 0
|
|
||||||
const goos_linux = 0
|
|
||||||
const goos_nacl = 1
|
|
||||||
const goos_netbsd = 0
|
|
||||||
const goos_openbsd = 0
|
|
||||||
const goos_plan9 = 0
|
|
||||||
const goos_solaris = 0
|
|
||||||
const goos_windows = 0
|
|
|
@ -1,17 +0,0 @@
|
||||||
// generated by gengoos.go using 'go generate'
|
|
||||||
|
|
||||||
package runtime
|
|
||||||
|
|
||||||
const theGoos = `netbsd`
|
|
||||||
|
|
||||||
const goos_android = 0
|
|
||||||
const goos_darwin = 0
|
|
||||||
const goos_dragonfly = 0
|
|
||||||
const goos_freebsd = 0
|
|
||||||
const goos_linux = 0
|
|
||||||
const goos_nacl = 0
|
|
||||||
const goos_netbsd = 1
|
|
||||||
const goos_openbsd = 0
|
|
||||||
const goos_plan9 = 0
|
|
||||||
const goos_solaris = 0
|
|
||||||
const goos_windows = 0
|
|
|
@ -1,17 +0,0 @@
|
||||||
// generated by gengoos.go using 'go generate'
|
|
||||||
|
|
||||||
package runtime
|
|
||||||
|
|
||||||
const theGoos = `openbsd`
|
|
||||||
|
|
||||||
const goos_android = 0
|
|
||||||
const goos_darwin = 0
|
|
||||||
const goos_dragonfly = 0
|
|
||||||
const goos_freebsd = 0
|
|
||||||
const goos_linux = 0
|
|
||||||
const goos_nacl = 0
|
|
||||||
const goos_netbsd = 0
|
|
||||||
const goos_openbsd = 1
|
|
||||||
const goos_plan9 = 0
|
|
||||||
const goos_solaris = 0
|
|
||||||
const goos_windows = 0
|
|
|
@ -1,17 +0,0 @@
|
||||||
// generated by gengoos.go using 'go generate'
|
|
||||||
|
|
||||||
package runtime
|
|
||||||
|
|
||||||
const theGoos = `plan9`
|
|
||||||
|
|
||||||
const goos_android = 0
|
|
||||||
const goos_darwin = 0
|
|
||||||
const goos_dragonfly = 0
|
|
||||||
const goos_freebsd = 0
|
|
||||||
const goos_linux = 0
|
|
||||||
const goos_nacl = 0
|
|
||||||
const goos_netbsd = 0
|
|
||||||
const goos_openbsd = 0
|
|
||||||
const goos_plan9 = 1
|
|
||||||
const goos_solaris = 0
|
|
||||||
const goos_windows = 0
|
|
|
@ -1,17 +0,0 @@
|
||||||
// generated by gengoos.go using 'go generate'
|
|
||||||
|
|
||||||
package runtime
|
|
||||||
|
|
||||||
const theGoos = `solaris`
|
|
||||||
|
|
||||||
const goos_android = 0
|
|
||||||
const goos_darwin = 0
|
|
||||||
const goos_dragonfly = 0
|
|
||||||
const goos_freebsd = 0
|
|
||||||
const goos_linux = 0
|
|
||||||
const goos_nacl = 0
|
|
||||||
const goos_netbsd = 0
|
|
||||||
const goos_openbsd = 0
|
|
||||||
const goos_plan9 = 0
|
|
||||||
const goos_solaris = 1
|
|
||||||
const goos_windows = 0
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue