diff options
author | David Chase <drchase@google.com> | 2017-11-30 15:11:34 -0500 |
---|---|---|
committer | Keith Randall <khr@golang.org> | 2017-12-01 07:09:54 +0000 |
commit | f22cf7131a322f958d07c087e8d6a95723262180 (patch) | |
tree | 8857bf91b1ec840167926b07836c33a3eca857fa /src/cmd/compile/internal/ssa/testdata | |
parent | d4f48e3ff92d1d9ea05f5d8b91e37a29eba0ac89 (diff) | |
download | go-f22cf7131a322f958d07c087e8d6a95723262180.tar.gz go-f22cf7131a322f958d07c087e8d6a95723262180.zip |
cmd/compile: use src.NoXPos for entry-block constants
The ssa backend is aggressive about placing constants and
certain other values in the Entry block. It's implausible
that the original line numbers for these constants makes
any sort of sense when it appears to a user stepping in a
debugger, and they're also not that useful in dumps since
entry-block instructions tend to be constants (i.e.,
unlikely to be the cause of a crash).
Therefore, use src.NoXPos for any values that are explicitly
inserted into a function's entry block.
Passes all tests, including ssa/debug_test.go with both
gdb and a fairly recent dlv. Hand-verified that it solves
the reported problem; constructed a test that reproduced
a problem, and fixed it.
Modified test harness to allow injection of slightly more
interesting inputs.
Fixes #22558.
Change-Id: I4476927067846bc4366da7793d2375c111694c55
Reviewed-on: https://go-review.googlesource.com/81215
Run-TryBot: David Chase <drchase@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Keith Randall <khr@golang.org>
Diffstat (limited to 'src/cmd/compile/internal/ssa/testdata')
10 files changed, 94 insertions, 19 deletions
diff --git a/src/cmd/compile/internal/ssa/testdata/hist.dbg-dlv.nexts b/src/cmd/compile/internal/ssa/testdata/hist.dbg-dlv.nexts index f4fe2af161..ec79b77de2 100644 --- a/src/cmd/compile/internal/ssa/testdata/hist.dbg-dlv.nexts +++ b/src/cmd/compile/internal/ssa/testdata/hist.dbg-dlv.nexts @@ -1,12 +1,12 @@ ./testdata/hist.go -55: func main() { +55: func test() { 57: l := line{point{1 + zero, 2 + zero}, point{3 + zero, 4 + zero}} 58: tinycall() // this forces l etc to stack 59: dx := l.end.x - l.begin.x //gdb-dbg=(l.begin.x,l.end.y)//gdb-opt=(l,dx/O,dy/O) 60: dy := l.end.y - l.begin.y //gdb-opt=(dx,dy/O) 61: sink = dx + dy //gdb-opt=(dx,dy) -63: hist := make([]int, 7) //gdb-opt=(sink,dx/O,dy/O) -64: var reader io.Reader = strings.NewReader(cannedInput) //gdb-dbg=(hist/A,cannedInput/A) +63: hist := make([]int, 7) //gdb-opt=(dx/O,dy/O) // TODO sink is missing if this code is in 'test' instead of 'main' +64: var reader io.Reader = strings.NewReader(cannedInput) //gdb-dbg=(hist/A) // TODO cannedInput/A is missing if this code is in 'test' instead of 'main' 65: if len(os.Args) > 1 { 73: scanner := bufio.NewScanner(reader) 74: for scanner.Scan() { //gdb-opt=(scanner/A) @@ -96,3 +96,4 @@ 87: if a == 0 { //gdb-opt=(a,n,t) 88: continue 86: for i, a := range hist { +98: } diff --git a/src/cmd/compile/internal/ssa/testdata/hist.dbg-gdb.nexts b/src/cmd/compile/internal/ssa/testdata/hist.dbg-gdb.nexts index abd4535ca5..fe000147bd 100644 --- a/src/cmd/compile/internal/ssa/testdata/hist.dbg-gdb.nexts +++ b/src/cmd/compile/internal/ssa/testdata/hist.dbg-gdb.nexts @@ -1,5 +1,5 @@ src/cmd/compile/internal/ssa/testdata/hist.go -55: func main() { +55: func test() { 57: l := line{point{1 + zero, 2 + zero}, point{3 + zero, 4 + zero}} 58: tinycall() // this forces l etc to stack 59: dx := l.end.x - l.begin.x //gdb-dbg=(l.begin.x,l.end.y)//gdb-opt=(l,dx/O,dy/O) @@ -7,10 +7,9 @@ l.begin.x = 1 l.end.y = 4 60: dy := l.end.y - l.begin.y //gdb-opt=(dx,dy/O) 61: sink = dx + dy //gdb-opt=(dx,dy) -63: hist := make([]int, 7) //gdb-opt=(sink,dx/O,dy/O) -64: var reader io.Reader = strings.NewReader(cannedInput) //gdb-dbg=(hist/A,cannedInput/A) +63: hist := make([]int, 7) //gdb-opt=(dx/O,dy/O) // TODO sink is missing if this code is in 'test' instead of 'main' +64: var reader io.Reader = strings.NewReader(cannedInput) //gdb-dbg=(hist/A) // TODO cannedInput/A is missing if this code is in 'test' instead of 'main' hist = []int = {0, 0, 0, 0, 0, 0, 0} -cannedInput = "1\n1\n1\n2\n2\n2\n4\n4\n5\n" 65: if len(os.Args) > 1 { 73: scanner := bufio.NewScanner(reader) 74: for scanner.Scan() { //gdb-opt=(scanner/A) @@ -121,3 +120,4 @@ t = 22 87: if a == 0 { //gdb-opt=(a,n,t) 88: continue 86: for i, a := range hist { +98: } diff --git a/src/cmd/compile/internal/ssa/testdata/hist.go b/src/cmd/compile/internal/ssa/testdata/hist.go index 7d1d06b47d..8a0cc27280 100644 --- a/src/cmd/compile/internal/ssa/testdata/hist.go +++ b/src/cmd/compile/internal/ssa/testdata/hist.go @@ -52,7 +52,7 @@ var cannedInput string = `1 5 ` -func main() { +func test() { // For #19868 l := line{point{1 + zero, 2 + zero}, point{3 + zero, 4 + zero}} tinycall() // this forces l etc to stack @@ -60,8 +60,8 @@ func main() { dy := l.end.y - l.begin.y //gdb-opt=(dx,dy/O) sink = dx + dy //gdb-opt=(dx,dy) // For #21098 - hist := make([]int, 7) //gdb-opt=(sink,dx/O,dy/O) - var reader io.Reader = strings.NewReader(cannedInput) //gdb-dbg=(hist/A,cannedInput/A) + hist := make([]int, 7) //gdb-opt=(dx/O,dy/O) // TODO sink is missing if this code is in 'test' instead of 'main' + var reader io.Reader = strings.NewReader(cannedInput) //gdb-dbg=(hist/A) // TODO cannedInput/A is missing if this code is in 'test' instead of 'main' if len(os.Args) > 1 { var err error reader, err = os.Open(os.Args[1]) @@ -91,5 +91,8 @@ func main() { n += a fmt.Fprintf(os.Stderr, "%d\t%d\t%d\t%d\t%d\n", i, a, n, i*a, t) //gdb-dbg=(n,i,t) } +} +func main() { + test() } diff --git a/src/cmd/compile/internal/ssa/testdata/hist.opt-dlv.nexts b/src/cmd/compile/internal/ssa/testdata/hist.opt-dlv.nexts index 7aab219552..b98e3c6e65 100644 --- a/src/cmd/compile/internal/ssa/testdata/hist.opt-dlv.nexts +++ b/src/cmd/compile/internal/ssa/testdata/hist.opt-dlv.nexts @@ -1,13 +1,13 @@ ./testdata/hist.go -55: func main() { +55: func test() { 57: l := line{point{1 + zero, 2 + zero}, point{3 + zero, 4 + zero}} 58: tinycall() // this forces l etc to stack 57: l := line{point{1 + zero, 2 + zero}, point{3 + zero, 4 + zero}} 59: dx := l.end.x - l.begin.x //gdb-dbg=(l.begin.x,l.end.y)//gdb-opt=(l,dx/O,dy/O) 60: dy := l.end.y - l.begin.y //gdb-opt=(dx,dy/O) 61: sink = dx + dy //gdb-opt=(dx,dy) -63: hist := make([]int, 7) //gdb-opt=(sink,dx/O,dy/O) -64: var reader io.Reader = strings.NewReader(cannedInput) //gdb-dbg=(hist/A,cannedInput/A) +63: hist := make([]int, 7) //gdb-opt=(dx/O,dy/O) // TODO sink is missing if this code is in 'test' instead of 'main' +64: var reader io.Reader = strings.NewReader(cannedInput) //gdb-dbg=(hist/A) // TODO cannedInput/A is missing if this code is in 'test' instead of 'main' 65: if len(os.Args) > 1 { 74: for scanner.Scan() { //gdb-opt=(scanner/A) 76: i, err := strconv.ParseInt(s, 10, 64) @@ -102,3 +102,4 @@ 92: fmt.Fprintf(os.Stderr, "%d\t%d\t%d\t%d\t%d\n", i, a, n, i*a, t) //gdb-dbg=(n,i,t) 87: if a == 0 { //gdb-opt=(a,n,t) 88: continue +98: } diff --git a/src/cmd/compile/internal/ssa/testdata/hist.opt-gdb.nexts b/src/cmd/compile/internal/ssa/testdata/hist.opt-gdb.nexts index f6c6a3c9be..e4dc280869 100644 --- a/src/cmd/compile/internal/ssa/testdata/hist.opt-gdb.nexts +++ b/src/cmd/compile/internal/ssa/testdata/hist.opt-gdb.nexts @@ -1,5 +1,5 @@ src/cmd/compile/internal/ssa/testdata/hist.go -55: func main() { +55: func test() { 57: l := line{point{1 + zero, 2 + zero}, point{3 + zero, 4 + zero}} 58: tinycall() // this forces l etc to stack 57: l := line{point{1 + zero, 2 + zero}, point{3 + zero, 4 + zero}} @@ -13,11 +13,10 @@ dy = <Optimized out, as expected> 61: sink = dx + dy //gdb-opt=(dx,dy) dx = 2 dy = 2 -63: hist := make([]int, 7) //gdb-opt=(sink,dx/O,dy/O) -sink = 4 +63: hist := make([]int, 7) //gdb-opt=(dx/O,dy/O) // TODO sink is missing if this code is in 'test' instead of 'main' dx = <Optimized out, as expected> dy = <Optimized out, as expected> -64: var reader io.Reader = strings.NewReader(cannedInput) //gdb-dbg=(hist/A,cannedInput/A) +64: var reader io.Reader = strings.NewReader(cannedInput) //gdb-dbg=(hist/A) // TODO cannedInput/A is missing if this code is in 'test' instead of 'main' 65: if len(os.Args) > 1 { 73: scanner := bufio.NewScanner(reader) 74: for scanner.Scan() { //gdb-opt=(scanner/A) @@ -180,3 +179,4 @@ a = 0 n = 9 t = 22 88: continue +98: } diff --git a/src/cmd/compile/internal/ssa/testdata/i22558.dbg-22558-dlv.nexts b/src/cmd/compile/internal/ssa/testdata/i22558.dbg-22558-dlv.nexts new file mode 100644 index 0000000000..3c33fe0bfd --- /dev/null +++ b/src/cmd/compile/internal/ssa/testdata/i22558.dbg-22558-dlv.nexts @@ -0,0 +1,11 @@ + ./testdata/i22558.go +19: func test(t *thing, u *thing) { +20: if t.next != nil { +23: fmt.Fprintf(os.Stderr, "%s\n", t.name) +24: u.self = u +25: t.self = t +26: t.next = u +27: for _, p := range t.stuff { +28: if isFoo(t, p) { +29: return +43: } diff --git a/src/cmd/compile/internal/ssa/testdata/i22558.dbg-22558-gdb.nexts b/src/cmd/compile/internal/ssa/testdata/i22558.dbg-22558-gdb.nexts new file mode 100644 index 0000000000..b88a227ec6 --- /dev/null +++ b/src/cmd/compile/internal/ssa/testdata/i22558.dbg-22558-gdb.nexts @@ -0,0 +1,11 @@ + src/cmd/compile/internal/ssa/testdata/i22558.go +19: func test(t *thing, u *thing) { +20: if t.next != nil { +23: fmt.Fprintf(os.Stderr, "%s\n", t.name) +24: u.self = u +25: t.self = t +26: t.next = u +27: for _, p := range t.stuff { +28: if isFoo(t, p) { +29: return +43: } diff --git a/src/cmd/compile/internal/ssa/testdata/i22558.go b/src/cmd/compile/internal/ssa/testdata/i22558.go new file mode 100644 index 0000000000..a62e11e5eb --- /dev/null +++ b/src/cmd/compile/internal/ssa/testdata/i22558.go @@ -0,0 +1,43 @@ +package main + +import ( + "fmt" + "os" +) + +type big struct { + pile [768]int8 +} + +type thing struct { + name string + next *thing + self *thing + stuff []big +} + +func test(t *thing, u *thing) { + if t.next != nil { + return + } + fmt.Fprintf(os.Stderr, "%s\n", t.name) + u.self = u + t.self = t + t.next = u + for _, p := range t.stuff { + if isFoo(t, p) { + return + } + } +} + +//go:noinline +func isFoo(t *thing, b big) bool { + return true +} + +func main() { + t := &thing{name: "t", self: nil, next: nil, stuff: make([]big, 1)} + u := thing{name: "u", self: t, next: t, stuff: make([]big, 1)} + test(t, &u) +} diff --git a/src/cmd/compile/internal/ssa/testdata/i22600.dbg-race-gdb.nexts b/src/cmd/compile/internal/ssa/testdata/i22600.dbg-race-gdb.nexts index 681167d3af..bfffec4a5d 100644 --- a/src/cmd/compile/internal/ssa/testdata/i22600.dbg-race-gdb.nexts +++ b/src/cmd/compile/internal/ssa/testdata/i22600.dbg-race-gdb.nexts @@ -1,6 +1,7 @@ src/cmd/compile/internal/ssa/testdata/i22600.go -8: func main() { +8: func test() { 9: pwd, err := os.Getwd() 10: if err != nil { 14: fmt.Println(pwd) 15: } +19: } diff --git a/src/cmd/compile/internal/ssa/testdata/i22600.go b/src/cmd/compile/internal/ssa/testdata/i22600.go index 8cecd14a4b..f7a7ade374 100644 --- a/src/cmd/compile/internal/ssa/testdata/i22600.go +++ b/src/cmd/compile/internal/ssa/testdata/i22600.go @@ -5,7 +5,7 @@ import ( "os" ) -func main() { +func test() { pwd, err := os.Getwd() if err != nil { fmt.Println(err) @@ -13,3 +13,7 @@ func main() { } fmt.Println(pwd) } + +func main() { + test() +} |