]> Cypherpunks repositories - gostls13.git/commitdiff
[dev.link] cmd/link: clean up some fields
authorCherry Zhang <cherryyz@google.com>
Wed, 5 Feb 2020 21:52:12 +0000 (16:52 -0500)
committerCherry Zhang <cherryyz@google.com>
Fri, 7 Feb 2020 18:33:37 +0000 (18:33 +0000)
With the new index mapping , we can clean up some fields.
Loader.max should always be equal to len(loader.objSyms) now. And
for external symbols we now give its "local index" as its index
in the payload array, so Relocs.extIdx is no longer useful.
Delete those fields.

Change-Id: If387ff9201ea0d347b954f651f5d4b4ae74937aa
Reviewed-on: https://go-review.googlesource.com/c/go/+/218478
Run-TryBot: Cherry Zhang <cherryyz@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Jeremy Faller <jeremy@golang.org>
src/cmd/link/internal/loader/loader.go
src/cmd/link/internal/loader/loader_test.go

index 40bae9cc6d20972a685928ffc873a0f09303d1a6..be50562af298b4549cce44b9085a6e9b718e2a53 100644 (file)
@@ -37,8 +37,6 @@ type Relocs struct {
        li int      // local index of symbol whose relocs we're examining
        r  *oReader // object reader for containing package
        l  *Loader  // loader
-
-       extIdx Sym // index of external symbol we're examining or 0
 }
 
 // Reloc contains the payload for a specific relocation.
@@ -162,7 +160,6 @@ func growBitmap(reqLen int, b bitmap) bitmap {
 type Loader struct {
        start       map[*oReader]Sym // map from object file to its start index
        objs        []objIdx         // sorted by start index (i.e. objIdx.i)
-       max         Sym              // current max index
        extStart    Sym              // from this index on, the symbols are externally defined
        builtinSyms []Sym            // global index of builtin symbols
        ocache      int              // index (into 'objs') of most recent lookup
@@ -302,10 +299,10 @@ func (l *Loader) addObj(pkg string, r *oReader) Sym {
                l.objByPkg[pkg] = r
        }
        n := r.NSym() + r.NNonpkgdef()
-       i := l.max + 1
+       i := Sym(len(l.objSyms))
        l.start[r] = i
        l.objs = append(l.objs, objIdx{r, i})
-       l.growValues(int(l.max) + n)
+       l.growValues(int(i) + n - 1)
        return i
 }
 
@@ -317,7 +314,6 @@ func (l *Loader) AddSym(name string, ver int, r *oReader, li int, dupok bool, ty
        }
        i := Sym(len(l.objSyms))
        addToGlobal := func() {
-               l.max++
                l.objSyms = append(l.objSyms, objSym{r, li})
        }
        if name == "" {
@@ -370,16 +366,12 @@ func (l *Loader) AddSym(name string, ver int, r *oReader, li int, dupok bool, ty
 // newExtSym creates a new external sym with the specified
 // name/version.
 func (l *Loader) newExtSym(name string, ver int) Sym {
-       l.max++
-       i := l.max
+       i := Sym(len(l.objSyms))
        if l.extStart == 0 {
                l.extStart = i
        }
        l.growSyms(int(i))
        pi := l.newPayload(name, ver)
-       if int(i) != len(l.objSyms) || pi != len(l.extReader.syms) {
-               panic("XXX AddSym inconsistency")
-       }
        l.objSyms = append(l.objSyms, objSym{l.extReader, int(pi)})
        l.extReader.syms = append(l.extReader.syms, i)
        return i
@@ -422,6 +414,11 @@ func (l *Loader) LookupOrCreateSym(name string, ver int) Sym {
 
 func (l *Loader) IsExternal(i Sym) bool {
        r, _ := l.toLocal(i)
+       return l.isExtReader(r)
+}
+
+
+func (l *Loader) isExtReader(r *oReader) bool {
        return r == l.extReader
 }
 
@@ -577,7 +574,7 @@ func (l *Loader) NStrictDupMsgs() int { return l.strictDupMsgs }
 
 // Number of total symbols.
 func (l *Loader) NSym() int {
-       return int(l.max + 1)
+       return len(l.objSyms)
 }
 
 // Number of defined Go symbols.
@@ -997,7 +994,7 @@ func (l *Loader) SymAlign(i Sym) int32 {
 // SetSymAlign sets the alignment for a symbol.
 func (l *Loader) SetSymAlign(i Sym, align int32) {
        // reject bad synbols
-       if i > l.max || i == 0 {
+       if i >= Sym(len(l.objSyms)) || i == 0 {
                panic("bad symbol index in SetSymAlign")
        }
        // Reject nonsense alignments.
@@ -1026,7 +1023,7 @@ func (l *Loader) SymDynimplib(i Sym) string {
 // SetSymDynimplib sets the "dynimplib" attribute for a symbol.
 func (l *Loader) SetSymDynimplib(i Sym, value string) {
        // reject bad symbols
-       if i > l.max || i == 0 {
+       if i >= Sym(len(l.objSyms)) || i == 0 {
                panic("bad symbol index in SetDynimplib")
        }
        if value == "" {
@@ -1046,7 +1043,7 @@ func (l *Loader) SymDynimpvers(i Sym) string {
 // SetSymDynimpvers sets the "dynimpvers" attribute for a symbol.
 func (l *Loader) SetSymDynimpvers(i Sym, value string) {
        // reject bad symbols
-       if i > l.max || i == 0 {
+       if i >= Sym(len(l.objSyms)) || i == 0 {
                panic("bad symbol index in SetDynimpvers")
        }
        if value == "" {
@@ -1065,7 +1062,7 @@ func (l *Loader) SymExtname(i Sym) string {
 // SetSymExtname sets the  "extname" attribute for a symbol.
 func (l *Loader) SetSymExtname(i Sym, value string) {
        // reject bad symbols
-       if i > l.max || i == 0 {
+       if i >= Sym(len(l.objSyms)) || i == 0 {
                panic("bad symbol index in SetExtname")
        }
        if value == "" {
@@ -1089,7 +1086,7 @@ func (l *Loader) SymElfType(i Sym) elf.SymType {
 // SetSymElfType sets the elf type attribute for a symbol.
 func (l *Loader) SetSymElfType(i Sym, et elf.SymType) {
        // reject bad symbols
-       if i > l.max || i == 0 {
+       if i >= Sym(len(l.objSyms)) || i == 0 {
                panic("bad symbol index in SetSymElfType")
        }
        if et == elf.STT_NOTYPE {
@@ -1101,7 +1098,7 @@ func (l *Loader) SetSymElfType(i Sym, et elf.SymType) {
 
 // SetPlt sets the plt value for pe symbols.
 func (l *Loader) SetPlt(i Sym, v int32) {
-       if i > l.max || i == 0 {
+       if i >= Sym(len(l.objSyms)) || i == 0 {
                panic("bad symbol for SetPlt")
        }
        if v == 0 {
@@ -1113,7 +1110,7 @@ func (l *Loader) SetPlt(i Sym, v int32) {
 
 // SetGot sets the got value for pe symbols.
 func (l *Loader) SetGot(i Sym, v int32) {
-       if i > l.max || i == 0 {
+       if i >= Sym(len(l.objSyms)) || i == 0 {
                panic("bad symbol for SetPlt")
        }
        if v == 0 {
@@ -1188,7 +1185,7 @@ func (l *Loader) SymFile(i Sym) string {
 // from shared libraries.
 func (l *Loader) SetSymFile(i Sym, file string) {
        // reject bad symbols
-       if i > l.max || i == 0 {
+       if i >= Sym(len(l.objSyms)) || i == 0 {
                panic("bad symbol index in SetSymFile")
        }
        if !l.IsExternal(i) {
@@ -1206,7 +1203,7 @@ func (l *Loader) SymLocalentry(i Sym) uint8 {
 // SetSymExtname sets the "extname" attribute for a symbol.
 func (l *Loader) SetSymLocalentry(i Sym, value uint8) {
        // reject bad symbols
-       if i > l.max || i == 0 {
+       if i >= Sym(len(l.objSyms)) || i == 0 {
                panic("bad symbol index in SetExtname")
        }
        if value == 0 {
@@ -1369,8 +1366,8 @@ func (l *Loader) growExtAttrBitmaps() {
 
 // At method returns the j-th reloc for a global symbol.
 func (relocs *Relocs) At(j int) Reloc {
-       if relocs.extIdx != 0 {
-               pp := relocs.l.getPayload(relocs.extIdx)
+       if relocs.l.isExtReader(relocs.r) {
+               pp := relocs.l.payloads[relocs.li]
                return pp.relocs[j]
        }
        rel := goobj2.Reloc{}
@@ -1398,8 +1395,8 @@ func (relocs *Relocs) ReadAll(dst []Reloc) []Reloc {
        }
        dst = dst[:0]
 
-       if relocs.extIdx != 0 {
-               pp := relocs.l.getPayload(relocs.extIdx)
+       if relocs.l.isExtReader(relocs.r) {
+               pp := relocs.l.payloads[relocs.li]
                dst = append(dst, pp.relocs...)
                return dst
        }
@@ -1423,13 +1420,6 @@ func (relocs *Relocs) ReadAll(dst []Reloc) []Reloc {
 
 // Relocs returns a Relocs object for the given global sym.
 func (l *Loader) Relocs(i Sym) Relocs {
-       if l.IsExternal(i) {
-               pp := l.getPayload(i)
-               if pp != nil {
-                       return Relocs{Count: len(pp.relocs), l: l, extIdx: i}
-               }
-               return Relocs{}
-       }
        r, li := l.toLocal(i)
        if r == nil {
                panic(fmt.Sprintf("trying to get oreader for invalid sym %d\n\n", i))
@@ -1439,8 +1429,15 @@ func (l *Loader) Relocs(i Sym) Relocs {
 
 // Relocs returns a Relocs object given a local sym index and reader.
 func (l *Loader) relocs(r *oReader, li int) Relocs {
+       var n int
+       if l.isExtReader(r) {
+               pp := l.payloads[li]
+               n = len(pp.relocs)
+       } else {
+               n = r.NReloc(li)
+       }
        return Relocs{
-               Count: r.NReloc(li),
+               Count: n,
                li:    li,
                r:     r,
                l:     l,
@@ -2279,7 +2276,7 @@ func patchDWARFName(s *sym.Symbol, r *oReader) {
 func (l *Loader) UndefinedRelocTargets(limit int) []Sym {
        result := []Sym{}
        rslice := []Reloc{}
-       for si := Sym(1); si <= l.max; si++ {
+       for si := Sym(1); si < Sym(len(l.objSyms)); si++ {
                relocs := l.Relocs(si)
                rslice = relocs.ReadAll(rslice)
                for ri := 0; ri < relocs.Count; ri++ {
@@ -2304,9 +2301,9 @@ func (l *Loader) Dump() {
                }
        }
        fmt.Println("extStart:", l.extStart)
-       fmt.Println("max:", l.max)
+       fmt.Println("Nsyms:", len(l.objSyms))
        fmt.Println("syms")
-       for i := Sym(1); i <= l.max; i++ {
+       for i := Sym(1); i <= Sym(len(l.objSyms)); i++ {
                pi := interface{}("")
                if l.IsExternal(i) {
                        pi = fmt.Sprintf("<ext %d>", l.extIndex(i))
index 8f0678397777cb2bc8b71724f4c149d047c8ee10..fc1665cc7d3923f3f886139f9f803245a9c65ae6 100644 (file)
@@ -19,12 +19,12 @@ import (
 // do anything interesting with this symbol (such as look at its
 // data or relocations).
 func addDummyObjSym(t *testing.T, ldr *Loader, or *oReader, name string) Sym {
-       idx := ldr.max + 1
-       if _, ok := ldr.AddSym(name, 0, or, int(idx), false, sym.SRODATA); !ok {
+       idx := len(ldr.objSyms)
+       s, ok := ldr.AddSym(name, 0, or, idx, false, sym.SRODATA)
+       if !ok {
                t.Errorf("AddrSym failed for '" + name + "'")
        }
-
-       return idx
+       return s
 }
 
 func TestAddMaterializedSymbol(t *testing.T) {