[dev.link] cmd/link: convert second phase of DWARF-gen to use loader

This converts the second portion of DWARF-gen (dwarfGenerateDebugSyms
function and friends) to use the loader, as opposed to sym.Symbols.

Second phase is invoked as part of dodata(), which is fairly far along
in the linker, meaning that the "converted to loader.Symbol" wavefront
has not yet reached that point.

To account for this, the patch contains some shim code that runs
initially to copy back things from sym.Symbols into the loader
(notable symbol values), and then a second hook to be code after
dwarf-gen is complete to that copies the results back into the
appropriate sym.Symbols. This code is obviously temporary, but needed
for the time being.

Change-Id: I9b830b08b16480a1a5230cb52b592db1c550af18
Reviewed-on: https://go-review.googlesource.com/c/go/+/220987
Run-TryBot: Than McIntosh <thanm@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Cherry Zhang <cherryyz@google.com>
Reviewed-by: Jeremy Faller <jeremy@golang.org>
This commit is contained in:
Than McIntosh 2020-02-14 16:12:51 -05:00
parent 4a6c1caae2
commit 0c41a37c6c
5 changed files with 979 additions and 41 deletions

View file

@ -45,8 +45,13 @@ func (l *Loader) MakeSymbolUpdater(symIdx Sym) *SymbolBuilder {
// Create a clone with the same name/version/kind etc.
l.cloneToExternal(symIdx)
}
if l.Syms[symIdx] != nil {
panic(fmt.Sprintf("can't build if sym.Symbol %q already present", l.RawSymName(symIdx)))
// Now that we're doing phase 2 DWARF generation using the loader
// but before the wavefront has reached dodata(), we can't have this
// assertion here. Commented out for now.
if false {
if l.Syms[symIdx] != nil {
panic(fmt.Sprintf("can't build if sym.Symbol %q already present", l.RawSymName(symIdx)))
}
}
// Construct updater and return.
@ -113,6 +118,13 @@ func (sb *SymbolBuilder) SetRelocs(rslice []Reloc) {
sb.relocs = rslice
}
func (sb *SymbolBuilder) WriteRelocs(rslice []Reloc) {
if len(sb.relocs) != len(rslice) {
panic("src/dest length mismatch")
}
copy(sb.relocs, rslice)
}
func (sb *SymbolBuilder) AddReloc(r Reloc) {
sb.relocs = append(sb.relocs, r)
}