1 // Copyright 2021 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
4 5 package pkgbits
6 7 // Version indicates a version of a unified IR bitstream.
8 // Each Version indicates the addition, removal, or change of
9 // new data in the bitstream.
10 //
11 // These are serialized to disk and the interpretation remains fixed.
12 type Version uint32
13 14 const (
15 // V0: initial prototype.
16 //
17 // All data that is not assigned a Field is in version V0
18 // and has not been deprecated.
19 V0 Version = iota
20 21 // V1: adds the Flags uint32 word
22 V1
23 24 // V2: removes unused legacy fields and supports type parameters for aliases.
25 // - remove the legacy "has init" bool from the public root
26 // - remove obj's "derived func instance" bool
27 // - add a TypeParamNames field to ObjAlias
28 // - remove derived info "needed" bool
29 V2
30 31 numVersions = iota
32 )
33 34 // Field denotes a unit of data in the serialized unified IR bitstream.
35 // It is conceptually a like field in a structure.
36 //
37 // We only really need Fields when the data may or may not be present
38 // in a stream based on the Version of the bitstream.
39 //
40 // Unlike much of pkgbits, Fields are not serialized and
41 // can change values as needed.
42 type Field int
43 44 const (
45 // Flags in a uint32 in the header of a bitstream
46 // that is used to indicate whether optional features are enabled.
47 Flags Field = iota
48 49 // Deprecated: HasInit was a bool indicating whether a package
50 // has any init functions.
51 HasInit
52 53 // Deprecated: DerivedFuncInstance was a bool indicating
54 // whether an object was a function instance.
55 DerivedFuncInstance
56 57 // ObjAlias has a list of TypeParamNames.
58 AliasTypeParamNames
59 60 // Deprecated: DerivedInfoNeeded was a bool indicating
61 // whether a type was a derived type.
62 DerivedInfoNeeded
63 64 numFields = iota
65 )
66 67 // introduced is the version a field was added.
68 var introduced = [numFields]Version{
69 Flags: V1,
70 AliasTypeParamNames: V2,
71 }
72 73 // removed is the version a field was removed in or 0 for fields
74 // that have not yet been deprecated.
75 // (So removed[f]-1 is the last version it is included in.)
76 var removed = [numFields]Version{
77 HasInit: V2,
78 DerivedFuncInstance: V2,
79 DerivedInfoNeeded: V2,
80 }
81 82 // Has reports whether field f is present in a bitstream at version v.
83 func (v Version) Has(f Field) bool {
84 return introduced[f] <= v && (v < removed[f] || removed[f] == V0)
85 }
86