From 87736fc450c943ca3792406d7a47790091404255 Mon Sep 17 00:00:00 2001 From: Alessandro Arzilli Date: Mon, 19 Feb 2018 17:11:22 +0100 Subject: [PATCH] cmd/compile: fix dwarf ranges of inlined subroutine entries DWARF ranges are half-open. Fixes #23928 Change-Id: I71b3384d1bc2c65bd37ca8a02a0b7ff48fec3688 Reviewed-on: https://go-review.googlesource.com/94816 Reviewed-by: Than McIntosh Run-TryBot: Than McIntosh TryBot-Result: Gobot Gobot --- src/cmd/compile/internal/gc/dwinl.go | 6 +-- src/cmd/compile/internal/gc/scope_test.go | 57 +++++++++++++++++++++-- 2 files changed, 57 insertions(+), 6 deletions(-) diff --git a/src/cmd/compile/internal/gc/dwinl.go b/src/cmd/compile/internal/gc/dwinl.go index 9cb8eef759..43ae0bce7f 100644 --- a/src/cmd/compile/internal/gc/dwinl.go +++ b/src/cmd/compile/internal/gc/dwinl.go @@ -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 diff --git a/src/cmd/compile/internal/gc/scope_test.go b/src/cmd/compile/internal/gc/scope_test.go index 5d44b7a4f4..cc384e54c7 100644 --- a/src/cmd/compile/internal/gc/scope_test.go +++ b/src/cmd/compile/internal/gc/scope_test.go @@ -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) + } + } + } +} -- 2.48.1