runtime: enable precise GC checks when using stack maps
In the runtime there are bad pointer checks that currently don't work with the concervative collector. With stack maps, the GC is precise and the checks should work. Enable them. Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/153871 From-SVN: r269406
This commit is contained in:
parent
934e992600
commit
03ac8302a6
4 changed files with 10 additions and 6 deletions
|
@ -1,4 +1,4 @@
|
|||
14e48e756af205a68374c872f3bd03d62ccd70bb
|
||||
3f8ddaa1d773309b6a4b8e4640f8b9675d9764c6
|
||||
|
||||
The first line of this file holds the git revision number of the last
|
||||
merge done from the gofrontend repository.
|
||||
|
|
|
@ -1106,9 +1106,9 @@ func scanstackblockwithmap(pc, b0, n0 uintptr, ptrmask *uint8, gcw *gcWork) {
|
|||
// Preemption must be disabled.
|
||||
//go:nowritebarrier
|
||||
func shade(b uintptr) {
|
||||
if obj, span, objIndex := findObject(b, 0, 0, true); obj != 0 {
|
||||
if obj, span, objIndex := findObject(b, 0, 0, !usestackmaps); obj != 0 {
|
||||
gcw := &getg().m.p.ptr().gcw
|
||||
greyobject(obj, 0, 0, span, gcw, objIndex, true)
|
||||
greyobject(obj, 0, 0, span, gcw, objIndex, !usestackmaps)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -342,8 +342,10 @@ func (s *mspan) sweep(preserve bool) bool {
|
|||
// it is not otherwise a problem. So we disable the test for gccgo.
|
||||
nfreedSigned := int(nfreed)
|
||||
if nalloc > s.allocCount {
|
||||
// print("runtime: nelems=", s.nelems, " nalloc=", nalloc, " previous allocCount=", s.allocCount, " nfreed=", nfreed, "\n")
|
||||
// throw("sweep increased allocation count")
|
||||
if usestackmaps {
|
||||
print("runtime: nelems=", s.nelems, " nalloc=", nalloc, " previous allocCount=", s.allocCount, " nfreed=", nfreed, "\n")
|
||||
throw("sweep increased allocation count")
|
||||
}
|
||||
|
||||
// For gccgo, adjust the freed count as a signed number.
|
||||
nfreedSigned = int(s.allocCount) - int(nalloc)
|
||||
|
|
|
@ -362,7 +362,9 @@ func parsedebugvars() {
|
|||
// At that point, if debug.invalidptr is set, we crash.
|
||||
// This is not a problem, assuming that M1 really is dead and
|
||||
// the pointer we discovered to it will not be used.
|
||||
// debug.invalidptr = 1
|
||||
if usestackmaps {
|
||||
debug.invalidptr = 1
|
||||
}
|
||||
|
||||
for p := gogetenv("GODEBUG"); p != ""; {
|
||||
field := ""
|
||||
|
|
Loading…
Add table
Reference in a new issue