]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: fix dwarf ranges of inlined subroutine entries
authorAlessandro Arzilli <alessandro.arzilli@gmail.com>
Mon, 19 Feb 2018 16:11:22 +0000 (17:11 +0100)
committerThan McIntosh <thanm@google.com>
Thu, 1 Mar 2018 21:13:40 +0000 (21:13 +0000)
DWARF ranges are half-open.

Fixes #23928

Change-Id: I71b3384d1bc2c65bd37ca8a02a0b7ff48fec3688
Reviewed-on: https://go-review.googlesource.com/94816
Reviewed-by: Than McIntosh <thanm@google.com>
Run-TryBot: Than McIntosh <thanm@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>

src/cmd/compile/internal/gc/dwinl.go
src/cmd/compile/internal/gc/scope_test.go

index 9cb8eef759d6d72af5dd2b87bd0b7eaf693efb09..43ae0bce7fb03f0926b9decf3e6703a733179ef7 100644 (file)
@@ -161,15 +161,15 @@ func assembleInlines(fnsym *obj.LSym, fn *Node, dwVars []*dwarf.Var) dwarf.InlCa
                        continue
                } else {
                        // Close out the current range
-                       endRange(crange, prevp)
+                       endRange(crange, p)
 
                        // Begin new range
                        crange = beginRange(inlcalls.Calls, p, ii, imap)
                        curii = ii
                }
        }
-       if prevp != nil {
-               endRange(crange, prevp)
+       if crange != nil {
+               crange.End = fnsym.Size
        }
 
        // Debugging
index 5d44b7a4f4f1d861b623bc58f645c900deaf6382..cc384e54c7b4ece56c0c8de5c03bbe4c5b5d8737 100644 (file)
@@ -218,7 +218,7 @@ func TestScopeRanges(t *testing.T) {
        }
        defer os.RemoveAll(dir)
 
-       src, f := gobuild(t, dir, testfile)
+       src, f := gobuild(t, dir, false, testfile)
        defer f.Close()
 
        // the compiler uses forward slashes for paths even on windows
@@ -409,7 +409,7 @@ func (scope *lexblock) markLines(pcln objfile.Liner, lines map[line][]*lexblock)
        }
 }
 
-func gobuild(t *testing.T, dir string, testfile []testline) (string, *objfile.File) {
+func gobuild(t *testing.T, dir string, optimized bool, testfile []testline) (string, *objfile.File) {
        src := filepath.Join(dir, "test.go")
        dst := filepath.Join(dir, "out.o")
 
@@ -423,7 +423,13 @@ func gobuild(t *testing.T, dir string, testfile []testline) (string, *objfile.Fi
        }
        f.Close()
 
-       cmd := exec.Command(testenv.GoToolPath(t), "build", "-gcflags=-N -l", "-o", dst, src)
+       args := []string{"build"}
+       if !optimized {
+               args = append(args, "-gcflags=-N -l")
+       }
+       args = append(args, "-o", dst, src)
+
+       cmd := exec.Command(testenv.GoToolPath(t), args...)
        if b, err := cmd.CombinedOutput(); err != nil {
                t.Logf("build: %s\n", string(b))
                t.Fatal(err)
@@ -435,3 +441,48 @@ func gobuild(t *testing.T, dir string, testfile []testline) (string, *objfile.Fi
        }
        return src, pkg
 }
+
+// TestEmptyDwarfRanges tests that no list entry in debug_ranges has start == end.
+// See issue #23928.
+func TestEmptyDwarfRanges(t *testing.T) {
+       testenv.MustHaveGoRun(t)
+
+       dir, err := ioutil.TempDir("", "TestEmptyDwarfRanges")
+       if err != nil {
+               t.Fatalf("could not create directory: %v", err)
+       }
+       defer os.RemoveAll(dir)
+
+       _, f := gobuild(t, dir, true, []testline{{line: "package main"}, {line: "func main(){ println(\"hello\") }"}})
+       defer f.Close()
+
+       dwarfData, err := f.DWARF()
+       if err != nil {
+               t.Fatal(err)
+       }
+       dwarfReader := dwarfData.Reader()
+
+       for {
+               entry, err := dwarfReader.Next()
+               if err != nil {
+                       t.Fatal(err)
+               }
+               if entry == nil {
+                       break
+               }
+
+               ranges, err := dwarfData.Ranges(entry)
+               if err != nil {
+                       t.Fatal(err)
+               }
+               if ranges == nil {
+                       continue
+               }
+
+               for _, rng := range ranges {
+                       if rng[0] == rng[1] {
+                               t.Errorf("range entry with start == end: %v", rng)
+                       }
+               }
+       }
+}