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