var hexRe = regexp.MustCompile("0x[a-zA-Z0-9]+")
var numRe = regexp.MustCompile("-?[0-9]+")
var stringRe = regexp.MustCompile("\"([^\\\"]|(\\.))*\"")
+var leadingDollarNumberRe = regexp.MustCompile("^[$][0-9]+")
+var optOutGdbRe = regexp.MustCompile("[<]optimized out[>]")
+var numberColonRe = regexp.MustCompile("^ *[0-9]+:")
var gdb = "gdb" // Might be "ggdb" on Darwin, because gdb no longer part of XCode
var debugger = "gdb" // For naming files, etc.
// The file being tested may contain comments of the form
// //DBG-TAG=(v1,v2,v3)
// where DBG = {gdb,dlv} and TAG={dbg,opt}
-// each variable may optionally be followed by a / and one or more of S,A,N
+// each variable may optionally be followed by a / and one or more of S,A,N,O
// to indicate normalization of Strings, (hex) addresses, and numbers.
+// "O" is an explicit indication that we expect it to be optimized out.
// For example:
/*
if len(os.Args) > 1 { //gdb-dbg=(hist/A,cannedInput/A) //dlv-dbg=(hist/A,cannedInput/A)
lastfile = p.file
}
fmt.Fprintf(file, "%d:%s\n", p.line, x)
- // Vars must begin with a dollar-sign.
// TODO, normalize between gdb and dlv into a common, comparable format.
for _, y := range h.vars[i] {
y = strings.TrimSpace(y)
- if y[0] != '$' {
- panic(fmt.Sprintf("Var line '%s' must begin with $, but does not\n", y))
- }
fmt.Fprintf(file, "%s\n", y)
}
}
if l[0] == ' ' {
// file -- first two characters expected to be " "
lastfile = strings.TrimSpace(l)
- } else if l[0] == '$' {
- h.addVar(l)
- } else {
+ } else if numberColonRe.MatchString(l) {
// line number -- <number>:<line>
colonPos := strings.Index(l, ":")
if colonPos == -1 {
panic(fmt.Sprintf("Line %d (%s) in file %s expected to contain '<number>:' but does not.\n", i+1, l, filename))
}
h.add(lastfile, l[0:colonPos], l[colonPos+1:])
+ } else {
+ h.addVar(l)
}
}
}
if cr == -1 {
cr = len(response)
}
+ // Convert the leading $<number> into $<N> to limit scope of diffs
+ // when a new print-this-variable comment is added.
response = strings.TrimSpace(response[dollar:cr])
+ response = leadingDollarNumberRe.ReplaceAllString(response, v)
+
if strings.Contains(substitutions, "A") {
response = hexRe.ReplaceAllString(response, "<A>")
}
if strings.Contains(substitutions, "S") {
response = stringRe.ReplaceAllString(response, "<S>")
}
+ if strings.Contains(substitutions, "O") {
+ response = optOutGdbRe.ReplaceAllString(response, "<Optimized out, as expected>")
+ }
s.ioState.history.addVar(response)
}
return true
55: func main() {
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)
-$1 = 1
-$2 = 4
-60: dy := l.end.y - l.begin.y //gdb-opt=(dx)
-61: sink = dx + dy
-63: hist := make([]int, 7) //gdb-opt=(sink)
+59: dx := l.end.x - l.begin.x //gdb-dbg=(l.begin.x,l.end.y)//gdb-opt=(l,dx/O,dy/O)
+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)
-$3 = []int = {0, 0, 0, 0, 0, 0, 0}
-$4 = "1\n1\n1\n2\n2\n2\n4\n4\n5\n"
+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 {
70: return
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)
-$5 = 1
+i = 1
81: hist = ensure(int(i), hist)
82: hist[int(i)]++
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)
-$6 = 1
+i = 1
81: hist = ensure(int(i), hist)
82: hist[int(i)]++
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)
-$7 = 1
+i = 1
81: hist = ensure(int(i), hist)
82: hist[int(i)]++
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)
-$8 = 2
+i = 2
81: hist = ensure(int(i), hist)
82: hist[int(i)]++
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)
-$9 = 2
+i = 2
81: hist = ensure(int(i), hist)
82: hist[int(i)]++
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)
-$10 = 2
+i = 2
81: hist = ensure(int(i), hist)
82: hist[int(i)]++
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)
-$11 = 4
+i = 4
81: hist = ensure(int(i), hist)
82: hist[int(i)]++
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)
-$12 = 4
+i = 4
81: hist = ensure(int(i), hist)
82: hist[int(i)]++
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)
-$13 = 5
+i = 5
81: hist = ensure(int(i), hist)
82: hist[int(i)]++
74: for scanner.Scan() { //gdb-opt=(scanner/A)
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)
-$14 = 3
-$15 = 1
-$16 = 3
+n = 3
+i = 1
+t = 3
86: for i, a := range hist {
87: if a == 0 { //gdb-opt=(a,n,t)
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)
-$17 = 6
-$18 = 2
-$19 = 9
+n = 6
+i = 2
+t = 9
86: for i, a := range hist {
87: if a == 0 { //gdb-opt=(a,n,t)
88: continue
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)
-$20 = 8
-$21 = 4
-$22 = 17
+n = 8
+i = 4
+t = 17
86: for i, a := range hist {
87: if a == 0 { //gdb-opt=(a,n,t)
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)
-$23 = 9
-$24 = 5
-$25 = 22
+n = 9
+i = 5
+t = 22
86: for i, a := range hist {
87: if a == 0 { //gdb-opt=(a,n,t)
88: continue
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)
-60: dy := l.end.y - l.begin.y //gdb-opt=(dx)
-$1 = 2
-61: sink = dx + dy
-63: hist := make([]int, 7) //gdb-opt=(sink)
-$2 = 4
+59: dx := l.end.x - l.begin.x //gdb-dbg=(l.begin.x,l.end.y)//gdb-opt=(l,dx/O,dy/O)
+l = {begin = {x = 1, y = 2}, end = {x = 3, y = 4}}
+dx = <Optimized out, as expected>
+dy = <Optimized out, as expected>
+60: dy := l.end.y - l.begin.y //gdb-opt=(dx,dy/O)
+dx = 2
+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
+dx = <Optimized out, as expected>
+dy = <Optimized out, as expected>
64: var reader io.Reader = strings.NewReader(cannedInput) //gdb-dbg=(hist/A,cannedInput/A)
65: if len(os.Args) > 1 {
73: scanner := bufio.NewScanner(reader)
74: for scanner.Scan() { //gdb-opt=(scanner/A)
-$3 = (struct bufio.Scanner *) <A>
+scanner = (struct bufio.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)
-$4 = {tab = 0x0, data = 0x0}
-$5 = []int = {0, 0, 0, 0, 0, 0, 0}
-$6 = 1
+err = {tab = 0x0, data = 0x0}
+hist = []int = {0, 0, 0, 0, 0, 0, 0}
+i = 1
81: hist = ensure(int(i), hist)
82: hist[int(i)]++
74: for scanner.Scan() { //gdb-opt=(scanner/A)
-$7 = (struct bufio.Scanner *) <A>
+scanner = (struct bufio.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)
-$8 = {tab = 0x0, data = 0x0}
-$9 = []int = {0, 1, 0, 0, 0, 0, 0}
-$10 = 1
+err = {tab = 0x0, data = 0x0}
+hist = []int = {0, 1, 0, 0, 0, 0, 0}
+i = 1
81: hist = ensure(int(i), hist)
82: hist[int(i)]++
74: for scanner.Scan() { //gdb-opt=(scanner/A)
-$11 = (struct bufio.Scanner *) <A>
+scanner = (struct bufio.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)
-$12 = {tab = 0x0, data = 0x0}
-$13 = []int = {0, 2, 0, 0, 0, 0, 0}
-$14 = 1
+err = {tab = 0x0, data = 0x0}
+hist = []int = {0, 2, 0, 0, 0, 0, 0}
+i = 1
81: hist = ensure(int(i), hist)
82: hist[int(i)]++
74: for scanner.Scan() { //gdb-opt=(scanner/A)
-$15 = (struct bufio.Scanner *) <A>
+scanner = (struct bufio.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)
-$16 = {tab = 0x0, data = 0x0}
-$17 = []int = {0, 3, 0, 0, 0, 0, 0}
-$18 = 2
+err = {tab = 0x0, data = 0x0}
+hist = []int = {0, 3, 0, 0, 0, 0, 0}
+i = 2
81: hist = ensure(int(i), hist)
82: hist[int(i)]++
74: for scanner.Scan() { //gdb-opt=(scanner/A)
-$19 = (struct bufio.Scanner *) <A>
+scanner = (struct bufio.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)
-$20 = {tab = 0x0, data = 0x0}
-$21 = []int = {0, 3, 1, 0, 0, 0, 0}
-$22 = 2
+err = {tab = 0x0, data = 0x0}
+hist = []int = {0, 3, 1, 0, 0, 0, 0}
+i = 2
81: hist = ensure(int(i), hist)
82: hist[int(i)]++
74: for scanner.Scan() { //gdb-opt=(scanner/A)
-$23 = (struct bufio.Scanner *) <A>
+scanner = (struct bufio.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)
-$24 = {tab = 0x0, data = 0x0}
-$25 = []int = {0, 3, 2, 0, 0, 0, 0}
-$26 = 2
+err = {tab = 0x0, data = 0x0}
+hist = []int = {0, 3, 2, 0, 0, 0, 0}
+i = 2
81: hist = ensure(int(i), hist)
82: hist[int(i)]++
74: for scanner.Scan() { //gdb-opt=(scanner/A)
-$27 = (struct bufio.Scanner *) <A>
+scanner = (struct bufio.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)
-$28 = {tab = 0x0, data = 0x0}
-$29 = []int = {0, 3, 3, 0, 0, 0, 0}
-$30 = 4
+err = {tab = 0x0, data = 0x0}
+hist = []int = {0, 3, 3, 0, 0, 0, 0}
+i = 4
81: hist = ensure(int(i), hist)
82: hist[int(i)]++
74: for scanner.Scan() { //gdb-opt=(scanner/A)
-$31 = (struct bufio.Scanner *) <A>
+scanner = (struct bufio.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)
-$32 = {tab = 0x0, data = 0x0}
-$33 = []int = {0, 3, 3, 0, 1, 0, 0}
-$34 = 4
+err = {tab = 0x0, data = 0x0}
+hist = []int = {0, 3, 3, 0, 1, 0, 0}
+i = 4
81: hist = ensure(int(i), hist)
82: hist[int(i)]++
74: for scanner.Scan() { //gdb-opt=(scanner/A)
-$35 = (struct bufio.Scanner *) <A>
+scanner = (struct bufio.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)
-$36 = {tab = 0x0, data = 0x0}
-$37 = []int = {0, 3, 3, 0, 2, 0, 0}
-$38 = 5
+err = {tab = 0x0, data = 0x0}
+hist = []int = {0, 3, 3, 0, 2, 0, 0}
+i = 5
81: hist = ensure(int(i), hist)
82: hist[int(i)]++
74: for scanner.Scan() { //gdb-opt=(scanner/A)
-$39 = (struct bufio.Scanner *) <A>
+scanner = (struct bufio.Scanner *) <A>
86: for i, a := range hist {
87: if a == 0 { //gdb-opt=(a,n,t)
-$40 = 0
-$41 = 0
-$42 = 0
+a = 0
+n = 0
+t = 0
88: continue
87: if a == 0 { //gdb-opt=(a,n,t)
-$43 = 3
-$44 = 0
-$45 = 0
+a = 3
+n = 0
+t = 0
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)
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)
86: for i, a := range hist {
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)
-$46 = 3
-$47 = 3
-$48 = 3
+a = 3
+n = 3
+t = 3
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)
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)
86: for i, a := range hist {
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)
-$49 = 0
-$50 = 6
-$51 = 9
+a = 0
+n = 6
+t = 9
88: continue
87: if a == 0 { //gdb-opt=(a,n,t)
-$52 = 2
-$53 = 6
-$54 = 9
+a = 2
+n = 6
+t = 9
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)
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)
86: for i, a := range hist {
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)
-$55 = 1
-$56 = 8
-$57 = 17
+a = 1
+n = 8
+t = 17
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)
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)
86: for i, a := range hist {
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)
-$58 = 0
-$59 = 9
-$60 = 22
+a = 0
+n = 9
+t = 22
88: continue
95: }