github.com/go-asm/go@v1.21.1-0.20240213172139-40c5ead50c48/cmd/compile/ssa/testdata/hist.go (about) 1 // Copyright 2017 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 // This is the input program for an end-to-end test of the DWARF produced 6 // by the compiler. It is compiled with various flags, then the resulting 7 // binary is "debugged" under the control of a harness. Because the compile+debug 8 // step is time-consuming, the tests for different bugs are all accumulated here 9 // so that their cost is only the time to "n" through the additional code. 10 11 package main 12 13 import ( 14 "bufio" 15 "fmt" 16 "io" 17 "os" 18 "strconv" 19 "strings" 20 ) 21 22 type point struct { 23 x, y int 24 } 25 26 type line struct { 27 begin, end point 28 } 29 30 var zero int 31 var sink int 32 33 //go:noinline 34 func tinycall() { 35 } 36 37 func ensure(n int, sl []int) []int { 38 for len(sl) <= n { 39 sl = append(sl, 0) 40 } 41 return sl 42 } 43 44 var cannedInput string = `1 45 1 46 1 47 2 48 2 49 2 50 4 51 4 52 5 53 ` 54 55 func test() { 56 // For #19868 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) 62 // For #21098 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 { 66 var err error 67 reader, err = os.Open(os.Args[1]) 68 if err != nil { 69 fmt.Fprintf(os.Stderr, "There was an error opening %s: %v\n", os.Args[1], err) 70 return 71 } 72 } 73 scanner := bufio.NewScanner(reader) 74 for scanner.Scan() { //gdb-opt=(scanner/A) 75 s := scanner.Text() 76 i, err := strconv.ParseInt(s, 10, 64) 77 if err != nil { //gdb-dbg=(i) //gdb-opt=(err,hist,i) 78 fmt.Fprintf(os.Stderr, "There was an error: %v\n", err) 79 return 80 } 81 hist = ensure(int(i), hist) 82 hist[int(i)]++ 83 } 84 t := 0 85 n := 0 86 for i, a := range hist { 87 if a == 0 { //gdb-opt=(a,n,t) 88 continue 89 } 90 t += i * a 91 n += a 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) 93 } 94 } 95 96 func main() { 97 growstack() // Use stack early to prevent growth during test, which confuses gdb 98 test() 99 } 100 101 var snk string 102 103 //go:noinline 104 func growstack() { 105 snk = fmt.Sprintf("%#v,%#v,%#v", 1, true, "cat") 106 }