mirror of
https://github.com/golang/go
synced 2024-11-24 11:30:13 -07:00
cmd/compile: de-dup the gclocals symbols in compiler too
These symbols are de-duplicated in the linker but the compiler generates quite many duplicates too: 2425 of 13769 total symbols for runtime.a for example. De-duplicating them in the compiler saves the linker a bit of work. Fixes #14983 Change-Id: I5f18e5f9743563c795aad8f0a22d17a7ed147711 Reviewed-on: https://go-review.googlesource.com/22293 Reviewed-by: David Crawshaw <crawshaw@golang.org>
This commit is contained in:
parent
d3c79d324a
commit
f4d38a8792
@ -8,7 +8,6 @@ import (
|
|||||||
"cmd/compile/internal/ssa"
|
"cmd/compile/internal/ssa"
|
||||||
"cmd/internal/obj"
|
"cmd/internal/obj"
|
||||||
"cmd/internal/sys"
|
"cmd/internal/sys"
|
||||||
"crypto/md5"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"sort"
|
"sort"
|
||||||
"strings"
|
"strings"
|
||||||
@ -130,15 +129,6 @@ func removevardef(firstp *obj.Prog) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func gcsymdup(s *Sym) {
|
|
||||||
ls := Linksym(s)
|
|
||||||
if len(ls.R) > 0 {
|
|
||||||
Fatalf("cannot rosymdup %s with relocations", ls.Name)
|
|
||||||
}
|
|
||||||
ls.Name = fmt.Sprintf("gclocals·%x", md5.Sum(ls.P))
|
|
||||||
ls.Dupok = true
|
|
||||||
}
|
|
||||||
|
|
||||||
func emitptrargsmap() {
|
func emitptrargsmap() {
|
||||||
if Curfn.Func.Nname.Sym.Name == "_" {
|
if Curfn.Func.Nname.Sym.Name == "_" {
|
||||||
return
|
return
|
||||||
@ -559,9 +549,6 @@ func genlegacy(ptxt *obj.Prog, gcargs, gclocals *Sym) {
|
|||||||
// Emit garbage collection symbols.
|
// Emit garbage collection symbols.
|
||||||
liveness(Curfn, ptxt, gcargs, gclocals)
|
liveness(Curfn, ptxt, gcargs, gclocals)
|
||||||
|
|
||||||
gcsymdup(gcargs)
|
|
||||||
gcsymdup(gclocals)
|
|
||||||
|
|
||||||
Thearch.Defframe(ptxt)
|
Thearch.Defframe(ptxt)
|
||||||
|
|
||||||
if Debug['f'] != 0 {
|
if Debug['f'] != 0 {
|
||||||
|
@ -18,6 +18,7 @@ package gc
|
|||||||
import (
|
import (
|
||||||
"cmd/internal/obj"
|
"cmd/internal/obj"
|
||||||
"cmd/internal/sys"
|
"cmd/internal/sys"
|
||||||
|
"crypto/md5"
|
||||||
"fmt"
|
"fmt"
|
||||||
"sort"
|
"sort"
|
||||||
"strings"
|
"strings"
|
||||||
@ -1689,7 +1690,17 @@ func onebitwritesymbol(arr []Bvec, sym *Sym) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
duint32(sym, 0, uint32(i)) // number of bitmaps
|
duint32(sym, 0, uint32(i)) // number of bitmaps
|
||||||
ggloblsym(sym, int32(off), obj.RODATA)
|
ls := Linksym(sym)
|
||||||
|
ls.Name = fmt.Sprintf("gclocals·%x", md5.Sum(ls.P))
|
||||||
|
ls.Dupok = true
|
||||||
|
sv := obj.SymVer{ls.Name, 0}
|
||||||
|
ls2, ok := Ctxt.Hash[sv]
|
||||||
|
if ok {
|
||||||
|
sym.Lsym = ls2
|
||||||
|
} else {
|
||||||
|
Ctxt.Hash[sv] = ls
|
||||||
|
ggloblsym(sym, int32(off), obj.RODATA)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func printprog(p *obj.Prog) {
|
func printprog(p *obj.Prog) {
|
||||||
|
@ -4005,8 +4005,6 @@ func genssa(f *ssa.Func, ptxt *obj.Prog, gcargs, gclocals *Sym) {
|
|||||||
|
|
||||||
// Generate gc bitmaps.
|
// Generate gc bitmaps.
|
||||||
liveness(Curfn, ptxt, gcargs, gclocals)
|
liveness(Curfn, ptxt, gcargs, gclocals)
|
||||||
gcsymdup(gcargs)
|
|
||||||
gcsymdup(gclocals)
|
|
||||||
|
|
||||||
// Add frame prologue. Zero ambiguously live variables.
|
// Add frame prologue. Zero ambiguously live variables.
|
||||||
Thearch.Defframe(ptxt)
|
Thearch.Defframe(ptxt)
|
||||||
|
Loading…
Reference in New Issue
Block a user