diff --git a/src/cmd/compile/internal/noder/doc.go b/src/cmd/compile/internal/noder/doc.go index 3c34c416808b2b6f3b969e29070872b3a118442f..96ef8c8c77041225fb4df71e7b282b8dcc79b8d4 100644 --- a/src/cmd/compile/internal/noder/doc.go +++ b/src/cmd/compile/internal/noder/doc.go @@ -16,22 +16,85 @@ sectionEnds = [10]uint32 . // defines section boundaries elementEnds = []uint32 . // defines element boundaries fingerprint = [8]byte . // sha256 fingerprint -The payload has a structure as well. It is a series of sections, which -contain elements of the same type. Go constructs are mapped onto -(potentially multiple) elements. It is represented as below. +The payload is a series of sections. Each section has a kind which determines +its index in the series. +SectionKind = Uint64 . TODO(markfreeman): Update when we rename RelocFoo to SectionFoo. -Payload = RelocString - RelocMeta - RelocPosBase - RelocPkg - RelocName - RelocType - RelocObj - RelocObjExt - RelocObjDict - RelocBody - . +Payload = RelocString // TODO(markfreeman) Define. + RelocMeta + RelocPosBase // TODO(markfreeman) Define. + RelocPkg // TODO(markfreeman) Define. + RelocName // TODO(markfreeman) Define. + RelocType // TODO(markfreeman) Define. + RelocObj // TODO(markfreeman) Define. + RelocObjExt // TODO(markfreeman) Define. + RelocObjDict // TODO(markfreeman) Define. + RelocBody // TODO(markfreeman) Define. + . + +# Sections +A section is a series of elements of a type determined by the section's kind. +Go constructs are mapped onto (potentially multiple) elements. Elements are +accessed using an index relative to the start of the section. + +// TODO(markfreeman): Rename to SectionIndex. +RelIndex = Uint64 . + +## Meta Section +The meta section provides fundamental information for a package. It contains +exactly two elements — a public root and a private root. + +RelocMeta = PublicRoot + PrivateRoot // TODO(markfreeman): Define. + . + +The public root element identifies the package and provides references for all +exported objects it contains. + +PublicRoot = Relocs + [ SyncPublic ] // TODO(markfreeman): Define. + PackageRef // TODO(markfreeman): Define. + [ HasInit ] + ObjectRefCount // TODO(markfreeman): Define. + { ObjectRef } // TODO(markfreeman): Define. + . +HasInit = Bool . // Whether the package uses any initialization + // functions. + +# References +A reference table precedes every element. Each entry in the table contains a +section / index pair denoting the location of the referenced element. + +// TODO(markfreeman): Rename to RefTable. +Relocs = [ SyncRelocs ] // TODO(markfreeman): Define. + RelocCount + { Reloc } + . +// TODO(markfreeman): Rename to RefTableEntryCount. +RelocCount = Uint64 . +// TODO(markfreeman): Rename to RefTableEntry. +Reloc = [ SyncReloc ] // TODO(markfreeman): Define. + SectionKind + RelIndex + . + +Elements encode references to other elements as an index in the reference +table — not the location of the referenced element directly. + +// TODO(markfreeman): Rename to RefUse. +UseReloc = [ SyncUseReloc ] // TODO(markfreeman): Define. + RelIndex + . + +# Primitives +Primitive encoding is handled separately by the pkgbits package. Check there +for definitions of the below productions. + + * Bool + * Int64 + * Uint64 + * String */ package noder