diff options
| author | Chris Broadfoot <cbro@golang.org> | 2016-01-27 15:44:35 -0800 |
|---|---|---|
| committer | Chris Broadfoot <cbro@golang.org> | 2016-01-28 00:06:14 +0000 |
| commit | 036b8fd40b60830ca1d152f17148e52b96d8aa6c (patch) | |
| tree | 854edbcd7a831050e04eecd63ce8cf580c6e833a /src/cmd/newlink/dead.go | |
| parent | 6c6aabe0bca7209d646c840d6274b1ffd199bba0 (diff) | |
| download | go1.6rc1.tar.xz | |
[release-branch.go1.6] cmd/newlink: remove from release branchgo1.6rc1
Change-Id: Iec73b9a4279b5d6b458615c265e75b6becff320e
Reviewed-on: https://go-review.googlesource.com/19023
Run-TryBot: Chris Broadfoot <cbro@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@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 -} |
