cmd/link: pack LSym boolean attributes

No performance improvement, but possibly more readable.

Linking juju:
	tip:  real 0m5.470s user 0m6.131s
	this: real 0m5.392s user 0m6.087s

Change-Id: I578e94fbe6c11b19d79034c33b3db31d9689d439
Reviewed-on: https://go-review.googlesource.com/20108
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
Run-TryBot: David Crawshaw <crawshaw@golang.org>
This commit is contained in:
David Crawshaw 2016-03-02 07:59:49 -05:00
parent d7cdf66978
commit a3c258a567
20 changed files with 283 additions and 253 deletions

View file

@ -1342,7 +1342,7 @@ func elfdynhash() {
nsym := Nelfsym
s := Linklookup(Ctxt, ".hash", 0)
s.Type = obj.SELFROSECT
s.Reachable = true
s.Attr |= AttrReachable
i := nsym
nbucket := 1
@ -1624,7 +1624,7 @@ func elfrelocsect(sect *Section, first *LSym) {
sect.Reloff = uint64(Cpos())
var sym *LSym
for sym = first; sym != nil; sym = sym.Next {
if !sym.Reachable {
if !sym.Attr.Reachable() {
continue
}
if uint64(sym.Value) >= sect.Vaddr {
@ -1636,7 +1636,7 @@ func elfrelocsect(sect *Section, first *LSym) {
var r *Reloc
var ri int
for ; sym != nil; sym = sym.Next {
if !sym.Reachable {
if !sym.Attr.Reachable() {
continue
}
if sym.Value >= int64(eaddr) {
@ -1685,7 +1685,7 @@ func Elfemitreloc() {
func addgonote(sectionName string, tag uint32, desc []byte) {
s := Linklookup(Ctxt, sectionName, 0)
s.Reachable = true
s.Attr |= AttrReachable
s.Type = obj.SELFROSECT
// namesz
Adduint32(Ctxt, s, uint32(len(ELF_NOTE_GO_NAME)))
@ -1715,7 +1715,7 @@ func doelf() {
shstrtab := Linklookup(Ctxt, ".shstrtab", 0)
shstrtab.Type = obj.SELFROSECT
shstrtab.Reachable = true
shstrtab.Attr |= AttrReachable
Addstring(shstrtab, "")
Addstring(shstrtab, ".text")
@ -1850,7 +1850,7 @@ func doelf() {
s := Linklookup(Ctxt, ".dynsym", 0)
s.Type = obj.SELFROSECT
s.Reachable = true
s.Attr |= AttrReachable
switch Thearch.Thechar {
case '0', '6', '7', '9':
s.Size += ELF64SYMSIZE
@ -1862,7 +1862,7 @@ func doelf() {
s = Linklookup(Ctxt, ".dynstr", 0)
s.Type = obj.SELFROSECT
s.Reachable = true
s.Attr |= AttrReachable
if s.Size == 0 {
Addstring(s, "")
}
@ -1875,35 +1875,35 @@ func doelf() {
default:
s = Linklookup(Ctxt, ".rel", 0)
}
s.Reachable = true
s.Attr |= AttrReachable
s.Type = obj.SELFROSECT
/* global offset table */
s = Linklookup(Ctxt, ".got", 0)
s.Reachable = true
s.Attr |= AttrReachable
s.Type = obj.SELFGOT // writable
/* ppc64 glink resolver */
if Thearch.Thechar == '9' {
s := Linklookup(Ctxt, ".glink", 0)
s.Reachable = true
s.Attr |= AttrReachable
s.Type = obj.SELFRXSECT
}
/* hash */
s = Linklookup(Ctxt, ".hash", 0)
s.Reachable = true
s.Attr |= AttrReachable
s.Type = obj.SELFROSECT
s = Linklookup(Ctxt, ".got.plt", 0)
s.Reachable = true
s.Attr |= AttrReachable
s.Type = obj.SELFSECT // writable
s = Linklookup(Ctxt, ".plt", 0)
s.Reachable = true
s.Attr |= AttrReachable
if Thearch.Thechar == '9' {
// In the ppc64 ABI, .plt is a data section
// written by the dynamic linker.
@ -1920,21 +1920,21 @@ func doelf() {
default:
s = Linklookup(Ctxt, ".rel.plt", 0)
}
s.Reachable = true
s.Attr |= AttrReachable
s.Type = obj.SELFROSECT
s = Linklookup(Ctxt, ".gnu.version", 0)
s.Reachable = true
s.Attr |= AttrReachable
s.Type = obj.SELFROSECT
s = Linklookup(Ctxt, ".gnu.version_r", 0)
s.Reachable = true
s.Attr |= AttrReachable
s.Type = obj.SELFROSECT
/* define dynamic elf table */
s = Linklookup(Ctxt, ".dynamic", 0)
s.Reachable = true
s.Attr |= AttrReachable
s.Type = obj.SELFSECT // writable
/*
@ -1987,10 +1987,10 @@ func doelf() {
// The go.link.abihashbytes symbol will be pointed at the appropriate
// part of the .note.go.abihash section in data.go:func address().
s := Linklookup(Ctxt, "go.link.abihashbytes", 0)
s.Local = true
s.Attr |= AttrLocal
s.Type = obj.SRODATA
s.Special = 1
s.Reachable = true
s.Attr |= AttrSpecial
s.Attr |= AttrReachable
s.Size = int64(sha1.Size)
sort.Sort(byPkg(Ctxt.Library))
@ -2531,7 +2531,7 @@ func Elfadddynsym(ctxt *Link, s *LSym) {
/* type */
t := STB_GLOBAL << 4
if s.Cgoexport != 0 && s.Type&obj.SMASK == obj.STEXT {
if s.Attr.CgoExport() && s.Type&obj.SMASK == obj.STEXT {
t |= STT_FUNC
} else {
t |= STT_OBJECT
@ -2558,7 +2558,7 @@ func Elfadddynsym(ctxt *Link, s *LSym) {
/* size of object */
Adduint64(ctxt, d, uint64(s.Size))
if Thearch.Thechar == '6' && s.Cgoexport&CgoExportDynamic == 0 && s.Dynimplib != "" && !seenlib[s.Dynimplib] {
if Thearch.Thechar == '6' && !s.Attr.CgoExportDynamic() && s.Dynimplib != "" && !seenlib[s.Dynimplib] {
Elfwritedynent(Linklookup(ctxt, ".dynamic", 0), DT_NEEDED, uint64(Addstring(Linklookup(ctxt, ".dynstr", 0), s.Dynimplib)))
}
} else {
@ -2586,9 +2586,9 @@ func Elfadddynsym(ctxt *Link, s *LSym) {
t := STB_GLOBAL << 4
// TODO(mwhudson): presumably the behaviour should actually be the same on both arm and 386.
if Thearch.Thechar == '8' && s.Cgoexport != 0 && s.Type&obj.SMASK == obj.STEXT {
if Thearch.Thechar == '8' && s.Attr.CgoExport() && s.Type&obj.SMASK == obj.STEXT {
t |= STT_FUNC
} else if Thearch.Thechar == '5' && s.Cgoexport&CgoExportDynamic != 0 && s.Type&obj.SMASK == obj.STEXT {
} else if Thearch.Thechar == '5' && s.Attr.CgoExportDynamic() && s.Type&obj.SMASK == obj.STEXT {
t |= STT_FUNC
} else {
t |= STT_OBJECT