]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/link: remove Symbol.Next
authorMichael Hudson-Doyle <michael.hudson@canonical.com>
Thu, 21 Apr 2016 22:31:14 +0000 (10:31 +1200)
committerMichael Hudson-Doyle <michael.hudson@canonical.com>
Sun, 21 Aug 2016 22:17:24 +0000 (22:17 +0000)
Bye bye one more class of linked list manipulation!

Change-Id: I2412b224c847dd640f9253125d30cd5f911ce00c
Reviewed-on: https://go-review.googlesource.com/27414
Run-TryBot: Michael Hudson-Doyle <michael.hudson@canonical.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Michael Matloob <matloob@golang.org>
src/cmd/link/internal/ld/data.go
src/cmd/link/internal/ld/dwarf.go
src/cmd/link/internal/ld/elf.go
src/cmd/link/internal/ld/link.go
src/cmd/link/internal/ld/macho.go

index 3d9dfac62f5a06274ea5b8903aa214fb55e3be8a..b5780c6135133855792f12cdf55aff606d1ef684 100644 (file)
@@ -663,7 +663,7 @@ func (ctxt *Link) reloc() {
        for _, sym := range datap {
                relocsym(ctxt, sym)
        }
-       for s := dwarfp; s != nil; s = s.Next {
+       for _, s := range dwarfp {
                relocsym(ctxt, s)
        }
 }
@@ -746,55 +746,6 @@ func dynreloc(ctxt *Link, data *[obj.SXREF][]*Symbol) {
        }
 }
 
-func blk(ctxt *Link, start *Symbol, addr int64, size int64) {
-       var sym *Symbol
-
-       for sym = start; sym != nil; sym = sym.Next {
-               if sym.Type&obj.SSUB == 0 && sym.Value >= addr {
-                       break
-               }
-       }
-
-       eaddr := addr + size
-       for ; sym != nil; sym = sym.Next {
-               if sym.Type&obj.SSUB != 0 {
-                       continue
-               }
-               if sym.Value >= eaddr {
-                       break
-               }
-               ctxt.Cursym = sym
-               if sym.Value < addr {
-                       ctxt.Diag("phase error: addr=%#x but sym=%#x type=%d", addr, sym.Value, sym.Type)
-                       errorexit()
-               }
-
-               if addr < sym.Value {
-                       strnput("", int(sym.Value-addr))
-                       addr = sym.Value
-               }
-               Cwrite(sym.P)
-               addr += int64(len(sym.P))
-               if addr < sym.Value+sym.Size {
-                       strnput("", int(sym.Value+sym.Size-addr))
-                       addr = sym.Value + sym.Size
-               }
-               if addr != sym.Value+sym.Size {
-                       ctxt.Diag("phase error: addr=%#x value+size=%#x", addr, sym.Value+sym.Size)
-                       errorexit()
-               }
-
-               if sym.Value+sym.Size >= eaddr {
-                       break
-               }
-       }
-
-       if addr < eaddr {
-               strnput("", int(eaddr-addr))
-       }
-       Cflush()
-}
-
 func Codeblk(ctxt *Link, addr int64, size int64) {
        CodeblkPad(ctxt, addr, size, zeros[:])
 }
@@ -803,7 +754,7 @@ func CodeblkPad(ctxt *Link, addr int64, size int64, pad []byte) {
                fmt.Fprintf(ctxt.Bso, "codeblk [%#x,%#x) at offset %#x\n", addr, addr+size, Cpos())
        }
 
-       blkSlice(ctxt, ctxt.Textp, addr, size, pad)
+       blk(ctxt, ctxt.Textp, addr, size, pad)
 
        /* again for printing */
        if Debug['a'] == 0 {
@@ -864,10 +815,7 @@ func CodeblkPad(ctxt *Link, addr int64, size int64, pad []byte) {
        ctxt.Bso.Flush()
 }
 
-// blkSlice is a variant of blk that processes slices.
-// After text symbols are converted from a linked list to a slice,
-// delete blk and give this function its name.
-func blkSlice(ctxt *Link, syms []*Symbol, addr, size int64, pad []byte) {
+func blk(ctxt *Link, syms []*Symbol, addr, size int64, pad []byte) {
        for i, s := range syms {
                if s.Type&obj.SSUB == 0 && s.Value >= addr {
                        syms = syms[i:]
@@ -918,7 +866,7 @@ func Datblk(ctxt *Link, addr int64, size int64) {
                fmt.Fprintf(ctxt.Bso, "datblk [%#x,%#x) at offset %#x\n", addr, addr+size, Cpos())
        }
 
-       blkSlice(ctxt, datap, addr, size, zeros[:])
+       blk(ctxt, datap, addr, size, zeros[:])
 
        /* again for printing */
        if Debug['a'] == 0 {
@@ -989,7 +937,7 @@ func Dwarfblk(ctxt *Link, addr int64, size int64) {
                fmt.Fprintf(ctxt.Bso, "dwarfblk [%#x,%#x) at offset %#x\n", addr, addr+size, Cpos())
        }
 
-       blk(ctxt, dwarfp, addr, size)
+       blk(ctxt, dwarfp, addr, size, zeros[:])
 }
 
 var zeros [512]byte
@@ -1241,14 +1189,6 @@ func checkdatsize(ctxt *Link, datsize int64, symn int) {
        }
 }
 
-func list2slice(s *Symbol) []*Symbol {
-       var syms []*Symbol
-       for ; s != nil; s = s.Next {
-               syms = append(syms, s)
-       }
-       return syms
-}
-
 // datap is a collection of reachable data symbols in address order.
 // Generated by dodata.
 var datap []*Symbol
@@ -1758,7 +1698,11 @@ func (ctxt *Link) dodata() {
        dwarfgeneratedebugsyms(ctxt)
 
        var s *Symbol
-       for s = dwarfp; s != nil && s.Type == obj.SDWARFSECT; s = s.Next {
+       var i int
+       for i, s = range dwarfp {
+               if s.Type != obj.SDWARFSECT {
+                       break
+               }
                sect = addsection(&Segdwarf, s.Name, 04)
                sect.Align = 1
                datsize = Rnd(datsize, int64(sect.Align))
@@ -1771,12 +1715,15 @@ func (ctxt *Link) dodata() {
        }
        checkdatsize(ctxt, datsize, obj.SDWARFSECT)
 
-       if s != nil {
+       if i < len(dwarfp) {
                sect = addsection(&Segdwarf, ".debug_info", 04)
                sect.Align = 1
                datsize = Rnd(datsize, int64(sect.Align))
                sect.Vaddr = uint64(datsize)
-               for ; s != nil && s.Type == obj.SDWARFINFO; s = s.Next {
+               for _, s := range dwarfp[i:] {
+                       if s.Type != obj.SDWARFINFO {
+                               break
+                       }
                        s.Sect = sect
                        s.Type = obj.SRODATA
                        s.Value = int64(uint64(datsize) - sect.Vaddr)
@@ -2095,7 +2042,7 @@ func (ctxt *Link) address() {
                }
        }
 
-       for sym := dwarfp; sym != nil; sym = sym.Next {
+       for _, sym := range dwarfp {
                ctxt.Cursym = sym
                if sym.Sect != nil {
                        sym.Value += int64(sym.Sect.Vaddr)
index 9bd08fa14b749d7d8f9799568fdc58e9cfdcadf9..a0622ea4d1649850eef0f9ddda15c31d7a103372 100644 (file)
@@ -79,7 +79,7 @@ var linesec *Symbol
 
 var gdbscript string
 
-var dwarfp *Symbol
+var dwarfp []*Symbol
 
 func writeabbrev(ctxt *Link, syms []*Symbol) []*Symbol {
        s := Linklookup(ctxt, ".debug_abbrev", 0)
@@ -1476,11 +1476,7 @@ func dwarfgeneratedebugsyms(ctxt *Link) {
        syms = writearanges(ctxt, syms)
        syms = writegdbscript(ctxt, syms)
        syms = append(syms, infosyms...)
-       dwarfp = syms[0]
-       for i := 1; i < len(syms); i++ {
-               syms[i-1].Next = syms[i]
-       }
-       syms[len(syms)-1].Next = nil
+       dwarfp = syms
 }
 
 /*
index 7862396eae3ff101ca5d6bef0a33efa607a88f59..3b9732362107811afa363c9c892ee1045595675e 100644 (file)
@@ -1787,7 +1787,7 @@ func Elfemitreloc(ctxt *Link) {
                elfrelocsect(ctxt, sect, datap)
        }
        for sect := Segdwarf.Sect; sect != nil; sect = sect.Next {
-               elfrelocsect(ctxt, sect, list2slice(dwarfp))
+               elfrelocsect(ctxt, sect, dwarfp)
        }
 }
 
@@ -2499,7 +2499,7 @@ elfobj:
                for sect := Segdata.Sect; sect != nil; sect = sect.Next {
                        elfshreloc(ctxt, sect)
                }
-               for s := dwarfp; s != nil; s = s.Next {
+               for _, s := range dwarfp {
                        if len(s.R) > 0 || s.Type == obj.SDWARFINFO {
                                elfshreloc(ctxt, s.Sect)
                        }
index e45c2d1338023288caf20e597756f7691ae78601..57cf8e7c4f2533e158ec173a4f4d7ac34790ffef 100644 (file)
@@ -57,7 +57,6 @@ type Symbol struct {
        // is not set for symbols defined by the packages being linked or by symbols
        // read by ldelf (and so is left as elf.STT_NOTYPE).
        ElfType     elf.SymType
-       Next        *Symbol
        Sub         *Symbol
        Outer       *Symbol
        Gotype      *Symbol
index 724b9482fbf20783fe3ceee2c81e96459b83ea5d..be4612ce0c24f2a94dc510db598190d5b897791b 100644 (file)
@@ -863,6 +863,6 @@ func Machoemitreloc(ctxt *Link) {
                machorelocsect(ctxt, sect, datap)
        }
        for sect := Segdwarf.Sect; sect != nil; sect = sect.Next {
-               machorelocsect(ctxt, sect, list2slice(dwarfp))
+               machorelocsect(ctxt, sect, dwarfp)
        }
 }