mirror of
https://github.com/golang/go.git
synced 2026-01-29 07:02:05 +03:00
Compare commits
4 Commits
0f72aff835
...
a0796d8af6
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a0796d8af6 | ||
|
|
481ab86aaf | ||
|
|
251f3aa6ee | ||
|
|
5ec5fdc093 |
@@ -756,6 +756,9 @@ func writeType(t *types.Type) *obj.LSym {
|
||||
// | method list, if any | dextratype
|
||||
// +--------------------------------+ - E
|
||||
|
||||
// runtime.moduleTypelinks is aware of this type layout,
|
||||
// and must be changed if the layout change.
|
||||
|
||||
// UncommonType section is included if we have a name or a method.
|
||||
extra := t.Sym() != nil || len(methods(t)) != 0
|
||||
|
||||
|
||||
@@ -1535,6 +1535,10 @@ func fixZeroSizedSymbols(ctxt *Link) {
|
||||
types.SetSize(8)
|
||||
ldr.SetAttrSpecial(types.Sym(), false)
|
||||
|
||||
etypedesc := ldr.CreateSymForUpdate("runtime.etypedesc", 0)
|
||||
etypedesc.SetType(sym.STYPE)
|
||||
ldr.SetAttrSpecial(etypedesc.Sym(), false)
|
||||
|
||||
etypes := ldr.CreateSymForUpdate("runtime.etypes", 0)
|
||||
etypes.SetType(sym.STYPE)
|
||||
ldr.SetAttrSpecial(etypes.Sym(), false)
|
||||
@@ -2124,16 +2128,6 @@ func (state *dodataState) allocateDataSections(ctxt *Link) {
|
||||
xcoffUpdateOuterSize(ctxt, int64(sect.Length), sym.SPCLNTAB)
|
||||
}
|
||||
|
||||
/* typelink */
|
||||
sect = state.allocateNamedDataSection(segro, ".typelink", []sym.SymKind{sym.STYPELINK}, 04)
|
||||
|
||||
typelink := ldr.CreateSymForUpdate("runtime.typelink", 0)
|
||||
ldr.SetSymSect(typelink.Sym(), sect)
|
||||
typelink.SetType(sym.SRODATA)
|
||||
state.datsize += typelink.Size()
|
||||
state.checkdatsize(sym.STYPELINK)
|
||||
sect.Length = uint64(state.datsize) - sect.Vaddr
|
||||
|
||||
/* read-only ELF, Mach-O sections */
|
||||
state.allocateSingleSymSections(segro, sym.SELFROSECT, sym.SRODATA, 04)
|
||||
|
||||
@@ -2224,6 +2218,7 @@ func (state *dodataState) allocateDataSections(ctxt *Link) {
|
||||
|
||||
sect = createRelroSect(".go.type", sym.STYPE)
|
||||
ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.types", 0), sect)
|
||||
ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.etypedesc", 0), sect)
|
||||
ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.etypes", 0), sect)
|
||||
|
||||
sect = createRelroSect(".go.func", sym.SGOFUNC)
|
||||
@@ -2358,39 +2353,107 @@ func (state *dodataState) dodataSect(ctxt *Link, symn sym.SymKind, syms []loader
|
||||
}
|
||||
zerobase = ldr.Lookup("runtime.zerobase", 0)
|
||||
|
||||
sortHeadTail := func(si, sj loader.Sym) (less bool, matched bool) {
|
||||
switch {
|
||||
case si == head, sj == tail:
|
||||
return true, true
|
||||
case sj == head, si == tail:
|
||||
return false, true
|
||||
}
|
||||
return false, false
|
||||
}
|
||||
|
||||
sortFn := func(i, j int) bool {
|
||||
si, sj := sl[i].sym, sl[j].sym
|
||||
isz, jsz := sl[i].sz, sl[j].sz
|
||||
if ret, matched := sortHeadTail(si, sj); matched {
|
||||
return ret
|
||||
}
|
||||
if sortBySize {
|
||||
switch {
|
||||
// put zerobase right after all the zero-sized symbols,
|
||||
// so zero-sized symbols have the same address as zerobase.
|
||||
case si == zerobase:
|
||||
return jsz != 0 // zerobase < nonzero-sized, zerobase > zero-sized
|
||||
case sj == zerobase:
|
||||
return isz == 0 // 0-sized < zerobase, nonzero-sized > zerobase
|
||||
case isz != jsz:
|
||||
return isz < jsz
|
||||
}
|
||||
} else {
|
||||
iname := sl[i].name
|
||||
jname := sl[j].name
|
||||
if iname != jname {
|
||||
return iname < jname
|
||||
}
|
||||
}
|
||||
return si < sj // break ties by symbol number
|
||||
}
|
||||
|
||||
// Perform the sort.
|
||||
if symn != sym.SPCLNTAB {
|
||||
switch symn {
|
||||
case sym.SPCLNTAB:
|
||||
// PCLNTAB was built internally, and already has the proper order.
|
||||
|
||||
case sym.STYPE:
|
||||
// Sort type descriptors with the typelink flag first,
|
||||
// sorted by type string. The reflect package will use
|
||||
// this to ensure that type descriptor pointers are unique.
|
||||
|
||||
// Compute all the type strings we need once.
|
||||
typelinkStrings := make(map[loader.Sym]string)
|
||||
for _, s := range syms {
|
||||
if ldr.IsTypelink(s) {
|
||||
typelinkStrings[s] = decodetypeStr(ldr, ctxt.Arch, s)
|
||||
}
|
||||
}
|
||||
|
||||
sort.Slice(sl, func(i, j int) bool {
|
||||
si, sj := sl[i].sym, sl[j].sym
|
||||
isz, jsz := sl[i].sz, sl[j].sz
|
||||
switch {
|
||||
case si == head, sj == tail:
|
||||
|
||||
// Sort head and tail regardless of typelink.
|
||||
if ret, matched := sortHeadTail(si, sj); matched {
|
||||
return ret
|
||||
}
|
||||
|
||||
iTypestr, iIsTypelink := typelinkStrings[si]
|
||||
jTypestr, jIsTypelink := typelinkStrings[sj]
|
||||
|
||||
if iIsTypelink {
|
||||
if jIsTypelink {
|
||||
// typelink symbols sort by type string
|
||||
return iTypestr < jTypestr
|
||||
}
|
||||
|
||||
// typelink < non-typelink
|
||||
return true
|
||||
case sj == head, si == tail:
|
||||
} else if jIsTypelink {
|
||||
// non-typelink greater than typelink
|
||||
return false
|
||||
}
|
||||
if sortBySize {
|
||||
switch {
|
||||
// put zerobase right after all the zero-sized symbols,
|
||||
// so zero-sized symbols have the same address as zerobase.
|
||||
case si == zerobase:
|
||||
return jsz != 0 // zerobase < nonzero-sized, zerobase > zero-sized
|
||||
case sj == zerobase:
|
||||
return isz == 0 // 0-sized < zerobase, nonzero-sized > zerobase
|
||||
case isz != jsz:
|
||||
return isz < jsz
|
||||
}
|
||||
} else {
|
||||
iname := sl[i].name
|
||||
jname := sl[j].name
|
||||
if iname != jname {
|
||||
return iname < jname
|
||||
}
|
||||
}
|
||||
return si < sj // break ties by symbol number
|
||||
|
||||
// non-typelink symbols sort by size as usual
|
||||
return sortFn(i, j)
|
||||
})
|
||||
} else {
|
||||
// PCLNTAB was built internally, and already has the proper order.
|
||||
|
||||
// Find the end of the typelink descriptors.
|
||||
// The offset starts at 1 to match the increment in
|
||||
// createRelroSect in allocateDataSections.
|
||||
// TODO: This wastes some space.
|
||||
offset := int64(1)
|
||||
for i := range sl {
|
||||
si := sl[i].sym
|
||||
if _, isTypelink := typelinkStrings[si]; !isTypelink {
|
||||
break
|
||||
}
|
||||
offset = Rnd(offset, int64(symalign(ldr, si)))
|
||||
offset += sl[i].sz
|
||||
}
|
||||
|
||||
ldr.SetSymValue(ldr.LookupOrCreateSym("runtime.etypedesc", 0), offset)
|
||||
|
||||
default:
|
||||
sort.Slice(sl, sortFn)
|
||||
}
|
||||
|
||||
// Set alignment, construct result
|
||||
@@ -3035,9 +3098,12 @@ func (ctxt *Link) address() []*sym.Segment {
|
||||
ctxt.xdefine("runtime.rodata", sym.SRODATA, int64(rodata.Vaddr))
|
||||
ctxt.xdefine("runtime.erodata", sym.SRODATA, int64(rodata.Vaddr+rodata.Length))
|
||||
ctxt.xdefine("runtime.types", sym.SRODATA, int64(types.Vaddr))
|
||||
// etypedesc was set to the offset from the symbol start in dodataSect.
|
||||
s := ldr.Lookup("runtime.etypedesc", 0)
|
||||
ctxt.xdefine("runtime.etypedesc", sym.SRODATA, int64(types.Vaddr+uint64(ldr.SymValue(s))))
|
||||
ctxt.xdefine("runtime.etypes", sym.SRODATA, int64(types.Vaddr+types.Length))
|
||||
|
||||
s := ldr.Lookup("runtime.gcdata", 0)
|
||||
s = ldr.Lookup("runtime.gcdata", 0)
|
||||
ldr.SetAttrLocal(s, true)
|
||||
ctxt.xdefine("runtime.egcdata", sym.SRODATA, ldr.SymAddr(s)+ldr.SymSize(s))
|
||||
ldr.SetSymSect(ldr.LookupOrCreateSym("runtime.egcdata", 0), ldr.SymSect(s))
|
||||
|
||||
@@ -408,8 +408,7 @@ func TestElfBindNow(t *testing.T) {
|
||||
}
|
||||
|
||||
// This program is intended to be just big/complicated enough that
|
||||
// we wind up with decent-sized .data.rel.ro.{typelink,itablink}
|
||||
// sections.
|
||||
// we wind up with a decent-sized .data.rel.ro.itablink section.
|
||||
const ifacecallsProg = `
|
||||
package main
|
||||
|
||||
|
||||
@@ -433,6 +433,7 @@ func (ctxt *Link) symtab(pcln *pclntab) []sym.SymKind {
|
||||
ctxt.xdefine("runtime.rodata", sym.SRODATA, 0)
|
||||
ctxt.xdefine("runtime.erodata", sym.SRODATAEND, 0)
|
||||
ctxt.xdefine("runtime.types", sym.SRODATA, 0)
|
||||
ctxt.xdefine("runtime.etypedesc", sym.SRODATA, 0)
|
||||
ctxt.xdefine("runtime.etypes", sym.SRODATA, 0)
|
||||
ctxt.xdefine("runtime.noptrdata", sym.SNOPTRDATA, 0)
|
||||
ctxt.xdefine("runtime.enoptrdata", sym.SNOPTRDATAEND, 0)
|
||||
@@ -618,6 +619,7 @@ func (ctxt *Link) symtab(pcln *pclntab) []sym.SymKind {
|
||||
moduledata.AddAddr(ctxt.Arch, ldr.Lookup("runtime.gcdata", 0))
|
||||
moduledata.AddAddr(ctxt.Arch, ldr.Lookup("runtime.gcbss", 0))
|
||||
moduledata.AddAddr(ctxt.Arch, ldr.Lookup("runtime.types", 0))
|
||||
moduledata.AddAddr(ctxt.Arch, ldr.Lookup("runtime.etypedesc", 0))
|
||||
moduledata.AddAddr(ctxt.Arch, ldr.Lookup("runtime.etypes", 0))
|
||||
moduledata.AddAddr(ctxt.Arch, ldr.Lookup("runtime.rodata", 0))
|
||||
moduledata.AddAddr(ctxt.Arch, ldr.Lookup("go:func.*", 0))
|
||||
@@ -661,11 +663,6 @@ func (ctxt *Link) symtab(pcln *pclntab) []sym.SymKind {
|
||||
// text section information
|
||||
slice(textsectionmapSym, uint64(nsections))
|
||||
|
||||
// The typelinks slice
|
||||
typelinkSym := ldr.Lookup("runtime.typelink", 0)
|
||||
ntypelinks := uint64(ldr.SymSize(typelinkSym)) / 4
|
||||
slice(typelinkSym, ntypelinks)
|
||||
|
||||
// The itablinks slice
|
||||
itablinkSym := ldr.Lookup("runtime.itablink", 0)
|
||||
nitablinks := uint64(ldr.SymSize(itablinkSym)) / uint64(ctxt.Arch.PtrSize)
|
||||
|
||||
@@ -8,49 +8,20 @@ import (
|
||||
"cmd/internal/objabi"
|
||||
"cmd/link/internal/loader"
|
||||
"cmd/link/internal/sym"
|
||||
"slices"
|
||||
"strings"
|
||||
)
|
||||
|
||||
type typelinkSortKey struct {
|
||||
TypeStr string
|
||||
Type loader.Sym
|
||||
}
|
||||
|
||||
// typelink generates the typelink table which is used by reflect.typelinks().
|
||||
// Types that should be added to the typelinks table are marked with the
|
||||
// MakeTypelink attribute by the compiler.
|
||||
// typelink generates the itablink table which is used by runtime.itabInit.
|
||||
func (ctxt *Link) typelink() {
|
||||
ldr := ctxt.loader
|
||||
var typelinks []typelinkSortKey
|
||||
var itabs []loader.Sym
|
||||
for s := loader.Sym(1); s < loader.Sym(ldr.NSym()); s++ {
|
||||
if !ldr.AttrReachable(s) {
|
||||
continue
|
||||
}
|
||||
if ldr.IsTypelink(s) {
|
||||
typelinks = append(typelinks, typelinkSortKey{decodetypeStr(ldr, ctxt.Arch, s), s})
|
||||
} else if ldr.IsItab(s) {
|
||||
if ldr.IsItab(s) {
|
||||
itabs = append(itabs, s)
|
||||
}
|
||||
}
|
||||
slices.SortFunc(typelinks, func(a, b typelinkSortKey) int {
|
||||
return strings.Compare(a.TypeStr, b.TypeStr)
|
||||
})
|
||||
|
||||
tl := ldr.CreateSymForUpdate("runtime.typelink", 0)
|
||||
tl.SetType(sym.STYPELINK)
|
||||
ldr.SetAttrLocal(tl.Sym(), true)
|
||||
tl.SetSize(int64(4 * len(typelinks)))
|
||||
tl.Grow(tl.Size())
|
||||
relocs := tl.AddRelocs(len(typelinks))
|
||||
for i, s := range typelinks {
|
||||
r := relocs.At(i)
|
||||
r.SetSym(s.Type)
|
||||
r.SetOff(int32(i * 4))
|
||||
r.SetSiz(4)
|
||||
r.SetType(objabi.R_ADDROFF)
|
||||
}
|
||||
|
||||
ptrsize := ctxt.Arch.PtrSize
|
||||
il := ldr.CreateSymForUpdate("runtime.itablink", 0)
|
||||
@@ -58,7 +29,7 @@ func (ctxt *Link) typelink() {
|
||||
ldr.SetAttrLocal(il.Sym(), true)
|
||||
il.SetSize(int64(ptrsize * len(itabs)))
|
||||
il.Grow(il.Size())
|
||||
relocs = il.AddRelocs(len(itabs))
|
||||
relocs := il.AddRelocs(len(itabs))
|
||||
for i, s := range itabs {
|
||||
r := relocs.At(i)
|
||||
r.SetSym(s)
|
||||
|
||||
@@ -583,7 +583,7 @@ func xcoffUpdateOuterSize(ctxt *Link, size int64, stype sym.SymKind) {
|
||||
switch stype {
|
||||
default:
|
||||
Errorf("unknown XCOFF outer symbol for type %s", stype.String())
|
||||
case sym.SRODATA, sym.SRODATARELRO, sym.SFUNCTAB, sym.SSTRING:
|
||||
case sym.SRODATA, sym.SRODATARELRO, sym.SSTRING:
|
||||
// Nothing to do
|
||||
case sym.STYPE:
|
||||
if ctxt.UseRelro() && (ctxt.BuildMode == BuildModeCArchive || ctxt.BuildMode == BuildModeCShared || ctxt.BuildMode == BuildModePIE) {
|
||||
|
||||
@@ -61,7 +61,6 @@ const (
|
||||
SRODATAFIPS // FIPS read-only data.
|
||||
SRODATAFIPSEND // End of FIPS read-only data.
|
||||
SRODATAEND // End of read-only data.
|
||||
SFUNCTAB // Appears to be unused, except for runtime.etypes.
|
||||
SPCLNTAB // Pclntab data.
|
||||
STYPELINK // Type links.
|
||||
SELFROSECT // ELF read-only data: relocs, dynamic linking info.
|
||||
@@ -188,7 +187,6 @@ var ReadOnly = []SymKind{
|
||||
SRODATAFIPS,
|
||||
SRODATAFIPSEND,
|
||||
SRODATAEND,
|
||||
SFUNCTAB,
|
||||
}
|
||||
|
||||
// IsText returns true if t is a text type.
|
||||
|
||||
@@ -24,70 +24,69 @@ func _() {
|
||||
_ = x[SRODATAFIPS-13]
|
||||
_ = x[SRODATAFIPSEND-14]
|
||||
_ = x[SRODATAEND-15]
|
||||
_ = x[SFUNCTAB-16]
|
||||
_ = x[SPCLNTAB-17]
|
||||
_ = x[STYPELINK-18]
|
||||
_ = x[SELFROSECT-19]
|
||||
_ = x[SRODATARELRO-20]
|
||||
_ = x[STYPE-21]
|
||||
_ = x[SGOFUNC-22]
|
||||
_ = x[SELFRELROSECT-23]
|
||||
_ = x[SMACHORELROSECT-24]
|
||||
_ = x[SITABLINK-25]
|
||||
_ = x[SFirstWritable-26]
|
||||
_ = x[SBUILDINFO-27]
|
||||
_ = x[SFIPSINFO-28]
|
||||
_ = x[SELFSECT-29]
|
||||
_ = x[SMACHO-30]
|
||||
_ = x[SWINDOWS-31]
|
||||
_ = x[SMODULEDATA-32]
|
||||
_ = x[SELFGOT-33]
|
||||
_ = x[SMACHOGOT-34]
|
||||
_ = x[SNOPTRDATA-35]
|
||||
_ = x[SNOPTRDATAFIPSSTART-36]
|
||||
_ = x[SNOPTRDATAFIPS-37]
|
||||
_ = x[SNOPTRDATAFIPSEND-38]
|
||||
_ = x[SNOPTRDATAEND-39]
|
||||
_ = x[SINITARR-40]
|
||||
_ = x[SDATA-41]
|
||||
_ = x[SDATAFIPSSTART-42]
|
||||
_ = x[SDATAFIPS-43]
|
||||
_ = x[SDATAFIPSEND-44]
|
||||
_ = x[SDATAEND-45]
|
||||
_ = x[SXCOFFTOC-46]
|
||||
_ = x[SBSS-47]
|
||||
_ = x[SNOPTRBSS-48]
|
||||
_ = x[SLIBFUZZER_8BIT_COUNTER-49]
|
||||
_ = x[SCOVERAGE_COUNTER-50]
|
||||
_ = x[SCOVERAGE_AUXVAR-51]
|
||||
_ = x[STLSBSS-52]
|
||||
_ = x[SFirstUnallocated-53]
|
||||
_ = x[SXREF-54]
|
||||
_ = x[SMACHOSYMSTR-55]
|
||||
_ = x[SMACHOSYMTAB-56]
|
||||
_ = x[SMACHOINDIRECTPLT-57]
|
||||
_ = x[SMACHOINDIRECTGOT-58]
|
||||
_ = x[SDYNIMPORT-59]
|
||||
_ = x[SHOSTOBJ-60]
|
||||
_ = x[SUNDEFEXT-61]
|
||||
_ = x[SDWARFSECT-62]
|
||||
_ = x[SDWARFCUINFO-63]
|
||||
_ = x[SDWARFCONST-64]
|
||||
_ = x[SDWARFFCN-65]
|
||||
_ = x[SDWARFABSFCN-66]
|
||||
_ = x[SDWARFTYPE-67]
|
||||
_ = x[SDWARFVAR-68]
|
||||
_ = x[SDWARFRANGE-69]
|
||||
_ = x[SDWARFLOC-70]
|
||||
_ = x[SDWARFLINES-71]
|
||||
_ = x[SDWARFADDR-72]
|
||||
_ = x[SSEHUNWINDINFO-73]
|
||||
_ = x[SSEHSECT-74]
|
||||
_ = x[SPCLNTAB-16]
|
||||
_ = x[STYPELINK-17]
|
||||
_ = x[SELFROSECT-18]
|
||||
_ = x[SRODATARELRO-19]
|
||||
_ = x[STYPE-20]
|
||||
_ = x[SGOFUNC-21]
|
||||
_ = x[SELFRELROSECT-22]
|
||||
_ = x[SMACHORELROSECT-23]
|
||||
_ = x[SITABLINK-24]
|
||||
_ = x[SFirstWritable-25]
|
||||
_ = x[SBUILDINFO-26]
|
||||
_ = x[SFIPSINFO-27]
|
||||
_ = x[SELFSECT-28]
|
||||
_ = x[SMACHO-29]
|
||||
_ = x[SWINDOWS-30]
|
||||
_ = x[SMODULEDATA-31]
|
||||
_ = x[SELFGOT-32]
|
||||
_ = x[SMACHOGOT-33]
|
||||
_ = x[SNOPTRDATA-34]
|
||||
_ = x[SNOPTRDATAFIPSSTART-35]
|
||||
_ = x[SNOPTRDATAFIPS-36]
|
||||
_ = x[SNOPTRDATAFIPSEND-37]
|
||||
_ = x[SNOPTRDATAEND-38]
|
||||
_ = x[SINITARR-39]
|
||||
_ = x[SDATA-40]
|
||||
_ = x[SDATAFIPSSTART-41]
|
||||
_ = x[SDATAFIPS-42]
|
||||
_ = x[SDATAFIPSEND-43]
|
||||
_ = x[SDATAEND-44]
|
||||
_ = x[SXCOFFTOC-45]
|
||||
_ = x[SBSS-46]
|
||||
_ = x[SNOPTRBSS-47]
|
||||
_ = x[SLIBFUZZER_8BIT_COUNTER-48]
|
||||
_ = x[SCOVERAGE_COUNTER-49]
|
||||
_ = x[SCOVERAGE_AUXVAR-50]
|
||||
_ = x[STLSBSS-51]
|
||||
_ = x[SFirstUnallocated-52]
|
||||
_ = x[SXREF-53]
|
||||
_ = x[SMACHOSYMSTR-54]
|
||||
_ = x[SMACHOSYMTAB-55]
|
||||
_ = x[SMACHOINDIRECTPLT-56]
|
||||
_ = x[SMACHOINDIRECTGOT-57]
|
||||
_ = x[SDYNIMPORT-58]
|
||||
_ = x[SHOSTOBJ-59]
|
||||
_ = x[SUNDEFEXT-60]
|
||||
_ = x[SDWARFSECT-61]
|
||||
_ = x[SDWARFCUINFO-62]
|
||||
_ = x[SDWARFCONST-63]
|
||||
_ = x[SDWARFFCN-64]
|
||||
_ = x[SDWARFABSFCN-65]
|
||||
_ = x[SDWARFTYPE-66]
|
||||
_ = x[SDWARFVAR-67]
|
||||
_ = x[SDWARFRANGE-68]
|
||||
_ = x[SDWARFLOC-69]
|
||||
_ = x[SDWARFLINES-70]
|
||||
_ = x[SDWARFADDR-71]
|
||||
_ = x[SSEHUNWINDINFO-72]
|
||||
_ = x[SSEHSECT-73]
|
||||
}
|
||||
|
||||
const _SymKind_name = "SxxxSTEXTSTEXTFIPSSTARTSTEXTFIPSSTEXTFIPSENDSTEXTENDSELFRXSECTSMACHOPLTSSTRINGSGOSTRINGSGCBITSSRODATASRODATAFIPSSTARTSRODATAFIPSSRODATAFIPSENDSRODATAENDSFUNCTABSPCLNTABSTYPELINKSELFROSECTSRODATARELROSTYPESGOFUNCSELFRELROSECTSMACHORELROSECTSITABLINKSFirstWritableSBUILDINFOSFIPSINFOSELFSECTSMACHOSWINDOWSSMODULEDATASELFGOTSMACHOGOTSNOPTRDATASNOPTRDATAFIPSSTARTSNOPTRDATAFIPSSNOPTRDATAFIPSENDSNOPTRDATAENDSINITARRSDATASDATAFIPSSTARTSDATAFIPSSDATAFIPSENDSDATAENDSXCOFFTOCSBSSSNOPTRBSSSLIBFUZZER_8BIT_COUNTERSCOVERAGE_COUNTERSCOVERAGE_AUXVARSTLSBSSSFirstUnallocatedSXREFSMACHOSYMSTRSMACHOSYMTABSMACHOINDIRECTPLTSMACHOINDIRECTGOTSDYNIMPORTSHOSTOBJSUNDEFEXTSDWARFSECTSDWARFCUINFOSDWARFCONSTSDWARFFCNSDWARFABSFCNSDWARFTYPESDWARFVARSDWARFRANGESDWARFLOCSDWARFLINESSDWARFADDRSSEHUNWINDINFOSSEHSECT"
|
||||
const _SymKind_name = "SxxxSTEXTSTEXTFIPSSTARTSTEXTFIPSSTEXTFIPSENDSTEXTENDSELFRXSECTSMACHOPLTSSTRINGSGOSTRINGSGCBITSSRODATASRODATAFIPSSTARTSRODATAFIPSSRODATAFIPSENDSRODATAENDSPCLNTABSTYPELINKSELFROSECTSRODATARELROSTYPESGOFUNCSELFRELROSECTSMACHORELROSECTSITABLINKSFirstWritableSBUILDINFOSFIPSINFOSELFSECTSMACHOSWINDOWSSMODULEDATASELFGOTSMACHOGOTSNOPTRDATASNOPTRDATAFIPSSTARTSNOPTRDATAFIPSSNOPTRDATAFIPSENDSNOPTRDATAENDSINITARRSDATASDATAFIPSSTARTSDATAFIPSSDATAFIPSENDSDATAENDSXCOFFTOCSBSSSNOPTRBSSSLIBFUZZER_8BIT_COUNTERSCOVERAGE_COUNTERSCOVERAGE_AUXVARSTLSBSSSFirstUnallocatedSXREFSMACHOSYMSTRSMACHOSYMTABSMACHOINDIRECTPLTSMACHOINDIRECTGOTSDYNIMPORTSHOSTOBJSUNDEFEXTSDWARFSECTSDWARFCUINFOSDWARFCONSTSDWARFFCNSDWARFABSFCNSDWARFTYPESDWARFVARSDWARFRANGESDWARFLOCSDWARFLINESSDWARFADDRSSEHUNWINDINFOSSEHSECT"
|
||||
|
||||
var _SymKind_index = [...]uint16{0, 4, 9, 23, 32, 44, 52, 62, 71, 78, 87, 94, 101, 117, 128, 142, 152, 160, 168, 177, 187, 199, 204, 211, 224, 239, 248, 262, 272, 281, 289, 295, 303, 314, 321, 330, 340, 359, 373, 390, 403, 411, 416, 430, 439, 451, 459, 468, 472, 481, 504, 521, 537, 544, 561, 566, 578, 590, 607, 624, 634, 642, 651, 661, 673, 684, 693, 705, 715, 724, 735, 744, 755, 765, 779, 787}
|
||||
var _SymKind_index = [...]uint16{0, 4, 9, 23, 32, 44, 52, 62, 71, 78, 87, 94, 101, 117, 128, 142, 152, 160, 169, 179, 191, 196, 203, 216, 231, 240, 254, 264, 273, 281, 287, 295, 306, 313, 322, 332, 351, 365, 382, 395, 403, 408, 422, 431, 443, 451, 460, 464, 473, 496, 513, 529, 536, 553, 558, 570, 582, 599, 616, 626, 634, 643, 653, 665, 676, 685, 697, 707, 716, 727, 736, 747, 757, 771, 779}
|
||||
|
||||
func (i SymKind) String() string {
|
||||
if i >= SymKind(len(_SymKind_index)-1) {
|
||||
|
||||
@@ -125,7 +125,6 @@ var dataSects []wasmDataSect
|
||||
func asmb(ctxt *ld.Link, ldr *loader.Loader) {
|
||||
sections := []*sym.Section{
|
||||
ldr.SymSect(ldr.Lookup("runtime.rodata", 0)),
|
||||
ldr.SymSect(ldr.Lookup("runtime.typelink", 0)),
|
||||
ldr.SymSect(ldr.Lookup("runtime.itablink", 0)),
|
||||
ldr.SymSect(ldr.Lookup("runtime.types", 0)),
|
||||
ldr.SymSect(ldr.Lookup("go:funcdesc", 0)),
|
||||
|
||||
@@ -203,6 +203,11 @@ type Cmd struct {
|
||||
// stops copying, either because it has reached the end of Stdin
|
||||
// (EOF or a read error), or because writing to the pipe returned an error,
|
||||
// or because a nonzero WaitDelay was set and expired.
|
||||
//
|
||||
// Regardless of WaitDelay, Wait can block until a Read from
|
||||
// Stdin completes. If you need to use a blocking io.Reader,
|
||||
// use the StdinPipe method to get a pipe, copy from the Reader
|
||||
// to the pipe, and arrange to close the Reader after Wait returns.
|
||||
Stdin io.Reader
|
||||
|
||||
// Stdout and Stderr specify the process's standard output and error.
|
||||
@@ -219,6 +224,12 @@ type Cmd struct {
|
||||
// goroutine reaches EOF or encounters an error or a nonzero WaitDelay
|
||||
// expires.
|
||||
//
|
||||
// Regardless of WaitDelay, Wait can block until a Write to
|
||||
// Stdout or Stderr completes. If you need to use a blocking io.Writer,
|
||||
// use the StdoutPipe or StderrPipe method to get a pipe,
|
||||
// copy from the pipe to the Writer, and arrange to close the
|
||||
// Writer after Wait returns.
|
||||
//
|
||||
// If Stdout and Stderr are the same writer, and have a type that can
|
||||
// be compared with ==, at most one goroutine at a time will call Write.
|
||||
Stdout io.Writer
|
||||
|
||||
@@ -4177,6 +4177,9 @@ type MyBytesArray [4]byte
|
||||
type MyRunes []int32
|
||||
type MyFunc func()
|
||||
type MyByte byte
|
||||
type MyRune rune
|
||||
type MyBytes2 []MyByte
|
||||
type MyRunes2 []MyRune
|
||||
|
||||
type IntChan chan int
|
||||
type IntChanRecv <-chan int
|
||||
@@ -4480,6 +4483,38 @@ var convertTests = []struct {
|
||||
{V(MyString("runes♝")), V(MyRunes("runes♝"))},
|
||||
{V(MyRunes("runes♕")), V(MyString("runes♕"))},
|
||||
|
||||
// []namedByte
|
||||
{V(string("namedByte1")), V([]MyByte("namedByte1"))},
|
||||
{V(MyString("namedByte2")), V([]MyByte("namedByte2"))},
|
||||
{V([]MyByte("namedByte3")), V(string("namedByte3"))},
|
||||
{V([]MyByte("namedByte4")), V(MyString("namedByte4"))},
|
||||
|
||||
// []namedRune
|
||||
{V(string("namedRune1")), V([]MyRune("namedRune1"))},
|
||||
{V(MyString("namedRune2")), V([]MyRune("namedRune2"))},
|
||||
{V([]MyRune("namedRune3")), V(string("namedRune3"))},
|
||||
{V([]MyRune("namedRune4")), V(MyString("namedRune4"))},
|
||||
|
||||
// named []namedByte
|
||||
{V(string("namedByte5")), V(MyBytes2("namedByte5"))},
|
||||
{V(MyString("namedByte6")), V(MyBytes2("namedByte6"))},
|
||||
{V(MyBytes2("namedByte7")), V(string("namedByte7"))},
|
||||
{V(MyBytes2("namedByte8")), V(MyString("namedByte8"))},
|
||||
|
||||
// named []namedRune
|
||||
{V(string("namedRune5")), V(MyRunes2("namedRune5"))},
|
||||
{V(MyString("namedRune6")), V(MyRunes2("namedRune6"))},
|
||||
{V(MyRunes2("namedRune7")), V(string("namedRune7"))},
|
||||
{V(MyRunes2("namedRune8")), V(MyString("namedRune8"))},
|
||||
|
||||
// random ok conversions of the above types
|
||||
{V(MyBytes2("")), V([0]MyByte{})},
|
||||
{V(MyBytes2("AA")), V([2]MyByte{65, 65})},
|
||||
{V(MyBytes2("")), V([]MyByte{})},
|
||||
{V([]MyByte{}), V(MyBytes2(""))},
|
||||
{V([]MyRune("namedRuneA")), V(MyRunes2("namedRuneA"))},
|
||||
{V(MyRunes2("namedRuneB")), V([]MyRune("namedRuneB"))},
|
||||
|
||||
// slice to array
|
||||
{V([]byte(nil)), V([0]byte{})},
|
||||
{V([]byte{}), V([0]byte{})},
|
||||
|
||||
@@ -3404,7 +3404,7 @@ func convertOp(dst, src *abi.Type) func(Value, Type) Value {
|
||||
}
|
||||
|
||||
case String:
|
||||
if dst.Kind() == abi.Slice && pkgPathFor(dst.Elem()) == "" {
|
||||
if dst.Kind() == abi.Slice {
|
||||
switch Kind(dst.Elem().Kind()) {
|
||||
case Uint8:
|
||||
return cvtStringBytes
|
||||
@@ -3414,7 +3414,7 @@ func convertOp(dst, src *abi.Type) func(Value, Type) Value {
|
||||
}
|
||||
|
||||
case Slice:
|
||||
if dst.Kind() == abi.String && pkgPathFor(src.Elem()) == "" {
|
||||
if dst.Kind() == abi.String {
|
||||
switch Kind(src.Elem().Kind()) {
|
||||
case Uint8:
|
||||
return cvtBytesString
|
||||
|
||||
@@ -47,6 +47,7 @@ const (
|
||||
lockRankRoot
|
||||
lockRankItab
|
||||
lockRankReflectOffs
|
||||
lockRankTypelinks
|
||||
lockRankSynctest
|
||||
lockRankUserArenaState
|
||||
// TRACEGLOBAL
|
||||
@@ -127,6 +128,7 @@ var lockNames = []string{
|
||||
lockRankRoot: "root",
|
||||
lockRankItab: "itab",
|
||||
lockRankReflectOffs: "reflectOffs",
|
||||
lockRankTypelinks: "typelinks",
|
||||
lockRankSynctest: "synctest",
|
||||
lockRankUserArenaState: "userArenaState",
|
||||
lockRankTraceBuf: "traceBuf",
|
||||
@@ -214,31 +216,32 @@ var lockPartialOrder [][]lockRank = [][]lockRank{
|
||||
lockRankRoot: {},
|
||||
lockRankItab: {},
|
||||
lockRankReflectOffs: {lockRankItab},
|
||||
lockRankTypelinks: {},
|
||||
lockRankSynctest: {lockRankSysmon, lockRankScavenge, lockRankSweepWaiters, lockRankStrongFromWeakQueue, lockRankSweep, lockRankTestR, lockRankTimerSend, lockRankPollDesc, lockRankWakeableSleep, lockRankHchan, lockRankNotifyList, lockRankTimers, lockRankTimer, lockRankRoot, lockRankItab, lockRankReflectOffs},
|
||||
lockRankUserArenaState: {},
|
||||
lockRankTraceBuf: {lockRankSysmon, lockRankScavenge},
|
||||
lockRankTraceStrings: {lockRankSysmon, lockRankScavenge, lockRankTraceBuf},
|
||||
lockRankFin: {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankComputeMaxProcs, lockRankUpdateMaxProcsG, lockRankSweepWaiters, lockRankAssistQueue, lockRankStrongFromWeakQueue, lockRankCleanupQueue, lockRankSweep, lockRankTestR, lockRankVgetrandom, lockRankTimerSend, lockRankExecW, lockRankCpuprof, lockRankPollDesc, lockRankWakeableSleep, lockRankHchan, lockRankAllocmR, lockRankExecR, lockRankSched, lockRankAllg, lockRankAllp, lockRankNotifyList, lockRankTimers, lockRankTimer, lockRankItab, lockRankReflectOffs, lockRankUserArenaState, lockRankTraceBuf, lockRankTraceStrings},
|
||||
lockRankSpanSetSpine: {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankComputeMaxProcs, lockRankUpdateMaxProcsG, lockRankSweepWaiters, lockRankAssistQueue, lockRankStrongFromWeakQueue, lockRankCleanupQueue, lockRankSweep, lockRankTestR, lockRankVgetrandom, lockRankTimerSend, lockRankExecW, lockRankCpuprof, lockRankPollDesc, lockRankWakeableSleep, lockRankHchan, lockRankAllocmR, lockRankExecR, lockRankSched, lockRankAllg, lockRankAllp, lockRankNotifyList, lockRankTimers, lockRankTimer, lockRankItab, lockRankReflectOffs, lockRankUserArenaState, lockRankTraceBuf, lockRankTraceStrings},
|
||||
lockRankMspanSpecial: {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankComputeMaxProcs, lockRankUpdateMaxProcsG, lockRankSweepWaiters, lockRankAssistQueue, lockRankStrongFromWeakQueue, lockRankCleanupQueue, lockRankSweep, lockRankTestR, lockRankVgetrandom, lockRankTimerSend, lockRankExecW, lockRankCpuprof, lockRankPollDesc, lockRankWakeableSleep, lockRankHchan, lockRankAllocmR, lockRankExecR, lockRankSched, lockRankAllg, lockRankAllp, lockRankNotifyList, lockRankTimers, lockRankTimer, lockRankItab, lockRankReflectOffs, lockRankUserArenaState, lockRankTraceBuf, lockRankTraceStrings},
|
||||
lockRankTraceTypeTab: {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankComputeMaxProcs, lockRankUpdateMaxProcsG, lockRankSweepWaiters, lockRankAssistQueue, lockRankStrongFromWeakQueue, lockRankCleanupQueue, lockRankSweep, lockRankTestR, lockRankVgetrandom, lockRankTimerSend, lockRankExecW, lockRankCpuprof, lockRankPollDesc, lockRankWakeableSleep, lockRankHchan, lockRankAllocmR, lockRankExecR, lockRankSched, lockRankAllg, lockRankAllp, lockRankNotifyList, lockRankTimers, lockRankTimer, lockRankItab, lockRankReflectOffs, lockRankUserArenaState, lockRankTraceBuf, lockRankTraceStrings},
|
||||
lockRankGcBitsArenas: {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankComputeMaxProcs, lockRankUpdateMaxProcsG, lockRankSweepWaiters, lockRankAssistQueue, lockRankStrongFromWeakQueue, lockRankCleanupQueue, lockRankSweep, lockRankTestR, lockRankVgetrandom, lockRankTimerSend, lockRankExecW, lockRankCpuprof, lockRankPollDesc, lockRankWakeableSleep, lockRankHchan, lockRankAllocmR, lockRankExecR, lockRankSched, lockRankAllg, lockRankAllp, lockRankNotifyList, lockRankTimers, lockRankTimer, lockRankItab, lockRankReflectOffs, lockRankUserArenaState, lockRankTraceBuf, lockRankTraceStrings, lockRankMspanSpecial},
|
||||
lockRankProfInsert: {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankComputeMaxProcs, lockRankUpdateMaxProcsG, lockRankSweepWaiters, lockRankAssistQueue, lockRankStrongFromWeakQueue, lockRankCleanupQueue, lockRankSweep, lockRankTestR, lockRankVgetrandom, lockRankTimerSend, lockRankExecW, lockRankCpuprof, lockRankPollDesc, lockRankWakeableSleep, lockRankHchan, lockRankAllocmR, lockRankExecR, lockRankSched, lockRankAllg, lockRankAllp, lockRankNotifyList, lockRankTimers, lockRankTimer, lockRankItab, lockRankReflectOffs, lockRankUserArenaState, lockRankTraceBuf, lockRankTraceStrings},
|
||||
lockRankProfBlock: {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankComputeMaxProcs, lockRankUpdateMaxProcsG, lockRankSweepWaiters, lockRankAssistQueue, lockRankStrongFromWeakQueue, lockRankCleanupQueue, lockRankSweep, lockRankTestR, lockRankVgetrandom, lockRankTimerSend, lockRankExecW, lockRankCpuprof, lockRankPollDesc, lockRankWakeableSleep, lockRankHchan, lockRankAllocmR, lockRankExecR, lockRankSched, lockRankAllg, lockRankAllp, lockRankNotifyList, lockRankTimers, lockRankTimer, lockRankItab, lockRankReflectOffs, lockRankUserArenaState, lockRankTraceBuf, lockRankTraceStrings},
|
||||
lockRankProfMemActive: {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankComputeMaxProcs, lockRankUpdateMaxProcsG, lockRankSweepWaiters, lockRankAssistQueue, lockRankStrongFromWeakQueue, lockRankCleanupQueue, lockRankSweep, lockRankTestR, lockRankVgetrandom, lockRankTimerSend, lockRankExecW, lockRankCpuprof, lockRankPollDesc, lockRankWakeableSleep, lockRankHchan, lockRankAllocmR, lockRankExecR, lockRankSched, lockRankAllg, lockRankAllp, lockRankNotifyList, lockRankTimers, lockRankTimer, lockRankItab, lockRankReflectOffs, lockRankUserArenaState, lockRankTraceBuf, lockRankTraceStrings},
|
||||
lockRankProfMemFuture: {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankComputeMaxProcs, lockRankUpdateMaxProcsG, lockRankSweepWaiters, lockRankAssistQueue, lockRankStrongFromWeakQueue, lockRankCleanupQueue, lockRankSweep, lockRankTestR, lockRankVgetrandom, lockRankTimerSend, lockRankExecW, lockRankCpuprof, lockRankPollDesc, lockRankWakeableSleep, lockRankHchan, lockRankAllocmR, lockRankExecR, lockRankSched, lockRankAllg, lockRankAllp, lockRankNotifyList, lockRankTimers, lockRankTimer, lockRankItab, lockRankReflectOffs, lockRankUserArenaState, lockRankTraceBuf, lockRankTraceStrings, lockRankProfMemActive},
|
||||
lockRankGscan: {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankComputeMaxProcs, lockRankUpdateMaxProcsG, lockRankSweepWaiters, lockRankAssistQueue, lockRankStrongFromWeakQueue, lockRankCleanupQueue, lockRankSweep, lockRankTestR, lockRankVgetrandom, lockRankTimerSend, lockRankExecW, lockRankCpuprof, lockRankPollDesc, lockRankWakeableSleep, lockRankHchan, lockRankAllocmR, lockRankExecR, lockRankSched, lockRankAllg, lockRankAllp, lockRankNotifyList, lockRankTimers, lockRankTimer, lockRankNetpollInit, lockRankRoot, lockRankItab, lockRankReflectOffs, lockRankSynctest, lockRankUserArenaState, lockRankTraceBuf, lockRankTraceStrings, lockRankFin, lockRankSpanSetSpine, lockRankMspanSpecial, lockRankGcBitsArenas, lockRankProfInsert, lockRankProfBlock, lockRankProfMemActive, lockRankProfMemFuture},
|
||||
lockRankStackpool: {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankComputeMaxProcs, lockRankUpdateMaxProcsG, lockRankSweepWaiters, lockRankAssistQueue, lockRankStrongFromWeakQueue, lockRankCleanupQueue, lockRankSweep, lockRankTestR, lockRankVgetrandom, lockRankTimerSend, lockRankExecW, lockRankCpuprof, lockRankPollDesc, lockRankWakeableSleep, lockRankHchan, lockRankAllocmR, lockRankExecR, lockRankSched, lockRankAllg, lockRankAllp, lockRankNotifyList, lockRankTimers, lockRankTimer, lockRankNetpollInit, lockRankRoot, lockRankItab, lockRankReflectOffs, lockRankSynctest, lockRankUserArenaState, lockRankTraceBuf, lockRankTraceStrings, lockRankFin, lockRankSpanSetSpine, lockRankMspanSpecial, lockRankGcBitsArenas, lockRankProfInsert, lockRankProfBlock, lockRankProfMemActive, lockRankProfMemFuture, lockRankGscan},
|
||||
lockRankStackLarge: {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankComputeMaxProcs, lockRankUpdateMaxProcsG, lockRankSweepWaiters, lockRankAssistQueue, lockRankStrongFromWeakQueue, lockRankCleanupQueue, lockRankSweep, lockRankTestR, lockRankVgetrandom, lockRankTimerSend, lockRankExecW, lockRankCpuprof, lockRankPollDesc, lockRankWakeableSleep, lockRankHchan, lockRankAllocmR, lockRankExecR, lockRankSched, lockRankAllg, lockRankAllp, lockRankNotifyList, lockRankTimers, lockRankTimer, lockRankNetpollInit, lockRankRoot, lockRankItab, lockRankReflectOffs, lockRankSynctest, lockRankUserArenaState, lockRankTraceBuf, lockRankTraceStrings, lockRankFin, lockRankSpanSetSpine, lockRankMspanSpecial, lockRankGcBitsArenas, lockRankProfInsert, lockRankProfBlock, lockRankProfMemActive, lockRankProfMemFuture, lockRankGscan},
|
||||
lockRankHchanLeaf: {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankComputeMaxProcs, lockRankUpdateMaxProcsG, lockRankSweepWaiters, lockRankAssistQueue, lockRankStrongFromWeakQueue, lockRankCleanupQueue, lockRankSweep, lockRankTestR, lockRankVgetrandom, lockRankTimerSend, lockRankExecW, lockRankCpuprof, lockRankPollDesc, lockRankWakeableSleep, lockRankHchan, lockRankAllocmR, lockRankExecR, lockRankSched, lockRankAllg, lockRankAllp, lockRankNotifyList, lockRankTimers, lockRankTimer, lockRankNetpollInit, lockRankRoot, lockRankItab, lockRankReflectOffs, lockRankSynctest, lockRankUserArenaState, lockRankTraceBuf, lockRankTraceStrings, lockRankFin, lockRankSpanSetSpine, lockRankMspanSpecial, lockRankGcBitsArenas, lockRankProfInsert, lockRankProfBlock, lockRankProfMemActive, lockRankProfMemFuture, lockRankGscan, lockRankHchanLeaf},
|
||||
lockRankWbufSpans: {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankComputeMaxProcs, lockRankUpdateMaxProcsG, lockRankDefer, lockRankSweepWaiters, lockRankAssistQueue, lockRankStrongFromWeakQueue, lockRankCleanupQueue, lockRankSweep, lockRankTestR, lockRankVgetrandom, lockRankTimerSend, lockRankExecW, lockRankCpuprof, lockRankPollCache, lockRankPollDesc, lockRankWakeableSleep, lockRankHchan, lockRankAllocmR, lockRankExecR, lockRankSched, lockRankAllg, lockRankAllp, lockRankNotifyList, lockRankSudog, lockRankTimers, lockRankTimer, lockRankNetpollInit, lockRankRoot, lockRankItab, lockRankReflectOffs, lockRankSynctest, lockRankUserArenaState, lockRankTraceBuf, lockRankTraceStrings, lockRankFin, lockRankSpanSetSpine, lockRankMspanSpecial, lockRankGcBitsArenas, lockRankProfInsert, lockRankProfBlock, lockRankProfMemActive, lockRankProfMemFuture, lockRankGscan},
|
||||
lockRankFin: {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankComputeMaxProcs, lockRankUpdateMaxProcsG, lockRankSweepWaiters, lockRankAssistQueue, lockRankStrongFromWeakQueue, lockRankCleanupQueue, lockRankSweep, lockRankTestR, lockRankVgetrandom, lockRankTimerSend, lockRankExecW, lockRankCpuprof, lockRankPollDesc, lockRankWakeableSleep, lockRankHchan, lockRankAllocmR, lockRankExecR, lockRankSched, lockRankAllg, lockRankAllp, lockRankNotifyList, lockRankTimers, lockRankTimer, lockRankItab, lockRankReflectOffs, lockRankTypelinks, lockRankUserArenaState, lockRankTraceBuf, lockRankTraceStrings},
|
||||
lockRankSpanSetSpine: {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankComputeMaxProcs, lockRankUpdateMaxProcsG, lockRankSweepWaiters, lockRankAssistQueue, lockRankStrongFromWeakQueue, lockRankCleanupQueue, lockRankSweep, lockRankTestR, lockRankVgetrandom, lockRankTimerSend, lockRankExecW, lockRankCpuprof, lockRankPollDesc, lockRankWakeableSleep, lockRankHchan, lockRankAllocmR, lockRankExecR, lockRankSched, lockRankAllg, lockRankAllp, lockRankNotifyList, lockRankTimers, lockRankTimer, lockRankItab, lockRankReflectOffs, lockRankTypelinks, lockRankUserArenaState, lockRankTraceBuf, lockRankTraceStrings},
|
||||
lockRankMspanSpecial: {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankComputeMaxProcs, lockRankUpdateMaxProcsG, lockRankSweepWaiters, lockRankAssistQueue, lockRankStrongFromWeakQueue, lockRankCleanupQueue, lockRankSweep, lockRankTestR, lockRankVgetrandom, lockRankTimerSend, lockRankExecW, lockRankCpuprof, lockRankPollDesc, lockRankWakeableSleep, lockRankHchan, lockRankAllocmR, lockRankExecR, lockRankSched, lockRankAllg, lockRankAllp, lockRankNotifyList, lockRankTimers, lockRankTimer, lockRankItab, lockRankReflectOffs, lockRankTypelinks, lockRankUserArenaState, lockRankTraceBuf, lockRankTraceStrings},
|
||||
lockRankTraceTypeTab: {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankComputeMaxProcs, lockRankUpdateMaxProcsG, lockRankSweepWaiters, lockRankAssistQueue, lockRankStrongFromWeakQueue, lockRankCleanupQueue, lockRankSweep, lockRankTestR, lockRankVgetrandom, lockRankTimerSend, lockRankExecW, lockRankCpuprof, lockRankPollDesc, lockRankWakeableSleep, lockRankHchan, lockRankAllocmR, lockRankExecR, lockRankSched, lockRankAllg, lockRankAllp, lockRankNotifyList, lockRankTimers, lockRankTimer, lockRankItab, lockRankReflectOffs, lockRankTypelinks, lockRankUserArenaState, lockRankTraceBuf, lockRankTraceStrings},
|
||||
lockRankGcBitsArenas: {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankComputeMaxProcs, lockRankUpdateMaxProcsG, lockRankSweepWaiters, lockRankAssistQueue, lockRankStrongFromWeakQueue, lockRankCleanupQueue, lockRankSweep, lockRankTestR, lockRankVgetrandom, lockRankTimerSend, lockRankExecW, lockRankCpuprof, lockRankPollDesc, lockRankWakeableSleep, lockRankHchan, lockRankAllocmR, lockRankExecR, lockRankSched, lockRankAllg, lockRankAllp, lockRankNotifyList, lockRankTimers, lockRankTimer, lockRankItab, lockRankReflectOffs, lockRankTypelinks, lockRankUserArenaState, lockRankTraceBuf, lockRankTraceStrings, lockRankMspanSpecial},
|
||||
lockRankProfInsert: {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankComputeMaxProcs, lockRankUpdateMaxProcsG, lockRankSweepWaiters, lockRankAssistQueue, lockRankStrongFromWeakQueue, lockRankCleanupQueue, lockRankSweep, lockRankTestR, lockRankVgetrandom, lockRankTimerSend, lockRankExecW, lockRankCpuprof, lockRankPollDesc, lockRankWakeableSleep, lockRankHchan, lockRankAllocmR, lockRankExecR, lockRankSched, lockRankAllg, lockRankAllp, lockRankNotifyList, lockRankTimers, lockRankTimer, lockRankItab, lockRankReflectOffs, lockRankTypelinks, lockRankUserArenaState, lockRankTraceBuf, lockRankTraceStrings},
|
||||
lockRankProfBlock: {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankComputeMaxProcs, lockRankUpdateMaxProcsG, lockRankSweepWaiters, lockRankAssistQueue, lockRankStrongFromWeakQueue, lockRankCleanupQueue, lockRankSweep, lockRankTestR, lockRankVgetrandom, lockRankTimerSend, lockRankExecW, lockRankCpuprof, lockRankPollDesc, lockRankWakeableSleep, lockRankHchan, lockRankAllocmR, lockRankExecR, lockRankSched, lockRankAllg, lockRankAllp, lockRankNotifyList, lockRankTimers, lockRankTimer, lockRankItab, lockRankReflectOffs, lockRankTypelinks, lockRankUserArenaState, lockRankTraceBuf, lockRankTraceStrings},
|
||||
lockRankProfMemActive: {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankComputeMaxProcs, lockRankUpdateMaxProcsG, lockRankSweepWaiters, lockRankAssistQueue, lockRankStrongFromWeakQueue, lockRankCleanupQueue, lockRankSweep, lockRankTestR, lockRankVgetrandom, lockRankTimerSend, lockRankExecW, lockRankCpuprof, lockRankPollDesc, lockRankWakeableSleep, lockRankHchan, lockRankAllocmR, lockRankExecR, lockRankSched, lockRankAllg, lockRankAllp, lockRankNotifyList, lockRankTimers, lockRankTimer, lockRankItab, lockRankReflectOffs, lockRankTypelinks, lockRankUserArenaState, lockRankTraceBuf, lockRankTraceStrings},
|
||||
lockRankProfMemFuture: {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankComputeMaxProcs, lockRankUpdateMaxProcsG, lockRankSweepWaiters, lockRankAssistQueue, lockRankStrongFromWeakQueue, lockRankCleanupQueue, lockRankSweep, lockRankTestR, lockRankVgetrandom, lockRankTimerSend, lockRankExecW, lockRankCpuprof, lockRankPollDesc, lockRankWakeableSleep, lockRankHchan, lockRankAllocmR, lockRankExecR, lockRankSched, lockRankAllg, lockRankAllp, lockRankNotifyList, lockRankTimers, lockRankTimer, lockRankItab, lockRankReflectOffs, lockRankTypelinks, lockRankUserArenaState, lockRankTraceBuf, lockRankTraceStrings, lockRankProfMemActive},
|
||||
lockRankGscan: {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankComputeMaxProcs, lockRankUpdateMaxProcsG, lockRankSweepWaiters, lockRankAssistQueue, lockRankStrongFromWeakQueue, lockRankCleanupQueue, lockRankSweep, lockRankTestR, lockRankVgetrandom, lockRankTimerSend, lockRankExecW, lockRankCpuprof, lockRankPollDesc, lockRankWakeableSleep, lockRankHchan, lockRankAllocmR, lockRankExecR, lockRankSched, lockRankAllg, lockRankAllp, lockRankNotifyList, lockRankTimers, lockRankTimer, lockRankNetpollInit, lockRankRoot, lockRankItab, lockRankReflectOffs, lockRankTypelinks, lockRankSynctest, lockRankUserArenaState, lockRankTraceBuf, lockRankTraceStrings, lockRankFin, lockRankSpanSetSpine, lockRankMspanSpecial, lockRankGcBitsArenas, lockRankProfInsert, lockRankProfBlock, lockRankProfMemActive, lockRankProfMemFuture},
|
||||
lockRankStackpool: {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankComputeMaxProcs, lockRankUpdateMaxProcsG, lockRankSweepWaiters, lockRankAssistQueue, lockRankStrongFromWeakQueue, lockRankCleanupQueue, lockRankSweep, lockRankTestR, lockRankVgetrandom, lockRankTimerSend, lockRankExecW, lockRankCpuprof, lockRankPollDesc, lockRankWakeableSleep, lockRankHchan, lockRankAllocmR, lockRankExecR, lockRankSched, lockRankAllg, lockRankAllp, lockRankNotifyList, lockRankTimers, lockRankTimer, lockRankNetpollInit, lockRankRoot, lockRankItab, lockRankReflectOffs, lockRankTypelinks, lockRankSynctest, lockRankUserArenaState, lockRankTraceBuf, lockRankTraceStrings, lockRankFin, lockRankSpanSetSpine, lockRankMspanSpecial, lockRankGcBitsArenas, lockRankProfInsert, lockRankProfBlock, lockRankProfMemActive, lockRankProfMemFuture, lockRankGscan},
|
||||
lockRankStackLarge: {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankComputeMaxProcs, lockRankUpdateMaxProcsG, lockRankSweepWaiters, lockRankAssistQueue, lockRankStrongFromWeakQueue, lockRankCleanupQueue, lockRankSweep, lockRankTestR, lockRankVgetrandom, lockRankTimerSend, lockRankExecW, lockRankCpuprof, lockRankPollDesc, lockRankWakeableSleep, lockRankHchan, lockRankAllocmR, lockRankExecR, lockRankSched, lockRankAllg, lockRankAllp, lockRankNotifyList, lockRankTimers, lockRankTimer, lockRankNetpollInit, lockRankRoot, lockRankItab, lockRankReflectOffs, lockRankTypelinks, lockRankSynctest, lockRankUserArenaState, lockRankTraceBuf, lockRankTraceStrings, lockRankFin, lockRankSpanSetSpine, lockRankMspanSpecial, lockRankGcBitsArenas, lockRankProfInsert, lockRankProfBlock, lockRankProfMemActive, lockRankProfMemFuture, lockRankGscan},
|
||||
lockRankHchanLeaf: {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankComputeMaxProcs, lockRankUpdateMaxProcsG, lockRankSweepWaiters, lockRankAssistQueue, lockRankStrongFromWeakQueue, lockRankCleanupQueue, lockRankSweep, lockRankTestR, lockRankVgetrandom, lockRankTimerSend, lockRankExecW, lockRankCpuprof, lockRankPollDesc, lockRankWakeableSleep, lockRankHchan, lockRankAllocmR, lockRankExecR, lockRankSched, lockRankAllg, lockRankAllp, lockRankNotifyList, lockRankTimers, lockRankTimer, lockRankNetpollInit, lockRankRoot, lockRankItab, lockRankReflectOffs, lockRankTypelinks, lockRankSynctest, lockRankUserArenaState, lockRankTraceBuf, lockRankTraceStrings, lockRankFin, lockRankSpanSetSpine, lockRankMspanSpecial, lockRankGcBitsArenas, lockRankProfInsert, lockRankProfBlock, lockRankProfMemActive, lockRankProfMemFuture, lockRankGscan, lockRankHchanLeaf},
|
||||
lockRankWbufSpans: {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankComputeMaxProcs, lockRankUpdateMaxProcsG, lockRankDefer, lockRankSweepWaiters, lockRankAssistQueue, lockRankStrongFromWeakQueue, lockRankCleanupQueue, lockRankSweep, lockRankTestR, lockRankVgetrandom, lockRankTimerSend, lockRankExecW, lockRankCpuprof, lockRankPollCache, lockRankPollDesc, lockRankWakeableSleep, lockRankHchan, lockRankAllocmR, lockRankExecR, lockRankSched, lockRankAllg, lockRankAllp, lockRankNotifyList, lockRankSudog, lockRankTimers, lockRankTimer, lockRankNetpollInit, lockRankRoot, lockRankItab, lockRankReflectOffs, lockRankTypelinks, lockRankSynctest, lockRankUserArenaState, lockRankTraceBuf, lockRankTraceStrings, lockRankFin, lockRankSpanSetSpine, lockRankMspanSpecial, lockRankGcBitsArenas, lockRankProfInsert, lockRankProfBlock, lockRankProfMemActive, lockRankProfMemFuture, lockRankGscan},
|
||||
lockRankXRegAlloc: {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankComputeMaxProcs, lockRankUpdateMaxProcsG, lockRankSweepWaiters, lockRankAssistQueue, lockRankStrongFromWeakQueue, lockRankCleanupQueue, lockRankSweep, lockRankTestR, lockRankTimerSend, lockRankCpuprof, lockRankPollDesc, lockRankWakeableSleep, lockRankHchan, lockRankAllocmR, lockRankExecR, lockRankSched},
|
||||
lockRankSpanSPMCs: {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankComputeMaxProcs, lockRankUpdateMaxProcsG, lockRankDefer, lockRankSweepWaiters, lockRankAssistQueue, lockRankStrongFromWeakQueue, lockRankCleanupQueue, lockRankSweep, lockRankTestR, lockRankVgetrandom, lockRankTimerSend, lockRankExecW, lockRankCpuprof, lockRankPollCache, lockRankPollDesc, lockRankWakeableSleep, lockRankHchan, lockRankAllocmR, lockRankExecR, lockRankSched, lockRankAllg, lockRankAllp, lockRankNotifyList, lockRankSudog, lockRankTimers, lockRankTimer, lockRankNetpollInit, lockRankRoot, lockRankItab, lockRankReflectOffs, lockRankSynctest, lockRankUserArenaState, lockRankTraceBuf, lockRankTraceStrings, lockRankFin, lockRankSpanSetSpine, lockRankMspanSpecial, lockRankGcBitsArenas, lockRankProfInsert, lockRankProfBlock, lockRankProfMemActive, lockRankProfMemFuture, lockRankGscan},
|
||||
lockRankMheap: {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankComputeMaxProcs, lockRankUpdateMaxProcsG, lockRankDefer, lockRankSweepWaiters, lockRankAssistQueue, lockRankStrongFromWeakQueue, lockRankCleanupQueue, lockRankSweep, lockRankTestR, lockRankVgetrandom, lockRankTimerSend, lockRankExecW, lockRankCpuprof, lockRankPollCache, lockRankPollDesc, lockRankWakeableSleep, lockRankHchan, lockRankAllocmR, lockRankExecR, lockRankSched, lockRankAllg, lockRankAllp, lockRankNotifyList, lockRankSudog, lockRankTimers, lockRankTimer, lockRankNetpollInit, lockRankRoot, lockRankItab, lockRankReflectOffs, lockRankSynctest, lockRankUserArenaState, lockRankTraceBuf, lockRankTraceStrings, lockRankFin, lockRankSpanSetSpine, lockRankMspanSpecial, lockRankGcBitsArenas, lockRankProfInsert, lockRankProfBlock, lockRankProfMemActive, lockRankProfMemFuture, lockRankGscan, lockRankStackpool, lockRankStackLarge, lockRankWbufSpans},
|
||||
lockRankMheapSpecial: {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankComputeMaxProcs, lockRankUpdateMaxProcsG, lockRankDefer, lockRankSweepWaiters, lockRankAssistQueue, lockRankStrongFromWeakQueue, lockRankCleanupQueue, lockRankSweep, lockRankTestR, lockRankVgetrandom, lockRankTimerSend, lockRankExecW, lockRankCpuprof, lockRankPollCache, lockRankPollDesc, lockRankWakeableSleep, lockRankHchan, lockRankAllocmR, lockRankExecR, lockRankSched, lockRankAllg, lockRankAllp, lockRankNotifyList, lockRankSudog, lockRankTimers, lockRankTimer, lockRankNetpollInit, lockRankRoot, lockRankItab, lockRankReflectOffs, lockRankSynctest, lockRankUserArenaState, lockRankTraceBuf, lockRankTraceStrings, lockRankFin, lockRankSpanSetSpine, lockRankMspanSpecial, lockRankGcBitsArenas, lockRankProfInsert, lockRankProfBlock, lockRankProfMemActive, lockRankProfMemFuture, lockRankGscan, lockRankStackpool, lockRankStackLarge, lockRankWbufSpans, lockRankMheap},
|
||||
lockRankGlobalAlloc: {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankComputeMaxProcs, lockRankUpdateMaxProcsG, lockRankDefer, lockRankSweepWaiters, lockRankAssistQueue, lockRankStrongFromWeakQueue, lockRankCleanupQueue, lockRankSweep, lockRankTestR, lockRankVgetrandom, lockRankTimerSend, lockRankExecW, lockRankCpuprof, lockRankPollCache, lockRankPollDesc, lockRankWakeableSleep, lockRankHchan, lockRankAllocmR, lockRankExecR, lockRankSched, lockRankAllg, lockRankAllp, lockRankNotifyList, lockRankSudog, lockRankTimers, lockRankTimer, lockRankNetpollInit, lockRankRoot, lockRankItab, lockRankReflectOffs, lockRankSynctest, lockRankUserArenaState, lockRankTraceBuf, lockRankTraceStrings, lockRankFin, lockRankSpanSetSpine, lockRankMspanSpecial, lockRankGcBitsArenas, lockRankProfInsert, lockRankProfBlock, lockRankProfMemActive, lockRankProfMemFuture, lockRankGscan, lockRankStackpool, lockRankStackLarge, lockRankWbufSpans, lockRankXRegAlloc, lockRankSpanSPMCs, lockRankMheap, lockRankMheapSpecial},
|
||||
lockRankTrace: {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankComputeMaxProcs, lockRankUpdateMaxProcsG, lockRankDefer, lockRankSweepWaiters, lockRankAssistQueue, lockRankStrongFromWeakQueue, lockRankCleanupQueue, lockRankSweep, lockRankTestR, lockRankVgetrandom, lockRankTimerSend, lockRankExecW, lockRankCpuprof, lockRankPollCache, lockRankPollDesc, lockRankWakeableSleep, lockRankHchan, lockRankAllocmR, lockRankExecR, lockRankSched, lockRankAllg, lockRankAllp, lockRankNotifyList, lockRankSudog, lockRankTimers, lockRankTimer, lockRankNetpollInit, lockRankRoot, lockRankItab, lockRankReflectOffs, lockRankSynctest, lockRankUserArenaState, lockRankTraceBuf, lockRankTraceStrings, lockRankFin, lockRankSpanSetSpine, lockRankMspanSpecial, lockRankGcBitsArenas, lockRankProfInsert, lockRankProfBlock, lockRankProfMemActive, lockRankProfMemFuture, lockRankGscan, lockRankStackpool, lockRankStackLarge, lockRankWbufSpans, lockRankMheap},
|
||||
lockRankTraceStackTab: {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankComputeMaxProcs, lockRankUpdateMaxProcsG, lockRankDefer, lockRankSweepWaiters, lockRankAssistQueue, lockRankStrongFromWeakQueue, lockRankCleanupQueue, lockRankSweep, lockRankTestR, lockRankVgetrandom, lockRankTimerSend, lockRankExecW, lockRankCpuprof, lockRankPollCache, lockRankPollDesc, lockRankWakeableSleep, lockRankHchan, lockRankAllocmR, lockRankExecR, lockRankSched, lockRankAllg, lockRankAllp, lockRankNotifyList, lockRankSudog, lockRankTimers, lockRankTimer, lockRankNetpollInit, lockRankRoot, lockRankItab, lockRankReflectOffs, lockRankSynctest, lockRankUserArenaState, lockRankTraceBuf, lockRankTraceStrings, lockRankFin, lockRankSpanSetSpine, lockRankMspanSpecial, lockRankGcBitsArenas, lockRankProfInsert, lockRankProfBlock, lockRankProfMemActive, lockRankProfMemFuture, lockRankGscan, lockRankStackpool, lockRankStackLarge, lockRankWbufSpans, lockRankMheap, lockRankTrace},
|
||||
lockRankSpanSPMCs: {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankComputeMaxProcs, lockRankUpdateMaxProcsG, lockRankDefer, lockRankSweepWaiters, lockRankAssistQueue, lockRankStrongFromWeakQueue, lockRankCleanupQueue, lockRankSweep, lockRankTestR, lockRankVgetrandom, lockRankTimerSend, lockRankExecW, lockRankCpuprof, lockRankPollCache, lockRankPollDesc, lockRankWakeableSleep, lockRankHchan, lockRankAllocmR, lockRankExecR, lockRankSched, lockRankAllg, lockRankAllp, lockRankNotifyList, lockRankSudog, lockRankTimers, lockRankTimer, lockRankNetpollInit, lockRankRoot, lockRankItab, lockRankReflectOffs, lockRankTypelinks, lockRankSynctest, lockRankUserArenaState, lockRankTraceBuf, lockRankTraceStrings, lockRankFin, lockRankSpanSetSpine, lockRankMspanSpecial, lockRankGcBitsArenas, lockRankProfInsert, lockRankProfBlock, lockRankProfMemActive, lockRankProfMemFuture, lockRankGscan},
|
||||
lockRankMheap: {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankComputeMaxProcs, lockRankUpdateMaxProcsG, lockRankDefer, lockRankSweepWaiters, lockRankAssistQueue, lockRankStrongFromWeakQueue, lockRankCleanupQueue, lockRankSweep, lockRankTestR, lockRankVgetrandom, lockRankTimerSend, lockRankExecW, lockRankCpuprof, lockRankPollCache, lockRankPollDesc, lockRankWakeableSleep, lockRankHchan, lockRankAllocmR, lockRankExecR, lockRankSched, lockRankAllg, lockRankAllp, lockRankNotifyList, lockRankSudog, lockRankTimers, lockRankTimer, lockRankNetpollInit, lockRankRoot, lockRankItab, lockRankReflectOffs, lockRankTypelinks, lockRankSynctest, lockRankUserArenaState, lockRankTraceBuf, lockRankTraceStrings, lockRankFin, lockRankSpanSetSpine, lockRankMspanSpecial, lockRankGcBitsArenas, lockRankProfInsert, lockRankProfBlock, lockRankProfMemActive, lockRankProfMemFuture, lockRankGscan, lockRankStackpool, lockRankStackLarge, lockRankWbufSpans},
|
||||
lockRankMheapSpecial: {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankComputeMaxProcs, lockRankUpdateMaxProcsG, lockRankDefer, lockRankSweepWaiters, lockRankAssistQueue, lockRankStrongFromWeakQueue, lockRankCleanupQueue, lockRankSweep, lockRankTestR, lockRankVgetrandom, lockRankTimerSend, lockRankExecW, lockRankCpuprof, lockRankPollCache, lockRankPollDesc, lockRankWakeableSleep, lockRankHchan, lockRankAllocmR, lockRankExecR, lockRankSched, lockRankAllg, lockRankAllp, lockRankNotifyList, lockRankSudog, lockRankTimers, lockRankTimer, lockRankNetpollInit, lockRankRoot, lockRankItab, lockRankReflectOffs, lockRankTypelinks, lockRankSynctest, lockRankUserArenaState, lockRankTraceBuf, lockRankTraceStrings, lockRankFin, lockRankSpanSetSpine, lockRankMspanSpecial, lockRankGcBitsArenas, lockRankProfInsert, lockRankProfBlock, lockRankProfMemActive, lockRankProfMemFuture, lockRankGscan, lockRankStackpool, lockRankStackLarge, lockRankWbufSpans, lockRankMheap},
|
||||
lockRankGlobalAlloc: {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankComputeMaxProcs, lockRankUpdateMaxProcsG, lockRankDefer, lockRankSweepWaiters, lockRankAssistQueue, lockRankStrongFromWeakQueue, lockRankCleanupQueue, lockRankSweep, lockRankTestR, lockRankVgetrandom, lockRankTimerSend, lockRankExecW, lockRankCpuprof, lockRankPollCache, lockRankPollDesc, lockRankWakeableSleep, lockRankHchan, lockRankAllocmR, lockRankExecR, lockRankSched, lockRankAllg, lockRankAllp, lockRankNotifyList, lockRankSudog, lockRankTimers, lockRankTimer, lockRankNetpollInit, lockRankRoot, lockRankItab, lockRankReflectOffs, lockRankTypelinks, lockRankSynctest, lockRankUserArenaState, lockRankTraceBuf, lockRankTraceStrings, lockRankFin, lockRankSpanSetSpine, lockRankMspanSpecial, lockRankGcBitsArenas, lockRankProfInsert, lockRankProfBlock, lockRankProfMemActive, lockRankProfMemFuture, lockRankGscan, lockRankStackpool, lockRankStackLarge, lockRankWbufSpans, lockRankXRegAlloc, lockRankSpanSPMCs, lockRankMheap, lockRankMheapSpecial},
|
||||
lockRankTrace: {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankComputeMaxProcs, lockRankUpdateMaxProcsG, lockRankDefer, lockRankSweepWaiters, lockRankAssistQueue, lockRankStrongFromWeakQueue, lockRankCleanupQueue, lockRankSweep, lockRankTestR, lockRankVgetrandom, lockRankTimerSend, lockRankExecW, lockRankCpuprof, lockRankPollCache, lockRankPollDesc, lockRankWakeableSleep, lockRankHchan, lockRankAllocmR, lockRankExecR, lockRankSched, lockRankAllg, lockRankAllp, lockRankNotifyList, lockRankSudog, lockRankTimers, lockRankTimer, lockRankNetpollInit, lockRankRoot, lockRankItab, lockRankReflectOffs, lockRankTypelinks, lockRankSynctest, lockRankUserArenaState, lockRankTraceBuf, lockRankTraceStrings, lockRankFin, lockRankSpanSetSpine, lockRankMspanSpecial, lockRankGcBitsArenas, lockRankProfInsert, lockRankProfBlock, lockRankProfMemActive, lockRankProfMemFuture, lockRankGscan, lockRankStackpool, lockRankStackLarge, lockRankWbufSpans, lockRankMheap},
|
||||
lockRankTraceStackTab: {lockRankSysmon, lockRankScavenge, lockRankForcegc, lockRankComputeMaxProcs, lockRankUpdateMaxProcsG, lockRankDefer, lockRankSweepWaiters, lockRankAssistQueue, lockRankStrongFromWeakQueue, lockRankCleanupQueue, lockRankSweep, lockRankTestR, lockRankVgetrandom, lockRankTimerSend, lockRankExecW, lockRankCpuprof, lockRankPollCache, lockRankPollDesc, lockRankWakeableSleep, lockRankHchan, lockRankAllocmR, lockRankExecR, lockRankSched, lockRankAllg, lockRankAllp, lockRankNotifyList, lockRankSudog, lockRankTimers, lockRankTimer, lockRankNetpollInit, lockRankRoot, lockRankItab, lockRankReflectOffs, lockRankTypelinks, lockRankSynctest, lockRankUserArenaState, lockRankTraceBuf, lockRankTraceStrings, lockRankFin, lockRankSpanSetSpine, lockRankMspanSpecial, lockRankGcBitsArenas, lockRankProfInsert, lockRankProfBlock, lockRankProfMemActive, lockRankProfMemFuture, lockRankGscan, lockRankStackpool, lockRankStackLarge, lockRankWbufSpans, lockRankMheap, lockRankTrace},
|
||||
lockRankPanic: {},
|
||||
lockRankDeadlock: {lockRankPanic, lockRankDeadlock},
|
||||
lockRankRaceFini: {lockRankPanic},
|
||||
|
||||
@@ -102,6 +102,10 @@ NONE
|
||||
< itab
|
||||
< reflectOffs;
|
||||
|
||||
# Typelinks
|
||||
NONE
|
||||
< typelinks;
|
||||
|
||||
# Synctest
|
||||
hchan,
|
||||
notifyList,
|
||||
@@ -138,6 +142,7 @@ allg,
|
||||
reflectOffs,
|
||||
timer,
|
||||
traceStrings,
|
||||
typelinks,
|
||||
userArenaState,
|
||||
vgetrandom
|
||||
# Above MALLOC are things that can allocate memory.
|
||||
|
||||
@@ -630,11 +630,21 @@ func releasem(mp *m) {
|
||||
//go:linkname reflect_typelinks reflect.typelinks
|
||||
func reflect_typelinks() ([]unsafe.Pointer, [][]int32) {
|
||||
modules := activeModules()
|
||||
|
||||
typesToOffsets := func(md *moduledata) []int32 {
|
||||
types := moduleTypelinks(md)
|
||||
ret := make([]int32, 0, len(types))
|
||||
for _, typ := range types {
|
||||
ret = append(ret, int32(uintptr(unsafe.Pointer(typ))-md.types))
|
||||
}
|
||||
return ret
|
||||
}
|
||||
|
||||
sections := []unsafe.Pointer{unsafe.Pointer(modules[0].types)}
|
||||
ret := [][]int32{modules[0].typelinks}
|
||||
ret := [][]int32{typesToOffsets(modules[0])}
|
||||
for _, md := range modules[1:] {
|
||||
sections = append(sections, unsafe.Pointer(md.types))
|
||||
ret = append(ret, md.typelinks)
|
||||
ret = append(ret, typesToOffsets(md))
|
||||
}
|
||||
return sections, ret
|
||||
}
|
||||
|
||||
@@ -412,20 +412,19 @@ type moduledata struct {
|
||||
findfunctab uintptr
|
||||
minpc, maxpc uintptr
|
||||
|
||||
text, etext uintptr
|
||||
noptrdata, enoptrdata uintptr
|
||||
data, edata uintptr
|
||||
bss, ebss uintptr
|
||||
noptrbss, enoptrbss uintptr
|
||||
covctrs, ecovctrs uintptr
|
||||
end, gcdata, gcbss uintptr
|
||||
types, etypes uintptr
|
||||
rodata uintptr
|
||||
gofunc uintptr // go.func.*
|
||||
epclntab uintptr
|
||||
text, etext uintptr
|
||||
noptrdata, enoptrdata uintptr
|
||||
data, edata uintptr
|
||||
bss, ebss uintptr
|
||||
noptrbss, enoptrbss uintptr
|
||||
covctrs, ecovctrs uintptr
|
||||
end, gcdata, gcbss uintptr
|
||||
types, etypedesc, etypes uintptr
|
||||
rodata uintptr
|
||||
gofunc uintptr // go.func.*
|
||||
epclntab uintptr
|
||||
|
||||
textsectmap []textsect
|
||||
typelinks []int32 // offsets from types
|
||||
itablinks []*itab
|
||||
|
||||
ptab []ptabEntry
|
||||
@@ -445,7 +444,7 @@ type moduledata struct {
|
||||
|
||||
gcdatamask, gcbssmask bitvector
|
||||
|
||||
typemap map[typeOff]*_type // offset to *_rtype in previous module
|
||||
typemap map[*_type]*_type // *_type to use from previous module
|
||||
|
||||
next *moduledata
|
||||
}
|
||||
@@ -468,14 +467,14 @@ type modulehash struct {
|
||||
runtimehash *string
|
||||
}
|
||||
|
||||
// pinnedTypemaps are the map[typeOff]*_type from the moduledata objects.
|
||||
// pinnedTypemaps are the map[*_type]*_type from the moduledata objects.
|
||||
//
|
||||
// These typemap objects are allocated at run time on the heap, but the
|
||||
// only direct reference to them is in the moduledata, created by the
|
||||
// linker and marked SNOPTRDATA so it is ignored by the GC.
|
||||
//
|
||||
// To make sure the map isn't collected, we keep a second reference here.
|
||||
var pinnedTypemaps []map[typeOff]*_type
|
||||
var pinnedTypemaps []map[*_type]*_type
|
||||
|
||||
// aixStaticDataBase (used only on AIX) holds the unrelocated address
|
||||
// of the data section, set by the linker.
|
||||
|
||||
@@ -352,15 +352,16 @@ func resolveTypeOff(ptrInModule unsafe.Pointer, off typeOff) *_type {
|
||||
}
|
||||
return (*_type)(res)
|
||||
}
|
||||
if t := md.typemap[off]; t != nil {
|
||||
res := md.types + uintptr(off)
|
||||
resType := (*_type)(unsafe.Pointer(res))
|
||||
if t := md.typemap[resType]; t != nil {
|
||||
return t
|
||||
}
|
||||
res := md.types + uintptr(off)
|
||||
if res > md.etypes {
|
||||
println("runtime: typeOff", hex(off), "out of range", hex(md.types), "-", hex(md.etypes))
|
||||
throw("runtime: type offset out of range")
|
||||
}
|
||||
return (*_type)(unsafe.Pointer(res))
|
||||
return resType
|
||||
}
|
||||
|
||||
func (t rtype) typeOff(off typeOff) *_type {
|
||||
@@ -435,22 +436,23 @@ func pkgPath(n name) string {
|
||||
// typelinksinit scans the types from extra modules and builds the
|
||||
// moduledata typemap used to de-duplicate type pointers.
|
||||
func typelinksinit() {
|
||||
lockInit(&moduleToTypelinksLock, lockRankTypelinks)
|
||||
|
||||
if firstmoduledata.next == nil {
|
||||
return
|
||||
}
|
||||
typehash := make(map[uint32][]*_type, len(firstmoduledata.typelinks))
|
||||
|
||||
modules := activeModules()
|
||||
prev := modules[0]
|
||||
prevTypelinks := moduleTypelinks(modules[0])
|
||||
typehash := make(map[uint32][]*_type, len(prevTypelinks))
|
||||
for _, md := range modules[1:] {
|
||||
// Collect types from the previous module into typehash.
|
||||
collect:
|
||||
for _, tl := range prev.typelinks {
|
||||
var t *_type
|
||||
if prev.typemap == nil {
|
||||
t = (*_type)(unsafe.Pointer(prev.types + uintptr(tl)))
|
||||
} else {
|
||||
t = prev.typemap[typeOff(tl)]
|
||||
for _, tl := range prevTypelinks {
|
||||
t := tl
|
||||
if prev.typemap != nil {
|
||||
t = prev.typemap[tl]
|
||||
}
|
||||
// Add to typehash if not seen before.
|
||||
tlist := typehash[t.Hash]
|
||||
@@ -462,30 +464,141 @@ func typelinksinit() {
|
||||
typehash[t.Hash] = append(tlist, t)
|
||||
}
|
||||
|
||||
mdTypelinks := moduleTypelinks(md)
|
||||
|
||||
if md.typemap == nil {
|
||||
// If any of this module's typelinks match a type from a
|
||||
// prior module, prefer that prior type by adding the offset
|
||||
// to this module's typemap.
|
||||
tm := make(map[typeOff]*_type, len(md.typelinks))
|
||||
tm := make(map[*_type]*_type, len(mdTypelinks))
|
||||
pinnedTypemaps = append(pinnedTypemaps, tm)
|
||||
md.typemap = tm
|
||||
for _, tl := range md.typelinks {
|
||||
t := (*_type)(unsafe.Pointer(md.types + uintptr(tl)))
|
||||
for _, t := range mdTypelinks {
|
||||
set := t
|
||||
for _, candidate := range typehash[t.Hash] {
|
||||
seen := map[_typePair]struct{}{}
|
||||
if typesEqual(t, candidate, seen) {
|
||||
t = candidate
|
||||
set = candidate
|
||||
break
|
||||
}
|
||||
}
|
||||
md.typemap[typeOff(tl)] = t
|
||||
md.typemap[t] = set
|
||||
}
|
||||
}
|
||||
|
||||
prev = md
|
||||
prevTypelinks = mdTypelinks
|
||||
}
|
||||
}
|
||||
|
||||
// moduleToTypelinks maps from moduledata to typelinks.
|
||||
// We build this lazily as needed, since most programs do not need it.
|
||||
var (
|
||||
moduleToTypelinks map[*moduledata][]*_type
|
||||
moduleToTypelinksLock mutex
|
||||
)
|
||||
|
||||
// moduleTypelinks takes a moduledata and returns the type
|
||||
// descriptors that the reflect package needs to know about.
|
||||
// These are the typelinks. They are the types that the user
|
||||
// can construct. This is used to ensure that we use a unique
|
||||
// type descriptor for all types. The returned types are sorted
|
||||
// by type string; the sorting is done by the linker.
|
||||
// This slice is constructed as needed.
|
||||
func moduleTypelinks(md *moduledata) []*_type {
|
||||
lock(&moduleToTypelinksLock)
|
||||
|
||||
if typelinks, ok := moduleToTypelinks[md]; ok {
|
||||
unlock(&moduleToTypelinksLock)
|
||||
return typelinks
|
||||
}
|
||||
|
||||
// Allocate a very rough estimate of the number of types.
|
||||
ret := make([]*_type, 0, (md.etypedesc-md.types)/(2*unsafe.Sizeof(_type{})))
|
||||
|
||||
td := md.types
|
||||
|
||||
// We have to increment by 1 to match the increment done in
|
||||
// cmd/link/internal/data.go createRelroSect in allocateDataSections.
|
||||
td++
|
||||
|
||||
for td < md.etypedesc {
|
||||
// TODO: The fact that type descriptors are aligned to
|
||||
// 0x20 does not make sense.
|
||||
td = alignUp(td, 0x20)
|
||||
|
||||
// This code must match the data structures built by
|
||||
// cmd/compile/internal/reflectdata/reflect.go:writeType.
|
||||
|
||||
typ := (*_type)(unsafe.Pointer(td))
|
||||
|
||||
ret = append(ret, typ)
|
||||
|
||||
var typSize, add uintptr
|
||||
switch typ.Kind_ {
|
||||
case abi.Array:
|
||||
typSize = unsafe.Sizeof(abi.ArrayType{})
|
||||
case abi.Chan:
|
||||
typSize = unsafe.Sizeof(abi.ChanType{})
|
||||
case abi.Func:
|
||||
typSize = unsafe.Sizeof(abi.FuncType{})
|
||||
ft := (*abi.FuncType)(unsafe.Pointer(typ))
|
||||
add = uintptr(ft.NumIn()+ft.NumOut()) * goarch.PtrSize
|
||||
case abi.Interface:
|
||||
typSize = unsafe.Sizeof(abi.InterfaceType{})
|
||||
it := (*abi.InterfaceType)(unsafe.Pointer(typ))
|
||||
add = uintptr(len(it.Methods)) * unsafe.Sizeof(abi.Imethod{})
|
||||
case abi.Map:
|
||||
typSize = unsafe.Sizeof(abi.MapType{})
|
||||
case abi.Pointer:
|
||||
typSize = unsafe.Sizeof(abi.PtrType{})
|
||||
case abi.Slice:
|
||||
typSize = unsafe.Sizeof(abi.SliceType{})
|
||||
case abi.Struct:
|
||||
typSize = unsafe.Sizeof(abi.StructType{})
|
||||
st := (*abi.StructType)(unsafe.Pointer(typ))
|
||||
add = uintptr(len(st.Fields)) * unsafe.Sizeof(abi.StructField{})
|
||||
|
||||
case abi.Bool,
|
||||
abi.Int, abi.Int8, abi.Int16, abi.Int32, abi.Int64,
|
||||
abi.Uint, abi.Uint8, abi.Uint16, abi.Uint32, abi.Uint64, abi.Uintptr,
|
||||
abi.Float32, abi.Float64,
|
||||
abi.Complex64, abi.Complex128,
|
||||
abi.String,
|
||||
abi.UnsafePointer:
|
||||
|
||||
typSize = unsafe.Sizeof(_type{})
|
||||
|
||||
default:
|
||||
println("type descriptor at", hex(td), "is kind", typ.Kind_)
|
||||
throw("invalid type descriptor")
|
||||
}
|
||||
|
||||
td += typSize
|
||||
|
||||
mcount := uintptr(0)
|
||||
if typ.TFlag&abi.TFlagUncommon != 0 {
|
||||
ut := (*abi.UncommonType)(unsafe.Pointer(td))
|
||||
mcount = uintptr(ut.Mcount)
|
||||
td += unsafe.Sizeof(abi.UncommonType{})
|
||||
}
|
||||
|
||||
td += add
|
||||
|
||||
if mcount > 0 {
|
||||
td += mcount * unsafe.Sizeof(abi.Method{})
|
||||
}
|
||||
}
|
||||
|
||||
if moduleToTypelinks == nil {
|
||||
moduleToTypelinks = make(map[*moduledata][]*_type)
|
||||
}
|
||||
moduleToTypelinks[md] = ret
|
||||
|
||||
unlock(&moduleToTypelinksLock)
|
||||
return ret
|
||||
}
|
||||
|
||||
type _typePair struct {
|
||||
t1 *_type
|
||||
t2 *_type
|
||||
|
||||
Reference in New Issue
Block a user