From 03ac8302a60099632ea1f95af14db5dfd83f2970 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Tue, 5 Mar 2019 23:05:38 +0000 Subject: [PATCH] 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 --- gcc/go/gofrontend/MERGE | 2 +- libgo/go/runtime/mgcmark.go | 4 ++-- libgo/go/runtime/mgcsweep.go | 6 ++++-- libgo/go/runtime/runtime1.go | 4 +++- 4 files changed, 10 insertions(+), 6 deletions(-) diff --git a/gcc/go/gofrontend/MERGE b/gcc/go/gofrontend/MERGE index 3315957aea5..78dd824fc74 100644 --- a/gcc/go/gofrontend/MERGE +++ b/gcc/go/gofrontend/MERGE @@ -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. diff --git a/libgo/go/runtime/mgcmark.go b/libgo/go/runtime/mgcmark.go index 9da881ed2ab..dc5e797739e 100644 --- a/libgo/go/runtime/mgcmark.go +++ b/libgo/go/runtime/mgcmark.go @@ -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) } } diff --git a/libgo/go/runtime/mgcsweep.go b/libgo/go/runtime/mgcsweep.go index fb5ee6ad46d..bc53de44e66 100644 --- a/libgo/go/runtime/mgcsweep.go +++ b/libgo/go/runtime/mgcsweep.go @@ -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) diff --git a/libgo/go/runtime/runtime1.go b/libgo/go/runtime/runtime1.go index 66091ff6580..e2567b35a3f 100644 --- a/libgo/go/runtime/runtime1.go +++ b/libgo/go/runtime/runtime1.go @@ -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 := "" -- 2.30.2