mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
[dev.link] cmd/link/internal/loader: remove Propagate* shim functions
Remove the loader's PropagateSymbolChangesBackToLoader and PropagateLoaderChangesToSymbols shim functions. These were used at one point to enable conversion of phases in the linker that were "downstream" of loadlibfull -- given the current wavefront position there's not much point keeping them around. Change-Id: I3f01f25b70b1b80240369c8f3a10dca89931610f Reviewed-on: https://go-review.googlesource.com/c/go/+/233817 Run-TryBot: Than McIntosh <thanm@google.com> Reviewed-by: Cherry Zhang <cherryyz@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org>
This commit is contained in:
parent
1024cabc48
commit
d72ea427c6
1 changed files with 0 additions and 139 deletions
|
|
@ -2245,145 +2245,6 @@ func (l *Loader) ResolveABIAlias(s Sym) Sym {
|
||||||
return target
|
return target
|
||||||
}
|
}
|
||||||
|
|
||||||
// PropagateSymbolChangesBackToLoader is a temporary shim function
|
|
||||||
// that copies over a given sym.Symbol into the equivalent representation
|
|
||||||
// in the loader world. The intent is to enable converting a given
|
|
||||||
// linker phase/pass from dealing with sym.Symbol's to a modernized
|
|
||||||
// pass that works with loader.Sym, in cases where the "loader.Sym
|
|
||||||
// wavefront" has not yet reached the pass in question. For such work
|
|
||||||
// the recipe is to first call PropagateSymbolChangesBackToLoader(),
|
|
||||||
// then exexute the pass working with the loader, then call
|
|
||||||
// PropagateLoaderChangesToSymbols to copy the changes made by the
|
|
||||||
// pass back to the sym.Symbol world.
|
|
||||||
func (l *Loader) PropagateSymbolChangesBackToLoader() {
|
|
||||||
|
|
||||||
// For the moment we only copy symbol values, and we don't touch
|
|
||||||
// any new sym.Symbols created since loadlibfull() was run. This
|
|
||||||
// seems to be what's needed for DWARF gen.
|
|
||||||
for i := Sym(1); i < Sym(len(l.objSyms)); i++ {
|
|
||||||
s := l.Syms[i]
|
|
||||||
if s != nil {
|
|
||||||
if s.Value != l.SymValue(i) {
|
|
||||||
l.SetSymValue(i, s.Value)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// PropagateLoaderChangesToSymbols is a temporary shim function that
|
|
||||||
// takes a list of loader.Sym symbols and works to copy their contents
|
|
||||||
// and attributes over to a corresponding sym.Symbol. The parameter
|
|
||||||
// anonVerReplacement specifies a version number for any new anonymous
|
|
||||||
// symbols encountered on the list, when creating sym.Symbols for them
|
|
||||||
// (or zero if we don't expect to encounter any new anon symbols). See
|
|
||||||
// the PropagateSymbolChangesBackToLoader header comment for more
|
|
||||||
// info.
|
|
||||||
//
|
|
||||||
// WARNING: this function is brittle and depends heavily on loader
|
|
||||||
// implementation. A key problem with doing this is that as things
|
|
||||||
// stand at the moment, some sym.Symbol contents/attributes are
|
|
||||||
// populated only when converting from loader.Sym to sym.Symbol in
|
|
||||||
// loadlibfull, meaning we may wipe out some information when copying
|
|
||||||
// back.
|
|
||||||
|
|
||||||
func (l *Loader) PropagateLoaderChangesToSymbols(toconvert []Sym, anonVerReplacement int) []*sym.Symbol {
|
|
||||||
|
|
||||||
result := []*sym.Symbol{}
|
|
||||||
relocfixup := []Sym{}
|
|
||||||
|
|
||||||
// Note: this loop needs to allow for the possibility that we may
|
|
||||||
// see "new" symbols on the 'toconvert' list that come from object
|
|
||||||
// files (for example, DWARF location lists), as opposed to just
|
|
||||||
// newly manufactured symbols (ex: DWARF section symbols such as
|
|
||||||
// ".debug_info"). This means that we have to be careful not to
|
|
||||||
// stomp on sym.Symbol attributes/content that was set up in
|
|
||||||
// in loadlibfull().
|
|
||||||
|
|
||||||
// Also note that in order for the relocation fixup to work, we
|
|
||||||
// have to do this in two passes -- one pass to create the symbols,
|
|
||||||
// and then a second fix up the relocations once all necessary
|
|
||||||
// sym.Symbols are created.
|
|
||||||
|
|
||||||
// First pass, symbol creation and symbol data fixup.
|
|
||||||
for _, cand := range toconvert {
|
|
||||||
|
|
||||||
sn := l.SymName(cand)
|
|
||||||
sv := l.SymVersion(cand)
|
|
||||||
st := l.SymType(cand)
|
|
||||||
if sv < 0 {
|
|
||||||
if anonVerReplacement == 0 {
|
|
||||||
panic("expected valid anon version replacement")
|
|
||||||
}
|
|
||||||
sv = anonVerReplacement
|
|
||||||
}
|
|
||||||
|
|
||||||
s := l.Syms[cand]
|
|
||||||
|
|
||||||
isnew := false
|
|
||||||
if sn == "" {
|
|
||||||
// Don't install anonymous symbols in the lookup tab.
|
|
||||||
if s == nil {
|
|
||||||
s = l.allocSym(sn, sv)
|
|
||||||
l.installSym(cand, s)
|
|
||||||
}
|
|
||||||
isnew = true
|
|
||||||
} else {
|
|
||||||
if s != nil {
|
|
||||||
// Already have a symbol for this -- it must be
|
|
||||||
// something that was previously processed by
|
|
||||||
// loadObjFull. Note that the symbol in question may
|
|
||||||
// or may not be in the name lookup map.
|
|
||||||
} else {
|
|
||||||
isnew = true
|
|
||||||
s = l.SymLookup(sn, sv)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
result = append(result, s)
|
|
||||||
|
|
||||||
// Always copy these from new to old.
|
|
||||||
s.Value = l.SymValue(cand)
|
|
||||||
s.Type = st
|
|
||||||
|
|
||||||
// If the data for a symbol has increased in size, make sure
|
|
||||||
// we bring the new content across.
|
|
||||||
relfix := isnew
|
|
||||||
if isnew || len(l.Data(cand)) > len(s.P) {
|
|
||||||
s.P = l.Data(cand)
|
|
||||||
s.Size = int64(len(s.P))
|
|
||||||
relfix = true
|
|
||||||
}
|
|
||||||
|
|
||||||
// For 'new' symbols, copy other content.
|
|
||||||
if relfix {
|
|
||||||
relocfixup = append(relocfixup, cand)
|
|
||||||
}
|
|
||||||
|
|
||||||
// If new symbol, call a helper to migrate attributes.
|
|
||||||
// Otherwise touch only not-in-symbol-table, since there are
|
|
||||||
// some attrs that are only set up at the point where we
|
|
||||||
// convert loader.Sym to sym.Symbol.
|
|
||||||
if isnew {
|
|
||||||
l.migrateAttributes(cand, s)
|
|
||||||
} else {
|
|
||||||
if l.AttrNotInSymbolTable(cand) {
|
|
||||||
s.Attr.Set(sym.AttrNotInSymbolTable, true)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Second pass to fix up relocations.
|
|
||||||
for _, cand := range relocfixup {
|
|
||||||
s := l.Syms[cand]
|
|
||||||
relocs := l.Relocs(cand)
|
|
||||||
if len(s.R) != relocs.Count() {
|
|
||||||
s.R = make([]sym.Reloc, relocs.Count())
|
|
||||||
}
|
|
||||||
l.convertRelocations(cand, &relocs, s, true)
|
|
||||||
}
|
|
||||||
|
|
||||||
return result
|
|
||||||
}
|
|
||||||
|
|
||||||
// ExtractSymbols grabs the symbols out of the loader for work that hasn't been
|
// ExtractSymbols grabs the symbols out of the loader for work that hasn't been
|
||||||
// ported to the new symbol type.
|
// ported to the new symbol type.
|
||||||
func (l *Loader) ExtractSymbols(syms *sym.Symbols) {
|
func (l *Loader) ExtractSymbols(syms *sym.Symbols) {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue