| // Copyright 2017 The Go Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style | |
| // license that can be found in the LICENSE file. | |
| // This is the input program for an end-to-end test of the DWARF produced | |
| // by the compiler. It is compiled with various flags, then the resulting | |
| // binary is "debugged" under the control of a harness. Because the compile+debug | |
| // step is time-consuming, the tests for different bugs are all accumulated here | |
| // so that their cost is only the time to "n" through the additional code. | |
| package main | |
| import ( | |
| "bufio" | |
| "fmt" | |
| "io" | |
| "os" | |
| "strconv" | |
| "strings" | |
| ) | |
| type point struct { | |
| x, y int | |
| } | |
| type line struct { | |
| begin, end point | |
| } | |
| var zero int | |
| var sink int | |
| //go:noinline | |
| func tinycall() { | |
| } | |
| func ensure(n int, sl []int) []int { | |
| for len(sl) <= n { | |
| sl = append(sl, 0) | |
| } | |
| return sl | |
| } | |
| var cannedInput string = `1 | |
| 1 | |
| 1 | |
| 2 | |
| 2 | |
| 2 | |
| 4 | |
| 4 | |
| 5 | |
| ` | |
| func test() { | |
| // For #19868 | |
| l := line{point{1 + zero, 2 + zero}, point{3 + zero, 4 + zero}} | |
| tinycall() // this forces l etc to stack | |
| dx := l.end.x - l.begin.x //gdb-dbg=(l.begin.x,l.end.y)//gdb-opt=(l,dx/O,dy/O) | |
| 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=(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]) | |
| if err != nil { | |
| fmt.Fprintf(os.Stderr, "There was an error opening %s: %v\n", os.Args[1], err) | |
| return | |
| } | |
| } | |
| scanner := bufio.NewScanner(reader) | |
| for scanner.Scan() { //gdb-opt=(scanner/A) | |
| s := scanner.Text() | |
| i, err := strconv.ParseInt(s, 10, 64) | |
| if err != nil { //gdb-dbg=(i) //gdb-opt=(err,hist,i) | |
| fmt.Fprintf(os.Stderr, "There was an error: %v\n", err) | |
| return | |
| } | |
| hist = ensure(int(i), hist) | |
| hist[int(i)]++ | |
| } | |
| t := 0 | |
| n := 0 | |
| for i, a := range hist { | |
| if a == 0 { //gdb-opt=(a,n,t) | |
| continue | |
| } | |
| t += i * a | |
| 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() { | |
| growstack() // Use stack early to prevent growth during test, which confuses gdb | |
| test() | |
| } | |
| var snk string | |
| //go:noinline | |
| func growstack() { | |
| snk = fmt.Sprintf("%#v,%#v,%#v", 1, true, "cat") | |
| } |