mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
[dev.link] cmd/link, cmd/compile: create content addressable pcdata syms
Switch pcdata over to content addressable symbols. This is the last step before removing these from pclntab_old. No meaningful benchmarks changes come from this work. Change-Id: I3f74f3d6026a278babe437c8010e22992c92bd89 Reviewed-on: https://go-review.googlesource.com/c/go/+/247399 Reviewed-by: Austin Clements <austin@google.com> Reviewed-by: Than McIntosh <thanm@google.com>
This commit is contained in:
parent
954db9fe51
commit
5387cdcb24
10 changed files with 181 additions and 131 deletions
|
|
@ -185,7 +185,11 @@ func WriteObjFile(ctxt *Link, b *bio.Writer) {
|
|||
// Pcdata
|
||||
h.Offsets[goobj.BlkPcdata] = w.Offset()
|
||||
for _, s := range ctxt.Text { // iteration order must match genFuncInfoSyms
|
||||
if s.Func != nil {
|
||||
// Because of the phase order, it's possible that we try to write an invalid
|
||||
// object file, and the Pcln variables haven't been filled in. As such, we
|
||||
// need to check that Pcsp exists, and assume the other pcln variables exist
|
||||
// as well. Tests like test/fixedbugs/issue22200.go demonstrate this issue.
|
||||
if s.Func != nil && s.Func.Pcln.Pcsp != nil {
|
||||
pc := &s.Func.Pcln
|
||||
w.Bytes(pc.Pcsp.P)
|
||||
w.Bytes(pc.Pcfile.P)
|
||||
|
|
@ -478,6 +482,22 @@ func (w *writer) Aux(s *LSym) {
|
|||
if s.Func.dwarfDebugLinesSym != nil && s.Func.dwarfDebugLinesSym.Size != 0 {
|
||||
w.aux1(goobj.AuxDwarfLines, s.Func.dwarfDebugLinesSym)
|
||||
}
|
||||
if s.Func.Pcln.Pcsp != nil && s.Func.Pcln.Pcsp.Size != 0 {
|
||||
w.aux1(goobj.AuxPcsp, s.Func.Pcln.Pcsp)
|
||||
}
|
||||
if s.Func.Pcln.Pcfile != nil && s.Func.Pcln.Pcfile.Size != 0 {
|
||||
w.aux1(goobj.AuxPcfile, s.Func.Pcln.Pcfile)
|
||||
}
|
||||
if s.Func.Pcln.Pcline != nil && s.Func.Pcln.Pcline.Size != 0 {
|
||||
w.aux1(goobj.AuxPcline, s.Func.Pcln.Pcline)
|
||||
}
|
||||
if s.Func.Pcln.Pcinline != nil && s.Func.Pcln.Pcinline.Size != 0 {
|
||||
w.aux1(goobj.AuxPcinline, s.Func.Pcln.Pcinline)
|
||||
}
|
||||
for _, pcSym := range s.Func.Pcln.Pcdata {
|
||||
w.aux1(goobj.AuxPcdata, pcSym)
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -559,6 +579,19 @@ func nAuxSym(s *LSym) int {
|
|||
if s.Func.dwarfDebugLinesSym != nil && s.Func.dwarfDebugLinesSym.Size != 0 {
|
||||
n++
|
||||
}
|
||||
if s.Func.Pcln.Pcsp != nil && s.Func.Pcln.Pcsp.Size != 0 {
|
||||
n++
|
||||
}
|
||||
if s.Func.Pcln.Pcfile != nil && s.Func.Pcln.Pcfile.Size != 0 {
|
||||
n++
|
||||
}
|
||||
if s.Func.Pcln.Pcline != nil && s.Func.Pcln.Pcline.Size != 0 {
|
||||
n++
|
||||
}
|
||||
if s.Func.Pcln.Pcinline != nil && s.Func.Pcln.Pcinline.Size != 0 {
|
||||
n++
|
||||
}
|
||||
n += len(s.Func.Pcln.Pcdata)
|
||||
}
|
||||
return n
|
||||
}
|
||||
|
|
@ -566,7 +599,17 @@ func nAuxSym(s *LSym) int {
|
|||
// generate symbols for FuncInfo.
|
||||
func genFuncInfoSyms(ctxt *Link) {
|
||||
infosyms := make([]*LSym, 0, len(ctxt.Text))
|
||||
var pcdataoff uint32
|
||||
hashedsyms := make([]*LSym, 0, 4*len(ctxt.Text))
|
||||
preparePcSym := func(s *LSym) *LSym {
|
||||
if s == nil {
|
||||
return s
|
||||
}
|
||||
s.PkgIdx = goobj.PkgIdxHashed
|
||||
s.SymIdx = int32(len(hashedsyms) + len(ctxt.hasheddefs))
|
||||
s.Set(AttrIndexed, true)
|
||||
hashedsyms = append(hashedsyms, s)
|
||||
return s
|
||||
}
|
||||
var b bytes.Buffer
|
||||
symidx := int32(len(ctxt.defs))
|
||||
for _, s := range ctxt.Text {
|
||||
|
|
@ -579,20 +622,14 @@ func genFuncInfoSyms(ctxt *Link) {
|
|||
FuncID: objabi.FuncID(s.Func.FuncID),
|
||||
}
|
||||
pc := &s.Func.Pcln
|
||||
o.Pcsp = pcdataoff
|
||||
pcdataoff += uint32(len(pc.Pcsp.P))
|
||||
o.Pcfile = pcdataoff
|
||||
pcdataoff += uint32(len(pc.Pcfile.P))
|
||||
o.Pcline = pcdataoff
|
||||
pcdataoff += uint32(len(pc.Pcline.P))
|
||||
o.Pcinline = pcdataoff
|
||||
pcdataoff += uint32(len(pc.Pcinline.P))
|
||||
o.Pcdata = make([]uint32, len(pc.Pcdata))
|
||||
for i, pcd := range pc.Pcdata {
|
||||
o.Pcdata[i] = pcdataoff
|
||||
pcdataoff += uint32(len(pcd.P))
|
||||
o.Pcsp = makeSymRef(preparePcSym(pc.Pcsp))
|
||||
o.Pcfile = makeSymRef(preparePcSym(pc.Pcfile))
|
||||
o.Pcline = makeSymRef(preparePcSym(pc.Pcline))
|
||||
o.Pcinline = makeSymRef(preparePcSym(pc.Pcinline))
|
||||
o.Pcdata = make([]goobj.SymRef, len(pc.Pcdata))
|
||||
for i, pcSym := range pc.Pcdata {
|
||||
o.Pcdata[i] = makeSymRef(preparePcSym(pcSym))
|
||||
}
|
||||
o.PcdataEnd = pcdataoff
|
||||
o.Funcdataoff = make([]uint32, len(pc.Funcdataoff))
|
||||
for i, x := range pc.Funcdataoff {
|
||||
o.Funcdataoff[i] = uint32(x)
|
||||
|
|
@ -642,9 +679,9 @@ func genFuncInfoSyms(ctxt *Link) {
|
|||
}
|
||||
}
|
||||
ctxt.defs = append(ctxt.defs, infosyms...)
|
||||
ctxt.hasheddefs = append(ctxt.hasheddefs, hashedsyms...)
|
||||
}
|
||||
|
||||
// debugDumpAux is a dumper for selected aux symbols.
|
||||
func writeAuxSymDebug(ctxt *Link, par *LSym, aux *LSym) {
|
||||
// Most aux symbols (ex: funcdata) are not interesting--
|
||||
// pick out just the DWARF ones for now.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue