]> Cypherpunks.ru repositories - gostls13.git/blob - test/fixedbugs/issue7690.go
cmd/compile/internal/inline: score call sites exposed by inlines
[gostls13.git] / test / fixedbugs / issue7690.go
1 // run
2
3 // Copyright 2014 The Go Authors. All rights reserved.
4 // Use of this source code is governed by a BSD-style
5 // license that can be found in the LICENSE file.
6
7 // issue 7690 - Stack and other routines did not back up initial PC
8 // into CALL instruction, instead reporting line number of next instruction,
9 // which might be on a different line.
10
11 package main
12
13 import (
14         "bytes"
15         "regexp"
16         "runtime"
17         "strconv"
18 )
19
20 func main() {
21         buf1 := make([]byte, 1000)
22         buf2 := make([]byte, 1000)
23
24         runtime.Stack(buf1, false)      // CALL is last instruction on this line
25         n := runtime.Stack(buf2, false) // CALL is followed by load of result from stack
26
27         buf1 = buf1[:bytes.IndexByte(buf1, 0)]
28         buf2 = buf2[:n]
29
30         re := regexp.MustCompile(`(?m)^main\.main\(\)\n.*/issue7690.go:([0-9]+)`)
31         m1 := re.FindStringSubmatch(string(buf1))
32         if m1 == nil {
33                 println("BUG: cannot find main.main in first trace")
34                 return
35         }
36         m2 := re.FindStringSubmatch(string(buf2))
37         if m2 == nil {
38                 println("BUG: cannot find main.main in second trace")
39                 return
40         }
41
42         n1, _ := strconv.Atoi(m1[1])
43         n2, _ := strconv.Atoi(m2[1])
44         if n1+1 != n2 {
45                 println("BUG: expect runtime.Stack on back to back lines, have", n1, n2)
46                 println(string(buf1))
47                 println(string(buf2))
48         }
49 }