// 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") }