Skip to content

Commit 09df9b0

Browse files
committed
cmd/link: split out Extname into cold portion of sym.Symbol
Create a new "AuxSymbol" struct into which 'cold' or 'infrequently set' symbol fields are located. Move the Extname field from the main Symbol struct to AuxSymbol. Updates #26186 Change-Id: I9e795fb0cc48f978e2818475fa073ed9f2db202d Reviewed-on: https://go-review.googlesource.com/125476 Reviewed-by: Ian Lance Taylor <[email protected]> Run-TryBot: Ian Lance Taylor <[email protected]> TryBot-Result: Gobot Gobot <[email protected]>
1 parent 289dce2 commit 09df9b0

File tree

8 files changed

+70
-44
lines changed

8 files changed

+70
-44
lines changed

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

+3-3
Original file line numberDiff line numberDiff line change
@@ -1034,7 +1034,7 @@ func elfdynhash(ctxt *Link) {
10341034
need[sy.Dynid] = addelflib(&needlib, sy.Dynimplib(), sy.Dynimpvers())
10351035
}
10361036

1037-
name := sy.Extname
1037+
name := sy.Extname()
10381038
hc := elfhash(name)
10391039

10401040
b := hc % uint32(nbucket)
@@ -2254,7 +2254,7 @@ func elfadddynsym(ctxt *Link, s *sym.Symbol) {
22542254

22552255
d := ctxt.Syms.Lookup(".dynsym", 0)
22562256

2257-
name := s.Extname
2257+
name := s.Extname()
22582258
d.AddUint32(ctxt.Arch, uint32(Addstring(ctxt.Syms.Lookup(".dynstr", 0), name)))
22592259

22602260
/* type */
@@ -2297,7 +2297,7 @@ func elfadddynsym(ctxt *Link, s *sym.Symbol) {
22972297
d := ctxt.Syms.Lookup(".dynsym", 0)
22982298

22992299
/* name */
2300-
name := s.Extname
2300+
name := s.Extname()
23012301

23022302
d.AddUint32(ctxt.Arch, uint32(Addstring(ctxt.Syms.Lookup(".dynstr", 0), name)))
23032303

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

+6-6
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ func loadcgo(ctxt *Link, file string, pkg string, p string) {
156156
s := ctxt.Syms.Lookup(local, 0)
157157
if s.Type == 0 || s.Type == sym.SXREF || s.Type == sym.SHOSTOBJ {
158158
s.SetDynimplib(lib)
159-
s.Extname = remote
159+
s.SetExtname(remote)
160160
s.SetDynimpvers(q)
161161
if s.Type != sym.SHOSTOBJ {
162162
s.Type = sym.SDYNIMPORT
@@ -200,15 +200,15 @@ func loadcgo(ctxt *Link, file string, pkg string, p string) {
200200
// see issue 4878.
201201
if s.Dynimplib() != "" {
202202
s.ResetDyninfo()
203-
s.Extname = ""
203+
s.SetExtname("")
204204
s.Type = 0
205205
}
206206

207207
if !s.Attr.CgoExport() {
208-
s.Extname = remote
208+
s.SetExtname(remote)
209209
dynexp = append(dynexp, s)
210-
} else if s.Extname != remote {
211-
fmt.Fprintf(os.Stderr, "%s: conflicting cgo_export directives: %s as %s and %s\n", os.Args[0], s.Name, s.Extname, remote)
210+
} else if s.Extname() != remote {
211+
fmt.Fprintf(os.Stderr, "%s: conflicting cgo_export directives: %s as %s and %s\n", os.Args[0], s.Name, s.Extname(), remote)
212212
nerrors++
213213
return
214214
}
@@ -276,7 +276,7 @@ func Adddynsym(ctxt *Link, s *sym.Symbol) {
276276
if ctxt.IsELF {
277277
elfadddynsym(ctxt, s)
278278
} else if ctxt.HeadType == objabi.Hdarwin {
279-
Errorf(s, "adddynsym: missed symbol (Extname=%s)", s.Extname)
279+
Errorf(s, "adddynsym: missed symbol (Extname=%s)", s.Extname())
280280
} else if ctxt.HeadType == objabi.Hwindows {
281281
// already taken care of
282282
} else {

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -435,7 +435,7 @@ func (ctxt *Link) loadlib() {
435435
// cgo_import_static and cgo_import_dynamic,
436436
// then we want to make it cgo_import_dynamic
437437
// now.
438-
if s.Extname != "" && s.Dynimplib() != "" && !s.Attr.CgoExport() {
438+
if s.Extname() != "" && s.Dynimplib() != "" && !s.Attr.CgoExport() {
439439
s.Type = sym.SDYNIMPORT
440440
} else {
441441
s.Type = 0
@@ -2116,7 +2116,7 @@ func genasmsym(ctxt *Link, put func(*Link, *sym.Symbol, string, SymbolType, int6
21162116
if !s.Attr.Reachable() {
21172117
continue
21182118
}
2119-
put(ctxt, s, s.Extname, UndefinedSym, 0, nil)
2119+
put(ctxt, s, s.Extname(), UndefinedSym, 0, nil)
21202120

21212121
case sym.STLSBSS:
21222122
if ctxt.LinkMode == LinkExternal {

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

+4-4
Original file line numberDiff line numberDiff line change
@@ -724,7 +724,7 @@ func (x machoscmp) Less(i, j int) bool {
724724
return k1 < k2
725725
}
726726

727-
return s1.Extname < s2.Extname
727+
return s1.Extname() < s2.Extname()
728728
}
729729

730730
func machogenasmsym(ctxt *Link) {
@@ -763,7 +763,7 @@ func machoShouldExport(ctxt *Link, s *sym.Symbol) bool {
763763
if !ctxt.DynlinkingGo() || s.Attr.Local() {
764764
return false
765765
}
766-
if ctxt.BuildMode == BuildModePlugin && strings.HasPrefix(s.Extname, objabi.PathToPrefix(*flagPluginPath)) {
766+
if ctxt.BuildMode == BuildModePlugin && strings.HasPrefix(s.Extname(), objabi.PathToPrefix(*flagPluginPath)) {
767767
return true
768768
}
769769
if strings.HasPrefix(s.Name, "go.itab.") {
@@ -798,13 +798,13 @@ func machosymtab(ctxt *Link) {
798798
// symbols like crosscall2 are in pclntab and end up
799799
// pointing at the host binary, breaking unwinding.
800800
// See Issue #18190.
801-
cexport := !strings.Contains(s.Extname, ".") && (ctxt.BuildMode != BuildModePlugin || onlycsymbol(s))
801+
cexport := !strings.Contains(s.Extname(), ".") && (ctxt.BuildMode != BuildModePlugin || onlycsymbol(s))
802802
if cexport || export {
803803
symstr.AddUint8('_')
804804
}
805805

806806
// replace "·" as ".", because DTrace cannot handle it.
807-
Addstring(symstr, strings.Replace(s.Extname, "·", ".", -1))
807+
Addstring(symstr, strings.Replace(s.Extname(), "·", ".", -1))
808808

809809
if s.Type == sym.SDYNIMPORT || s.Type == sym.SHOSTOBJ {
810810
symtab.AddUint8(0x01) // type N_EXT, external symbol

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

+10-9
Original file line numberDiff line numberDiff line change
@@ -1040,14 +1040,15 @@ func initdynimport(ctxt *Link) *Dll {
10401040
// of uinptrs this function consumes. Store the argsize and discard
10411041
// the %n suffix if any.
10421042
m.argsize = -1
1043-
if i := strings.IndexByte(s.Extname, '%'); i >= 0 {
1043+
extName := s.Extname()
1044+
if i := strings.IndexByte(extName, '%'); i >= 0 {
10441045
var err error
1045-
m.argsize, err = strconv.Atoi(s.Extname[i+1:])
1046+
m.argsize, err = strconv.Atoi(extName[i+1:])
10461047
if err != nil {
10471048
Errorf(s, "failed to parse stdcall decoration: %v", err)
10481049
}
10491050
m.argsize *= ctxt.Arch.PtrSize
1050-
s.Extname = s.Extname[:i]
1051+
s.SetExtname(extName[:i])
10511052
}
10521053

10531054
m.s = s
@@ -1061,7 +1062,7 @@ func initdynimport(ctxt *Link) *Dll {
10611062
for m = d.ms; m != nil; m = m.next {
10621063
m.s.Type = sym.SDATA
10631064
m.s.Grow(int64(ctxt.Arch.PtrSize))
1064-
dynName := m.s.Extname
1065+
dynName := m.s.Extname()
10651066
// only windows/386 requires stdcall decoration
10661067
if ctxt.Arch.Family == sys.I386 && m.argsize >= 0 {
10671068
dynName += fmt.Sprintf("@%d", m.argsize)
@@ -1132,7 +1133,7 @@ func addimports(ctxt *Link, datsect *peSection) {
11321133
for m := d.ms; m != nil; m = m.next {
11331134
m.off = uint64(pefile.nextSectOffset) + uint64(ctxt.Out.Offset()) - uint64(startoff)
11341135
ctxt.Out.Write16(0) // hint
1135-
strput(ctxt.Out, m.s.Extname)
1136+
strput(ctxt.Out, m.s.Extname())
11361137
}
11371138
}
11381139

@@ -1217,7 +1218,7 @@ type byExtname []*sym.Symbol
12171218

12181219
func (s byExtname) Len() int { return len(s) }
12191220
func (s byExtname) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
1220-
func (s byExtname) Less(i, j int) bool { return s[i].Extname < s[j].Extname }
1221+
func (s byExtname) Less(i, j int) bool { return s[i].Extname() < s[j].Extname() }
12211222

12221223
func initdynexport(ctxt *Link) {
12231224
nexport = 0
@@ -1242,7 +1243,7 @@ func addexports(ctxt *Link) {
12421243

12431244
size := binary.Size(&e) + 10*nexport + len(*flagOutfile) + 1
12441245
for i := 0; i < nexport; i++ {
1245-
size += len(dexport[i].Extname) + 1
1246+
size += len(dexport[i].Extname()) + 1
12461247
}
12471248

12481249
if nexport == 0 {
@@ -1286,7 +1287,7 @@ func addexports(ctxt *Link) {
12861287

12871288
for i := 0; i < nexport; i++ {
12881289
out.Write32(uint32(v))
1289-
v += len(dexport[i].Extname) + 1
1290+
v += len(dexport[i].Extname()) + 1
12901291
}
12911292

12921293
// put EXPORT Ordinal Table
@@ -1298,7 +1299,7 @@ func addexports(ctxt *Link) {
12981299
out.WriteStringN(*flagOutfile, len(*flagOutfile)+1)
12991300

13001301
for i := 0; i < nexport; i++ {
1301-
out.WriteStringN(dexport[i].Extname, len(dexport[i].Extname)+1)
1302+
out.WriteStringN(dexport[i].Extname(), len(dexport[i].Extname())+1)
13021303
}
13031304
sect.pad(out, uint32(size))
13041305
}

src/cmd/link/internal/sym/sizeof_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ func TestSizeof(t *testing.T) {
2323
_32bit uintptr // size on 32bit platforms
2424
_64bit uintptr // size on 64bit platforms
2525
}{
26-
{Symbol{}, 132, 216},
26+
{Symbol{}, 124, 200},
2727
}
2828

2929
for _, tt := range tests {

src/cmd/link/internal/sym/symbol.go

+41-16
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ import (
1515
// Symbol is an entry in the symbol table.
1616
type Symbol struct {
1717
Name string
18-
Extname string
1918
Type SymKind
2019
Version int16
2120
Attr Attribute
@@ -36,7 +35,7 @@ type Symbol struct {
3635
Outer *Symbol
3736
Gotype *Symbol
3837
File string
39-
dyninfo *dynimp
38+
auxinfo *AuxSymbol
4039
Sect *Section
4140
FuncInfo *FuncInfo
4241
Lib *Library // Package defining this symbol
@@ -45,7 +44,9 @@ type Symbol struct {
4544
R []Reloc
4645
}
4746

48-
type dynimp struct {
47+
// AuxSymbol contains less-frequently used sym.Symbol fields.
48+
type AuxSymbol struct {
49+
extname string
4950
dynimplib string
5051
dynimpvers string
5152
}
@@ -268,38 +269,62 @@ func (s *Symbol) setUintXX(arch *sys.Arch, off int64, v uint64, wid int64) int64
268269
return off + wid
269270
}
270271

272+
func (s *Symbol) makeAuxInfo() {
273+
if s.auxinfo == nil {
274+
s.auxinfo = &AuxSymbol{extname: s.Name}
275+
}
276+
}
277+
278+
func (s *Symbol) Extname() string {
279+
if s.auxinfo == nil {
280+
return s.Name
281+
}
282+
return s.auxinfo.extname
283+
}
284+
285+
func (s *Symbol) SetExtname(n string) {
286+
if s.auxinfo == nil {
287+
if s.Name == n {
288+
return
289+
}
290+
s.makeAuxInfo()
291+
}
292+
s.auxinfo.extname = n
293+
}
294+
271295
func (s *Symbol) Dynimplib() string {
272-
if s.dyninfo == nil {
296+
if s.auxinfo == nil {
273297
return ""
274298
}
275-
return s.dyninfo.dynimplib
299+
return s.auxinfo.dynimplib
276300
}
277301

278302
func (s *Symbol) Dynimpvers() string {
279-
if s.dyninfo == nil {
303+
if s.auxinfo == nil {
280304
return ""
281305
}
282-
return s.dyninfo.dynimpvers
306+
return s.auxinfo.dynimpvers
283307
}
284308

285309
func (s *Symbol) SetDynimplib(lib string) {
286-
if s.dyninfo == nil {
287-
s.dyninfo = &dynimp{dynimplib: lib}
288-
} else {
289-
s.dyninfo.dynimplib = lib
310+
if s.auxinfo == nil {
311+
s.makeAuxInfo()
290312
}
313+
s.auxinfo.dynimplib = lib
291314
}
292315

293316
func (s *Symbol) SetDynimpvers(vers string) {
294-
if s.dyninfo == nil {
295-
s.dyninfo = &dynimp{dynimpvers: vers}
296-
} else {
297-
s.dyninfo.dynimpvers = vers
317+
if s.auxinfo == nil {
318+
s.makeAuxInfo()
298319
}
320+
s.auxinfo.dynimpvers = vers
299321
}
300322

301323
func (s *Symbol) ResetDyninfo() {
302-
s.dyninfo = nil
324+
if s.auxinfo != nil {
325+
s.auxinfo.dynimplib = ""
326+
s.auxinfo.dynimpvers = ""
327+
}
303328
}
304329

305330
// SortSub sorts a linked-list (by Sub) of *Symbol by Value.

src/cmd/link/internal/sym/symbols.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,6 @@ func (syms *Symbols) Lookup(name string, v int) *Symbol {
7777
return s
7878
}
7979
s = syms.Newsym(name, v)
80-
s.Extname = s.Name
8180
m[name] = s
8281
return s
8382
}
@@ -97,9 +96,10 @@ func (syms *Symbols) IncVersion() int {
9796
// Rename renames a symbol.
9897
func (syms *Symbols) Rename(old, new string, v int, reachparent map[*Symbol]*Symbol) {
9998
s := syms.hash[v][old]
99+
oldExtName := s.Extname()
100100
s.Name = new
101-
if s.Extname == old {
102-
s.Extname = new
101+
if oldExtName == old {
102+
s.SetExtname(new)
103103
}
104104
delete(syms.hash[v], old)
105105

0 commit comments

Comments
 (0)