From: Mark Freeman Date: Fri, 30 May 2025 18:45:38 +0000 (-0400) Subject: cmd/compile/internal/noder: stub type section and adjust others X-Git-Tag: go1.25rc1~22 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=cc119ee391575fb11bdefaeac7155bcb9c2652be;p=gostls13.git cmd/compile/internal/noder: stub type section and adjust others The type definition and object definition sections have nearly the same structure - help illustrate that through consistent naming. Change-Id: Ibed374fca4883a293a7fc16b36034e1acb38362a Reviewed-on: https://go-review.googlesource.com/c/go/+/677378 Auto-Submit: Mark Freeman Reviewed-by: Robert Griesemer LUCI-TryBot-Result: Go LUCI --- diff --git a/src/cmd/compile/internal/noder/doc.go b/src/cmd/compile/internal/noder/doc.go index 142f40c28a..cc403c835a 100644 --- a/src/cmd/compile/internal/noder/doc.go +++ b/src/cmd/compile/internal/noder/doc.go @@ -26,7 +26,7 @@ determines its index in the series. SectionPosBase SectionPkg SectionName - SectionType // TODO(markfreeman) Define. + SectionType SectionObj SectionObjExt // TODO(markfreeman) Define. SectionObjDict // TODO(markfreeman) Define. @@ -137,6 +137,44 @@ Note, a PkgRef is *not* equivalent to Ref[Pkg] due to an extra marker. Ref[Pkg] . +## Type Section +The type section is a series of type definition elements. + + SectionType = { TypeDef } . + +A type definition can be in one of several formats, which are identified +by their TypeSpec code. + + TypeDef = RefTable + [ Sync ] + [ Sync ] + Uint64 // denotes which TypeSpec to use + TypeSpec + . + + TypeSpec = TypeSpecBasic // TODO(markfreeman): Define. + | TypeSpecNamed // TODO(markfreeman): Define. + | TypeSpecPointer // TODO(markfreeman): Define. + | TypeSpecSlice // TODO(markfreeman): Define. + | TypeSpecArray // TODO(markfreeman): Define. + | TypeSpecChan // TODO(markfreeman): Define. + | TypeSpecMap // TODO(markfreeman): Define. + | TypeSpecSignature // TODO(markfreeman): Define. + | TypeSpecStruct // TODO(markfreeman): Define. + | TypeSpecInterface // TODO(markfreeman): Define. + | TypeSpecUnion // TODO(markfreeman): Define. + | TypeSpecTypeParam // TODO(markfreeman): Define. + . + +// TODO(markfreeman): Document the reader dictionary once we understand it more. +To use a type elsewhere, a TypeUse is encoded. + + TypeUse = [ Sync ] + Bool // whether it is a derived type + [ Uint64 ] // if derived, an index into the reader dictionary + [ Ref[TypeDef] ] // else, a reference to the type + . + ## Object Sections Information about an object (e.g. variable, function, type name, etc.) is split into multiple elements in different sections. Those elements @@ -160,22 +198,36 @@ for objects. . ### Definition Section -The definition section holds definitions for objects defined by the -target package; it does not contain definitions for imported objects. +The definition section holds definitions for objects defined by the target +package; it does not contain definitions for imported objects. SectionObj = { ObjectDef } . -Object definitions can be one of several formats. To determine the -correct format, the name section must be referenced for the object's -type. +Object definitions can be in one of several formats. To determine the correct +format, the name section must be referenced; it contains a code indicating +the object's type. - ObjectDef = ObjectDefConst // TODO(markfreeman) Define. - | ObjectDefFunc // TODO(markfreeman) Define. - | ObjectDefAlias // TODO(markfreeman) Define. - | ObjectDefNamedType // TODO(markfreeman) Define. - | ObjectDefVar // TODO(markfreeman) Define. + ObjectDef = RefTable + [ Sync ] + ObjectSpec . + ObjectSpec = ObjectSpecConst // TODO(markfreeman) Define. + | ObjectSpecFunc // TODO(markfreeman) Define. + | ObjectSpecAlias // TODO(markfreeman) Define. + | ObjectSpecNamedType // TODO(markfreeman) Define. + | ObjectSpecVar // TODO(markfreeman) Define. + . + +To use an object definition elsewhere, an ObjectUse is encoded. + + ObjectUse = [ Sync ] + [ Bool ] + Ref[ObjectDef] + Uint64 // the number of type arguments + { TypeUse } // references to the type arguments + . + # References A reference table precedes every element. Each entry in the table contains a (section, index) pair denoting the location of the @@ -193,10 +245,15 @@ referenced element. 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 = [ Sync ] - RelElemIdx - . + RefTableIdx = Uint64 . + +To do this, the Ref[T] primitive is used as below; note that this is +the same shape as provided by package pkgbits, just with new +interpretation applied. + + Ref[T] = [ Sync ] + RefTableIdx // the Uint64 + . # Primitives Primitive encoding is handled separately by the pkgbits package. Check