diff options
| author | Cherry Mui <cherryyz@google.com> | 2021-09-21 14:35:37 -0400 |
|---|---|---|
| committer | Cherry Mui <cherryyz@google.com> | 2021-09-22 13:50:24 +0000 |
| commit | 98989f2a74aa53e9ea64c41c94e66f02beceecc9 (patch) | |
| tree | 3d8aadfd4fbf72c9eee6185a9524a4f4dd0a4935 /src/cmd/link/internal/ld | |
| parent | e925c4640d52587e6657bccc40899888b657e6df (diff) | |
| download | go-98989f2a74aa53e9ea64c41c94e66f02beceecc9.tar.xz | |
cmd/compile, cmd/link: avoid ABI aliases
In the past we introduced ABI aliases, in preparation for ABI
wrappers. Now that we have ABI wrappers implemented, we don't
need ABI aliases. If ABI wrappers are not enabled, ABI0 and
ABIInternal are actually identical, so we can resolve symbol
references without distinguish them. This CL does so by
normalizing ABIInternal to ABI0 at link time. This way, we no
longer need to generate ABI aliases.
This CL doesn't clean up everything related to ABI aliases, which
will be done in followup CLs.
Change-Id: I5b5db43370d29b8ad153078c70a853e3263ae6f7
Reviewed-on: https://go-review.googlesource.com/c/go/+/351271
Trust: Cherry Mui <cherryyz@google.com>
Run-TryBot: Cherry Mui <cherryyz@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Than McIntosh <thanm@google.com>
Diffstat (limited to 'src/cmd/link/internal/ld')
| -rw-r--r-- | src/cmd/link/internal/ld/deadcode.go | 10 | ||||
| -rw-r--r-- | src/cmd/link/internal/ld/lib.go | 27 | ||||
| -rw-r--r-- | src/cmd/link/internal/ld/macho.go | 3 | ||||
| -rw-r--r-- | src/cmd/link/internal/ld/main.go | 4 | ||||
| -rw-r--r-- | src/cmd/link/internal/ld/pcln.go | 2 |
5 files changed, 19 insertions, 27 deletions
diff --git a/src/cmd/link/internal/ld/deadcode.go b/src/cmd/link/internal/ld/deadcode.go index dd5dafc21b..0221024d56 100644 --- a/src/cmd/link/internal/ld/deadcode.go +++ b/src/cmd/link/internal/ld/deadcode.go @@ -96,8 +96,10 @@ func (d *deadcodePass) init() { for _, name := range names { // Mark symbol as a data/ABI0 symbol. d.mark(d.ldr.Lookup(name, 0), 0) - // Also mark any Go functions (internal ABI). - d.mark(d.ldr.Lookup(name, sym.SymVerABIInternal), 0) + if abiInternalVer != 0 { + // Also mark any Go functions (internal ABI). + d.mark(d.ldr.Lookup(name, abiInternalVer), 0) + } } // All dynamic exports are roots. @@ -327,8 +329,8 @@ func deadcode(ctxt *Link) { d.init() d.flood() - methSym := ldr.Lookup("reflect.Value.Method", sym.SymVerABIInternal) - methByNameSym := ldr.Lookup("reflect.Value.MethodByName", sym.SymVerABIInternal) + methSym := ldr.Lookup("reflect.Value.Method", abiInternalVer) + methByNameSym := ldr.Lookup("reflect.Value.MethodByName", abiInternalVer) if ctxt.DynlinkingGo() { // Exported methods may satisfy interfaces we don't know diff --git a/src/cmd/link/internal/ld/lib.go b/src/cmd/link/internal/ld/lib.go index cf70374b16..f46d1f0221 100644 --- a/src/cmd/link/internal/ld/lib.go +++ b/src/cmd/link/internal/ld/lib.go @@ -144,7 +144,7 @@ func (ctxt *Link) setArchSyms() { ctxt.mkArchSym(".dynamic", 0, &ctxt.Dynamic) ctxt.mkArchSym(".dynsym", 0, &ctxt.DynSym) ctxt.mkArchSym(".dynstr", 0, &ctxt.DynStr) - ctxt.mkArchSym("runtime.unreachableMethod", sym.SymVerABIInternal, &ctxt.unreachableMethod) + ctxt.mkArchSym("runtime.unreachableMethod", abiInternalVer, &ctxt.unreachableMethod) if ctxt.IsPPC64() { ctxt.mkArchSym("TOC", 0, &ctxt.TOC) @@ -281,6 +281,10 @@ const ( MINFUNC = 16 // minimum size for a function ) +// Symbol version of ABIInternal symbols. It is sym.SymVerABIInternal if ABI wrappers +// are used, 0 otherwise. +var abiInternalVer = sym.SymVerABIInternal + // DynlinkingGo reports whether we are producing Go code that can live // in separate shared libraries linked together at runtime. func (ctxt *Link) DynlinkingGo() bool { @@ -500,10 +504,6 @@ func (ctxt *Link) loadlib() { default: log.Fatalf("invalid -strictdups flag value %d", *FlagStrictDups) } - if !buildcfg.Experiment.RegabiWrappers { - // Use ABI aliases if ABI wrappers are not used. - flags |= loader.FlagUseABIAlias - } elfsetstring1 := func(str string, off int) { elfsetstring(ctxt, 0, str, off) } ctxt.loader = loader.NewLoader(flags, elfsetstring1, &ctxt.ErrorReporter.ErrorReporter) ctxt.ErrorReporter.SymName = func(s loader.Sym) string { @@ -769,7 +769,7 @@ func (ctxt *Link) linksetup() { // Set runtime.disableMemoryProfiling bool if // runtime.MemProfile is not retained in the binary after // deadcode (and we're not dynamically linking). - memProfile := ctxt.loader.Lookup("runtime.MemProfile", sym.SymVerABIInternal) + memProfile := ctxt.loader.Lookup("runtime.MemProfile", abiInternalVer) if memProfile != 0 && !ctxt.loader.AttrReachable(memProfile) && !ctxt.DynlinkingGo() { memProfSym := ctxt.loader.LookupOrCreateSym("runtime.disableMemoryProfiling", 0) sb := ctxt.loader.MakeSymbolUpdater(memProfSym) @@ -2115,7 +2115,7 @@ func ldshlibsyms(ctxt *Link, shlib string) { ver := 0 symname := elfsym.Name // (unmangled) symbol name if elf.ST_TYPE(elfsym.Info) == elf.STT_FUNC && strings.HasPrefix(elfsym.Name, "type.") { - ver = sym.SymVerABIInternal + ver = abiInternalVer } else if buildcfg.Experiment.RegabiWrappers && elf.ST_TYPE(elfsym.Info) == elf.STT_FUNC { // Demangle the ABI name. Keep in sync with symtab.go:mangleABIName. if strings.HasSuffix(elfsym.Name, ".abiinternal") { @@ -2156,19 +2156,6 @@ func ldshlibsyms(ctxt *Link, shlib string) { if symname != elfsym.Name { l.SetSymExtname(s, elfsym.Name) } - - // For function symbols, if ABI wrappers are not used, we don't - // know what ABI is available, so alias it under both ABIs. - if !buildcfg.Experiment.RegabiWrappers && elf.ST_TYPE(elfsym.Info) == elf.STT_FUNC && ver == 0 { - alias := ctxt.loader.LookupOrCreateSym(symname, sym.SymVerABIInternal) - if l.SymType(alias) != 0 { - continue - } - su := l.MakeSymbolUpdater(alias) - su.SetType(sym.SABIALIAS) - r, _ := su.AddRel(0) // type doesn't matter - r.SetSym(s) - } } ctxt.Shlibs = append(ctxt.Shlibs, Shlib{Path: libpath, Hash: hash, Deps: deps, File: f}) } diff --git a/src/cmd/link/internal/ld/macho.go b/src/cmd/link/internal/ld/macho.go index 45a3971c33..a577a5308d 100644 --- a/src/cmd/link/internal/ld/macho.go +++ b/src/cmd/link/internal/ld/macho.go @@ -7,7 +7,6 @@ package ld import ( "bytes" "cmd/internal/codesign" - "cmd/internal/obj" "cmd/internal/objabi" "cmd/internal/sys" "cmd/link/internal/loader" @@ -561,7 +560,7 @@ func (ctxt *Link) domacho() { ver := 0 // _cgo_panic is a Go function, so it uses ABIInternal. if name == "_cgo_panic" { - ver = sym.ABIToVersion(obj.ABIInternal) + ver = abiInternalVer } s := ctxt.loader.Lookup(name, ver) if s != 0 { diff --git a/src/cmd/link/internal/ld/main.go b/src/cmd/link/internal/ld/main.go index 33b03b5024..4d3b8b904c 100644 --- a/src/cmd/link/internal/ld/main.go +++ b/src/cmd/link/internal/ld/main.go @@ -173,6 +173,10 @@ func Main(arch *sys.Arch, theArch Arch) { checkStrictDups = *FlagStrictDups + if !buildcfg.Experiment.RegabiWrappers { + abiInternalVer = 0 + } + startProfile() if ctxt.BuildMode == BuildModeUnset { ctxt.BuildMode.Set("exe") diff --git a/src/cmd/link/internal/ld/pcln.go b/src/cmd/link/internal/ld/pcln.go index 5294da5724..3abbf05c54 100644 --- a/src/cmd/link/internal/ld/pcln.go +++ b/src/cmd/link/internal/ld/pcln.go @@ -739,7 +739,7 @@ func (state *pclntab) writeFuncData(ctxt *Link, sb *loader.SymbolBuilder, funcs // writeFuncs writes the func structures and pcdata to runtime.functab. func writeFuncs(ctxt *Link, sb *loader.SymbolBuilder, funcs []loader.Sym, inlSyms map[loader.Sym]loader.Sym, startLocations, cuOffsets []uint32, nameOffsets map[loader.Sym]uint32) { ldr := ctxt.loader - deferReturnSym := ldr.Lookup("runtime.deferreturn", sym.SymVerABIInternal) + deferReturnSym := ldr.Lookup("runtime.deferreturn", abiInternalVer) funcdata, funcdataoff := []loader.Sym{}, []int64{} // Write the individual func objects. |
