aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/compile
diff options
context:
space:
mode:
authorMark Freeman <mark@golang.org>2025-05-30 14:45:38 -0400
committerGopher Robot <gobot@golang.org>2025-06-02 11:58:34 -0700
commitcc119ee391575fb11bdefaeac7155bcb9c2652be (patch)
tree6f92c88d5b7e88acc51caf7dc134005af1f23379 /src/cmd/compile
parent25ca686a0bef5da90367964236fec49ce45626e3 (diff)
downloadgo-cc119ee391575fb11bdefaeac7155bcb9c2652be.tar.xz
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 <mark@golang.org> Reviewed-by: Robert Griesemer <gri@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Diffstat (limited to 'src/cmd/compile')
-rw-r--r--src/cmd/compile/internal/noder/doc.go87
1 files changed, 72 insertions, 15 deletions
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