]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: Avoid and filter out zero-length location-lists.
authorDavid Chase <drchase@google.com>
Thu, 15 Nov 2018 19:11:19 +0000 (14:11 -0500)
committerDavid Chase <drchase@google.com>
Wed, 12 Dec 2018 12:36:08 +0000 (12:36 +0000)
This change avoids creating zero length location lists by
repairing an overly aggressive change in CL146718
and by explicitly checking for and filtering out any
zero-length lists that are detected (building
compiler+runtime creates a single one).

Updates #28486.

Change-Id: I01c571fee2376474c7f3038e801bd58fd9e0b820
Reviewed-on: https://go-review.googlesource.com/c/150097
Run-TryBot: David Chase <drchase@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Heschi Kreinick <heschi@google.com>
src/cmd/compile/internal/ssa/debug.go

index 7407a75c41c334c6610519b322dd650fb4c53c06..c2736d837c931f5ee8acc8502aa348e644e6c045 100644 (file)
@@ -881,12 +881,11 @@ func (state *debugState) buildLocationLists(blockLocs []*BlockDebug) {
        for _, b := range state.f.Blocks {
                state.mergePredecessors(b, blockLocs, prevBlock)
 
-               // Handle any differences among predecessor blocks and previous block (perhaps not a predecessor)
-               for _, varID := range state.changedVars.contents() {
-                       state.updateVar(VarID(varID), b, BlockStart)
-               }
-
                if !blockLocs[b.ID].relevant {
+                       // Handle any differences among predecessor blocks and previous block (perhaps not a predecessor)
+                       for _, varID := range state.changedVars.contents() {
+                               state.updateVar(VarID(varID), b, BlockStart)
+                       }
                        continue
                }
 
@@ -1019,6 +1018,14 @@ func (state *debugState) writePendingEntry(varID VarID, endBlock, endValue ID) {
                // they get incomplete debug info on 32-bit platforms.
                return
        }
+       if start == end {
+               if state.loggingEnabled {
+                       // Printf not logf so not gated by GOSSAFUNC; this should fire very rarely.
+                       fmt.Printf("Skipping empty location list for %v in %s\n", state.vars[varID], state.f.Name)
+               }
+               return
+       }
+
        list := state.lists[varID]
        list = appendPtr(state.ctxt, list, start)
        list = appendPtr(state.ctxt, list, end)