internal/trace: don't assume GC will start and end on same P

Currently, GC disables preemption between the traceGCStart and
traceGCDone, so it never moves Ps. Consequently, the trace verifier
attaches information about GC to its per-P state and will fail if GC
starts on one P and ends on another.

GC will soon be preemptible and may end on a different P than it
began. Hence, this change lifts this per-P verifier state to global
state.

Change-Id: I82256e2baab1ff3c4453fec312079018423b4b51
Reviewed-on: https://go-review.googlesource.com/8714
Reviewed-by: Dmitry Vyukov <dvyukov@google.com>
Reviewed-by: Rick Hudson <rlh@golang.org>
diff --git a/src/internal/trace/parser.go b/src/internal/trace/parser.go
index 1b4538f..8d48bfd 100644
--- a/src/internal/trace/parser.go
+++ b/src/internal/trace/parser.go
@@ -350,7 +350,6 @@
 	type pdesc struct {
 		running bool
 		g       uint64
-		evGC    *Event
 		evScan  *Event
 		evSweep *Event
 	}
@@ -358,6 +357,7 @@
 	gs := make(map[uint64]gdesc)
 	ps := make(map[int]pdesc)
 	gs[0] = gdesc{state: gRunning}
+	var evGC *Event
 
 	checkRunning := func(p pdesc, g gdesc, ev *Event) error {
 		name := EventDescriptions[ev.Type].Name
@@ -389,16 +389,16 @@
 			}
 			p.running = false
 		case EvGCStart:
-			if p.evGC != nil {
+			if evGC != nil {
 				return fmt.Errorf("previous GC is not ended before a new one (offset %v, time %v)", ev.Off, ev.Ts)
 			}
-			p.evGC = ev
+			evGC = ev
 		case EvGCDone:
-			if p.evGC == nil {
+			if evGC == nil {
 				return fmt.Errorf("bogus GC end (offset %v, time %v)", ev.Off, ev.Ts)
 			}
-			p.evGC.Link = ev
-			p.evGC = nil
+			evGC.Link = ev
+			evGC = nil
 		case EvGCScanStart:
 			if p.evScan != nil {
 				return fmt.Errorf("previous scanning is not ended before a new one (offset %v, time %v)", ev.Off, ev.Ts)