diff options
| author | Andrew Gerrand <adg@golang.org> | 2015-08-06 03:45:35 +0000 |
|---|---|---|
| committer | Andrew Gerrand <adg@golang.org> | 2015-08-06 04:06:12 +0000 |
| commit | 0d20a61e68ba22fb416fe2aa8b6532026822bad0 (patch) | |
| tree | 577de59a5d28417196964e7a20aff1fa6c8fb529 /src/cmd/newlink/dead.go | |
| parent | e7f6a244a2a1c9a597a96356476484157c3c19f8 (diff) | |
| download | go1.5rc1.tar.xz | |
[release-branch.go1.5] cmd/newlink: remove from release branchgo1.5rc1
Change-Id: Iad86bde6f2e0482745a4000ec4e192ade352983b
Reviewed-on: https://go-review.googlesource.com/13292
Reviewed-by: Russ Cox <rsc@golang.org>
Run-TryBot: Andrew Gerrand <adg@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Diffstat (limited to 'src/cmd/newlink/dead.go')
| -rw-r--r-- | src/cmd/newlink/dead.go | 74 |
1 files changed, 0 insertions, 74 deletions
diff --git a/src/cmd/newlink/dead.go b/src/cmd/newlink/dead.go deleted file mode 100644 index ee23a61f81..0000000000 --- a/src/cmd/newlink/dead.go +++ /dev/null @@ -1,74 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Removal of dead code and data. - -package main - -import "cmd/internal/goobj" - -// dead removes unreachable code and data from the program. -// It is basically a mark-sweep garbage collection: traverse all the -// symbols reachable from the entry (startSymID) and then delete -// the rest. -func (p *Prog) dead() { - p.Dead = make(map[goobj.SymID]bool) - reachable := make(map[goobj.SymID]bool) - p.walkDead(p.startSym, reachable) - - for sym := range p.Syms { - if !reachable[sym] { - delete(p.Syms, sym) - p.Dead[sym] = true - } - } - - for sym := range p.Missing { - if !reachable[sym] { - delete(p.Missing, sym) - p.Dead[sym] = true - } - } - - p.SymOrder = removeDead(p.SymOrder, reachable) - - for _, pkg := range p.Packages { - pkg.Syms = removeDead(pkg.Syms, reachable) - } -} - -// walkDead traverses the symbols reachable from sym, adding them to reachable. -// The caller has verified that reachable[sym] = false. -func (p *Prog) walkDead(sym goobj.SymID, reachable map[goobj.SymID]bool) { - reachable[sym] = true - s := p.Syms[sym] - if s == nil { - return - } - for i := range s.Reloc { - r := &s.Reloc[i] - if !reachable[r.Sym] { - p.walkDead(r.Sym, reachable) - } - } - if s.Func != nil { - for _, fdata := range s.Func.FuncData { - if fdata.Sym.Name != "" && !reachable[fdata.Sym] { - p.walkDead(fdata.Sym, reachable) - } - } - } -} - -// removeDead removes unreachable (dead) symbols from syms, -// returning a shortened slice using the same underlying array. -func removeDead(syms []*Sym, reachable map[goobj.SymID]bool) []*Sym { - keep := syms[:0] - for _, sym := range syms { - if reachable[sym.SymID] { - keep = append(keep, sym) - } - } - return keep -} |
