Commit 87736fc4 authored by Alessandro Arzilli's avatar Alessandro Arzilli Committed by Than McIntosh

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/94816Reviewed-by: default avatarThan McIntosh <thanm@google.com>
Run-TryBot: Than McIntosh <thanm@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
parent 2baed385
......@@ -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
......
......@@ -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)
}
}
}
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment