From 85072d5f752903298fa52b8d92a6d052061ee5b8 Mon Sep 17 00:00:00 2001 From: Michael Hudson-Doyle Date: Fri, 22 Apr 2016 10:31:14 +1200 Subject: [PATCH] cmd/link: remove Symbol.Next 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 TryBot-Result: Gobot Gobot Reviewed-by: Michael Matloob --- src/cmd/link/internal/ld/data.go | 85 ++++++------------------------- src/cmd/link/internal/ld/dwarf.go | 8 +-- src/cmd/link/internal/ld/elf.go | 4 +- src/cmd/link/internal/ld/link.go | 1 - src/cmd/link/internal/ld/macho.go | 2 +- 5 files changed, 21 insertions(+), 79 deletions(-) diff --git a/src/cmd/link/internal/ld/data.go b/src/cmd/link/internal/ld/data.go index 3d9dfac62f..b5780c6135 100644 --- a/src/cmd/link/internal/ld/data.go +++ b/src/cmd/link/internal/ld/data.go @@ -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) diff --git a/src/cmd/link/internal/ld/dwarf.go b/src/cmd/link/internal/ld/dwarf.go index 9bd08fa14b..a0622ea4d1 100644 --- a/src/cmd/link/internal/ld/dwarf.go +++ b/src/cmd/link/internal/ld/dwarf.go @@ -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 } /* diff --git a/src/cmd/link/internal/ld/elf.go b/src/cmd/link/internal/ld/elf.go index 7862396eae..3b97323621 100644 --- a/src/cmd/link/internal/ld/elf.go +++ b/src/cmd/link/internal/ld/elf.go @@ -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) } diff --git a/src/cmd/link/internal/ld/link.go b/src/cmd/link/internal/ld/link.go index e45c2d1338..57cf8e7c4f 100644 --- a/src/cmd/link/internal/ld/link.go +++ b/src/cmd/link/internal/ld/link.go @@ -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 diff --git a/src/cmd/link/internal/ld/macho.go b/src/cmd/link/internal/ld/macho.go index 724b9482fb..be4612ce0c 100644 --- a/src/cmd/link/internal/ld/macho.go +++ b/src/cmd/link/internal/ld/macho.go @@ -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) } } -- 2.48.1