diff options
| author | Michael Pratt <mpratt@google.com> | 2024-08-14 11:21:28 -0400 |
|---|---|---|
| committer | Gopher Robot <gobot@golang.org> | 2024-10-28 20:35:25 +0000 |
| commit | 77e3d8cf13a31343ba98268c2dddf6bc41f6ce4c (patch) | |
| tree | c1f21ea1356d5cccf04ae86aa4ad6539160106cb /src/cmd/link/internal | |
| parent | bb46b754bebb0e820d74fd9eb02635afbdf5a3bd (diff) | |
| download | go-77e3d8cf13a31343ba98268c2dddf6bc41f6ce4c.tar.xz | |
internal/runtime/maps: small maps point directly to a group
If the map contains 8 or fewer entries, it is wasteful to have a
directory that points to a table that points to a group.
Add a special case that replaces the directory with a direct pointer to
a group.
We could theoretically do similar for single table maps (no directory,
just point directly to a table), but that is left for later.
For #54766.
Cq-Include-Trybots: luci.golang.try:gotip-linux-amd64-longtest-swissmap
Change-Id: I6fc04dfc11c31dadfe5b5d6481b4c4abd43d48ed
Reviewed-on: https://go-review.googlesource.com/c/go/+/611188
Reviewed-by: Keith Randall <khr@golang.org>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Auto-Submit: Michael Pratt <mpratt@google.com>
Reviewed-by: Keith Randall <khr@google.com>
Diffstat (limited to 'src/cmd/link/internal')
| -rw-r--r-- | src/cmd/link/internal/ld/dwarf.go | 19 |
1 files changed, 7 insertions, 12 deletions
diff --git a/src/cmd/link/internal/ld/dwarf.go b/src/cmd/link/internal/ld/dwarf.go index 0b01946696..14751046da 100644 --- a/src/cmd/link/internal/ld/dwarf.go +++ b/src/cmd/link/internal/ld/dwarf.go @@ -875,7 +875,6 @@ func (d *dwctxt) synthesizemaptypes(ctxt *Link, die *dwarf.DWDie) { func (d *dwctxt) synthesizemaptypesSwiss(ctxt *Link, die *dwarf.DWDie) { mapType := walktypedef(d.findprotodie(ctxt, "type:internal/runtime/maps.Map")) tableType := walktypedef(d.findprotodie(ctxt, "type:internal/runtime/maps.table")) - tableSliceType := walktypedef(d.findprotodie(ctxt, "type:[]*internal/runtime/maps.table")) groupsReferenceType := walktypedef(d.findprotodie(ctxt, "type:internal/runtime/maps.groupsReference")) for ; die != nil; die = die.Link { @@ -916,19 +915,16 @@ func (d *dwctxt) synthesizemaptypesSwiss(ctxt *Link, die *dwarf.DWDie) { newattr(dwh, dwarf.DW_AT_go_kind, dwarf.DW_CLS_CONSTANT, int64(abi.Struct), 0) }) - // Construct type to represent []*table[K,V]. - dwTableSlice := d.mkinternaltype(ctxt, dwarf.DW_ABRV_SLICETYPE, "[]*table", keyName, valName, func(dwh *dwarf.DWDie) { - d.copychildren(ctxt, dwh, tableSliceType) - d.substitutetype(dwh, "array", d.defptrto(d.defptrto(dwTable))) - d.newrefattr(dwh, dwarf.DW_AT_go_elem, d.defptrto(dwTable)) - newattr(dwh, dwarf.DW_AT_byte_size, dwarf.DW_CLS_CONSTANT, getattr(tableSliceType, dwarf.DW_AT_byte_size).Value, nil) - newattr(dwh, dwarf.DW_AT_go_kind, dwarf.DW_CLS_CONSTANT, int64(abi.Slice), 0) - }) - // Construct map[K,V] dwMap := d.mkinternaltype(ctxt, dwarf.DW_ABRV_STRUCTTYPE, "map", keyName, valName, func(dwh *dwarf.DWDie) { d.copychildren(ctxt, dwh, mapType) - d.substitutetype(dwh, "directory", dwTableSlice) + // dirPtr is a pointer to a variable-length array of + // *table[K,V], of length dirLen. + // + // Since we can't directly define a variable-length + // array, store this as **table[K,V]. i.e., pointer to + // the first entry in the array. + d.substitutetype(dwh, "dirPtr", d.defptrto(d.defptrto(dwTable))) newattr(dwh, dwarf.DW_AT_byte_size, dwarf.DW_CLS_CONSTANT, getattr(mapType, dwarf.DW_AT_byte_size).Value, nil) newattr(dwh, dwarf.DW_AT_go_kind, dwarf.DW_CLS_CONSTANT, int64(abi.Struct), 0) }) @@ -1851,7 +1847,6 @@ func dwarfGenerateDebugInfo(ctxt *Link) { if buildcfg.Experiment.SwissMap { prototypedies["type:internal/runtime/maps.Map"] = nil prototypedies["type:internal/runtime/maps.table"] = nil - prototypedies["type:[]*internal/runtime/maps.table"] = nil prototypedies["type:internal/runtime/maps.groupsReference"] = nil } else { prototypedies["type:runtime.hmap"] = nil |
