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:
Ian Lance Taylor 2019-03-05 23:05:38 +00:00
parent 934e992600
commit 03ac8302a6
4 changed files with 10 additions and 6 deletions

View File

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

View File

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

View File

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

View File

@ -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 := ""