runtime: enable precise GC checks when using stack maps
authorIan Lance Taylor <ian@gcc.gnu.org>
Tue, 5 Mar 2019 23:05:38 +0000 (23:05 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Tue, 5 Mar 2019 23:05:38 +0000 (23:05 +0000)
    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
libgo/go/runtime/mgcmark.go
libgo/go/runtime/mgcsweep.go
libgo/go/runtime/runtime1.go

index 3315957..78dd824 100644 (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.
index 9da881e..dc5e797 100644 (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)
        }
 }
 
index fb5ee6a..bc53de4 100644 (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)
index 66091ff..e2567b3 100644 (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 := ""