]> Cypherpunks.ru repositories - gostls13.git/blob - src/internal/trace/v2/version/version.go
runtime: add execution tracer v2 behind GOEXPERIMENT=exectracer2
[gostls13.git] / src / internal / trace / v2 / version / version.go
1 package version
2
3 import (
4         "fmt"
5         "io"
6
7         "internal/trace/v2/event"
8         "internal/trace/v2/event/go122"
9 )
10
11 // Version represents the version of a trace file.
12 type Version uint32
13
14 const (
15         Go122 Version = 22
16 )
17
18 var versions = map[Version][]event.Spec{
19         Go122: go122.Specs(),
20 }
21
22 // Specs returns the set of event.Specs for this version.
23 func (v Version) Specs() []event.Spec {
24         return versions[v]
25 }
26
27 func (v Version) Valid() bool {
28         _, ok := versions[v]
29         return ok
30 }
31
32 // headerFmt is the format of the header of all Go execution traces.
33 const headerFmt = "go 1.%d trace\x00\x00\x00"
34
35 // ReadHeader reads the version of the trace out of the trace file's
36 // header, whose prefix must be present in v.
37 func ReadHeader(r io.Reader) (Version, error) {
38         var v Version
39         _, err := fmt.Fscanf(r, headerFmt, &v)
40         if err != nil {
41                 return v, fmt.Errorf("bad file format: not a Go execution trace?")
42         }
43         if !v.Valid() {
44                 return v, fmt.Errorf("unknown or unsupported trace version go 1.%d", v)
45         }
46         return v, nil
47 }
48
49 // WriteHeader writes a header for a trace version v to w.
50 func WriteHeader(w io.Writer, v Version) (int, error) {
51         return fmt.Fprintf(w, headerFmt, v)
52 }