From: Josh Bleecher Snyder Date: Mon, 15 Apr 2019 16:25:23 +0000 (-0700) Subject: cmd/link: clean up pclntab X-Git-Tag: go1.13beta1~698 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=d3a23874affca830033dee2a7a5a816bedebf55a;p=gostls13.git cmd/link: clean up pclntab More minor cleanup: * Code simplification * Move variable declaration closer to use * Add docs * Refactor loop Change-Id: I6f662cb65038b6ad927eb83757b241ac1ef58943 Reviewed-on: https://go-review.googlesource.com/c/go/+/172078 Run-TryBot: Josh Bleecher Snyder Reviewed-by: Brad Fitzpatrick TryBot-Result: Gobot Gobot --- diff --git a/src/cmd/link/internal/ld/pcln.go b/src/cmd/link/internal/ld/pcln.go index 9f253f0205..96b2028d10 100644 --- a/src/cmd/link/internal/ld/pcln.go +++ b/src/cmd/link/internal/ld/pcln.go @@ -201,7 +201,6 @@ func (ctxt *Link) pclntab() { // function table, alternating PC and offset to func struct [each entry thearch.ptrsize bytes] // end PC [thearch.ptrsize bytes] // offset to file table [4 bytes] - nfunc := int32(0) // Find container symbols and mark them as such. for _, s := range ctxt.Textp { @@ -210,9 +209,15 @@ func (ctxt *Link) pclntab() { } } + // Gather some basic stats and info. + var nfunc int32 for _, s := range ctxt.Textp { - if emitPcln(ctxt, s) { - nfunc++ + if !emitPcln(ctxt, s) { + continue + } + nfunc++ + if pclntabFirstFunc == nil { + pclntabFirstFunc = s } } @@ -234,10 +239,8 @@ func (ctxt *Link) pclntab() { return nameoff } - nfunc = 0 - var last *sym.Symbol + nfunc = 0 // repurpose nfunc as a running index for _, s := range ctxt.Textp { - last = s if !emitPcln(ctxt, s) { continue } @@ -246,10 +249,6 @@ func (ctxt *Link) pclntab() { pcln = &pclntabZpcln } - if pclntabFirstFunc == nil { - pclntabFirstFunc = s - } - if len(pcln.InlTree) > 0 { if len(pcln.Pcdata) <= objabi.PCDATA_InlTreeIndex { // Create inlining pcdata table. @@ -270,7 +269,7 @@ func (ctxt *Link) pclntab() { } funcstart := int32(len(ftab.P)) - funcstart += int32(-len(ftab.P)) & (int32(ctxt.Arch.PtrSize) - 1) + funcstart += int32(-len(ftab.P)) & (int32(ctxt.Arch.PtrSize) - 1) // align to ptrsize ftab.SetAddr(ctxt.Arch, 8+int64(ctxt.Arch.PtrSize)+int64(nfunc)*2*int64(ctxt.Arch.PtrSize), s) ftab.SetUint(ctxt.Arch, 8+int64(ctxt.Arch.PtrSize)+int64(nfunc)*2*int64(ctxt.Arch.PtrSize)+int64(ctxt.Arch.PtrSize), uint64(funcstart)) @@ -402,16 +401,15 @@ func (ctxt *Link) pclntab() { off += 4 } for i := range pcln.Funcdata { + dataoff := int64(off) + int64(ctxt.Arch.PtrSize)*int64(i) if pcln.Funcdata[i] == nil { - ftab.SetUint(ctxt.Arch, int64(off)+int64(ctxt.Arch.PtrSize)*int64(i), uint64(pcln.Funcdataoff[i])) - } else { - // TODO: Dedup. - funcdataBytes += pcln.Funcdata[i].Size - - ftab.SetAddrPlus(ctxt.Arch, int64(off)+int64(ctxt.Arch.PtrSize)*int64(i), pcln.Funcdata[i], pcln.Funcdataoff[i]) + ftab.SetUint(ctxt.Arch, dataoff, uint64(pcln.Funcdataoff[i])) + continue } + // TODO: Dedup. + funcdataBytes += pcln.Funcdata[i].Size + ftab.SetAddrPlus(ctxt.Arch, dataoff, pcln.Funcdata[i], pcln.Funcdataoff[i]) } - off += int32(len(pcln.Funcdata)) * int32(ctxt.Arch.PtrSize) } @@ -423,6 +421,7 @@ func (ctxt *Link) pclntab() { nfunc++ } + last := ctxt.Textp[len(ctxt.Textp)-1] pclntabLastFunc = last // Final entry of table is just end pc. ftab.SetAddrPlus(ctxt.Arch, 8+int64(ctxt.Arch.PtrSize)+int64(nfunc)*2*int64(ctxt.Arch.PtrSize), last, last.Size)