| // Copyright 2021 The Go Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style | |
| // license that can be found in the LICENSE file. | |
| package pkgbits | |
| // Version indicates a version of a unified IR bitstream. | |
| // Each Version indicates the addition, removal, or change of | |
| // new data in the bitstream. | |
| // | |
| // These are serialized to disk and the interpretation remains fixed. | |
| type Version uint32 | |
| const ( | |
| // V0: initial prototype. | |
| // | |
| // All data that is not assigned a Field is in version V0 | |
| // and has not been deprecated. | |
| V0 Version = iota | |
| // V1: adds the Flags uint32 word | |
| V1 | |
| // V2: removes unused legacy fields and supports type parameters for aliases. | |
| // - remove the legacy "has init" bool from the public root | |
| // - remove obj's "derived func instance" bool | |
| // - add a TypeParamNames field to ObjAlias | |
| // - remove derived info "needed" bool | |
| V2 | |
| numVersions = iota | |
| ) | |
| // Field denotes a unit of data in the serialized unified IR bitstream. | |
| // It is conceptually a like field in a structure. | |
| // | |
| // We only really need Fields when the data may or may not be present | |
| // in a stream based on the Version of the bitstream. | |
| // | |
| // Unlike much of pkgbits, Fields are not serialized and | |
| // can change values as needed. | |
| type Field int | |
| const ( | |
| // Flags in a uint32 in the header of a bitstream | |
| // that is used to indicate whether optional features are enabled. | |
| Flags Field = iota | |
| // Deprecated: HasInit was a bool indicating whether a package | |
| // has any init functions. | |
| HasInit | |
| // Deprecated: DerivedFuncInstance was a bool indicating | |
| // whether an object was a function instance. | |
| DerivedFuncInstance | |
| // ObjAlias has a list of TypeParamNames. | |
| AliasTypeParamNames | |
| // Deprecated: DerivedInfoNeeded was a bool indicating | |
| // whether a type was a derived type. | |
| DerivedInfoNeeded | |
| numFields = iota | |
| ) | |
| // introduced is the version a field was added. | |
| var introduced = [numFields]Version{ | |
| Flags: V1, | |
| AliasTypeParamNames: V2, | |
| } | |
| // removed is the version a field was removed in or 0 for fields | |
| // that have not yet been deprecated. | |
| // (So removed[f]-1 is the last version it is included in.) | |
| var removed = [numFields]Version{ | |
| HasInit: V2, | |
| DerivedFuncInstance: V2, | |
| DerivedInfoNeeded: V2, | |
| } | |
| // Has reports whether field f is present in a bitstream at version v. | |
| func (v Version) Has(f Field) bool { | |
| return introduced[f] <= v && (v < removed[f] || removed[f] == V0) | |
| } | |