Skip to content

Commit b0cbe15

Browse files
skohanimianlancetaylor
authored andcommitted
cmd/link: move function only lsym fields to pcln struct
name old secs new secs delta LinkCmdGo 0.53 ± 9% 0.53 ±10% -1.30% (p=0.022 n=100+99) name old MaxRSS new MaxRSS delta LinkCmdGo 151k ± 4% 142k ± 6% -5.92% (p=0.000 n=98+100) Change-Id: Ic30e63a948f8e626b3396f458a0163f7234810c1 Reviewed-on: https://go-review.googlesource.com/21920 Run-TryBot: Ian Lance Taylor <[email protected]> TryBot-Result: Gobot Gobot <[email protected]> Reviewed-by: Ian Lance Taylor <[email protected]>
1 parent a0ab6cd commit b0cbe15

File tree

6 files changed

+35
-16
lines changed

6 files changed

+35
-16
lines changed

src/cmd/link/internal/ld/deadcode.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -272,9 +272,12 @@ func (d *deadcodepass) flood() {
272272
if Debug['v'] > 1 {
273273
fmt.Fprintf(d.ctxt.Bso, "marktext %s\n", s.Name)
274274
}
275-
for _, a := range s.Autom {
276-
d.mark(a.Gotype, s)
275+
if s.Pcln != nil {
276+
for _, a := range s.Pcln.Autom {
277+
d.mark(a.Gotype, s)
278+
}
277279
}
280+
278281
}
279282

280283
if strings.HasPrefix(s.Name, "type.") && s.Name[5] != '.' {

src/cmd/link/internal/ld/dwarf.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1556,7 +1556,7 @@ func writelines(prev *LSym) *LSym {
15561556
dt, da int
15571557
offs int64
15581558
)
1559-
for _, a := range s.Autom {
1559+
for _, a := range s.Pcln.Autom {
15601560
switch a.Name {
15611561
case obj.A_AUTO:
15621562
dt = DW_ABRV_AUTO

src/cmd/link/internal/ld/lib.go

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1747,7 +1747,11 @@ func stkcheck(up *Chain, depth int) int {
17471747
return 0
17481748
}
17491749
// Raise limit to allow frame.
1750-
limit = int(obj.StackLimit+s.Locals) + int(Ctxt.FixedFrameSize())
1750+
locals := int32(0)
1751+
if s.Pcln != nil {
1752+
locals = s.Pcln.Locals
1753+
}
1754+
limit = int(obj.StackLimit+locals) + int(Ctxt.FixedFrameSize())
17511755
}
17521756

17531757
// Walk through sp adjustments in function, consuming relocs.
@@ -1978,10 +1982,17 @@ func genasmsym(put func(*LSym, string, int, int64, int64, int, *LSym)) {
19781982
for s := Ctxt.Textp; s != nil; s = s.Next {
19791983
put(s, s.Name, 'T', s.Value, s.Size, int(s.Version), s.Gotype)
19801984

1985+
locals := int32(0)
1986+
if s.Pcln != nil {
1987+
locals = s.Pcln.Locals
1988+
}
19811989
// NOTE(ality): acid can't produce a stack trace without .frame symbols
1982-
put(nil, ".frame", 'm', int64(s.Locals)+int64(SysArch.PtrSize), 0, 0, nil)
1990+
put(nil, ".frame", 'm', int64(locals)+int64(SysArch.PtrSize), 0, 0, nil)
19831991

1984-
for _, a := range s.Autom {
1992+
if s.Pcln == nil {
1993+
continue
1994+
}
1995+
for _, a := range s.Pcln.Autom {
19851996
// Emit a or p according to actual offset, even if label is wrong.
19861997
// This avoids negative offsets, which cannot be encoded.
19871998
if a.Name != obj.A_AUTO && a.Name != obj.A_PARAM {

src/cmd/link/internal/ld/link.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,6 @@ type LSym struct {
5050
Align int32
5151
Elfsym int32
5252
LocalElfsym int32
53-
Args int32
54-
Locals int32
5553
Value int64
5654
Size int64
5755
// ElfType is set for symbols read from shared libraries by ldshlibsyms. It
@@ -67,7 +65,6 @@ type LSym struct {
6765
Dynimplib string
6866
Dynimpvers string
6967
Sect *Section
70-
Autom []Auto
7168
Pcln *Pcln
7269
P []byte
7370
R []Reloc
@@ -221,6 +218,9 @@ type Library struct {
221218
}
222219

223220
type Pcln struct {
221+
Args int32
222+
Locals int32
223+
Autom []Auto
224224
Pcsp Pcdata
225225
Pcfile Pcdata
226226
Pcline Pcdata

src/cmd/link/internal/ld/objfile.go

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -331,8 +331,11 @@ overwrite:
331331
}
332332

333333
if s.Type == obj.STEXT {
334-
s.Args = r.readInt32()
335-
s.Locals = r.readInt32()
334+
s.Pcln = new(Pcln)
335+
pc := s.Pcln
336+
337+
pc.Args = r.readInt32()
338+
pc.Locals = r.readInt32()
336339
if r.readUint8() != 0 {
337340
s.Attr |= AttrNoSplit
338341
}
@@ -341,22 +344,20 @@ overwrite:
341344
s.Attr |= AttrReflectMethod
342345
}
343346
n := r.readInt()
344-
s.Autom = r.autom[:n:n]
347+
pc.Autom = r.autom[:n:n]
345348
if !isdup {
346349
r.autom = r.autom[n:]
347350
}
348351

349352
for i := 0; i < n; i++ {
350-
s.Autom[i] = Auto{
353+
pc.Autom[i] = Auto{
351354
Asym: r.readSymIndex(),
352355
Aoffset: r.readInt32(),
353356
Name: r.readInt16(),
354357
Gotype: r.readSymIndex(),
355358
}
356359
}
357360

358-
s.Pcln = new(Pcln)
359-
pc := s.Pcln
360361
pc.Pcsp.P = r.readData()
361362
pc.Pcfile.P = r.readData()
362363
pc.Pcline.P = r.readData()

src/cmd/link/internal/ld/pcln.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -293,7 +293,11 @@ func pclntab() {
293293

294294
// args int32
295295
// TODO: Move into funcinfo.
296-
off = int32(setuint32(Ctxt, ftab, int64(off), uint32(Ctxt.Cursym.Args)))
296+
args := uint32(0)
297+
if Ctxt.Cursym.Pcln != nil {
298+
args = uint32(Ctxt.Cursym.Pcln.Args)
299+
}
300+
off = int32(setuint32(Ctxt, ftab, int64(off), args))
297301

298302
// frame int32
299303
// This has been removed (it was never set quite correctly anyway).

0 commit comments

Comments
 (0)