1
2
3
4
5 package version
6
7 import (
8 "fmt"
9 "io"
10
11 "internal/trace/tracev2"
12 )
13
14
15 type Version uint32
16
17 const (
18 Go111 Version = 11
19 Go119 Version = 19
20 Go121 Version = 21
21 Go122 Version = 22
22 Go123 Version = 23
23 Go125 Version = 25
24 Current = Go125
25 )
26
27 var versions = map[Version][]tracev2.EventSpec{
28
29
30 Go111: nil,
31 Go119: nil,
32 Go121: nil,
33
34 Go122: tracev2.Specs()[:tracev2.EvUserLog+1],
35 Go123: tracev2.Specs()[:tracev2.EvExperimentalBatch+1],
36 Go125: tracev2.Specs(),
37 }
38
39
40 func (v Version) Specs() []tracev2.EventSpec {
41 return versions[v]
42 }
43
44
45
46 func (v Version) EventName(typ tracev2.EventType) string {
47 if !v.Valid() {
48 return "<invalid trace version>"
49 }
50 s := v.Specs()
51 if len(s) == 0 {
52 return "<v1 trace event type>"
53 }
54 if int(typ) < len(s) && s[typ].Name != "" {
55 return s[typ].Name
56 }
57 return fmt.Sprintf("Invalid(%d)", typ)
58 }
59
60 func (v Version) Valid() bool {
61 _, ok := versions[v]
62 return ok
63 }
64
65
66 const headerFmt = "go 1.%d trace\x00\x00\x00"
67
68
69
70 func ReadHeader(r io.Reader) (Version, error) {
71 var v Version
72 _, err := fmt.Fscanf(r, headerFmt, &v)
73 if err != nil {
74 return v, fmt.Errorf("bad file format: not a Go execution trace?")
75 }
76 if !v.Valid() {
77 return v, fmt.Errorf("unknown or unsupported trace version go 1.%d", v)
78 }
79 return v, nil
80 }
81
82
83 func WriteHeader(w io.Writer, v Version) (int, error) {
84 return fmt.Fprintf(w, headerFmt, v)
85 }
86
View as plain text