]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: de-dup the gclocals symbols in compiler too
authorMichael Hudson-Doyle <michael.hudson@canonical.com>
Mon, 28 Mar 2016 09:27:36 +0000 (22:27 +1300)
committerMichael Hudson-Doyle <michael.hudson@canonical.com>
Wed, 27 Apr 2016 22:07:17 +0000 (22:07 +0000)
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>
src/cmd/compile/internal/gc/pgen.go
src/cmd/compile/internal/gc/plive.go
src/cmd/compile/internal/gc/ssa.go

index 984d468bc6312ed43f82564060052192d6b746db..9de65cdf1ba8f1aae9428a3c561147874f178988 100644 (file)
@@ -8,7 +8,6 @@ import (
        "cmd/compile/internal/ssa"
        "cmd/internal/obj"
        "cmd/internal/sys"
-       "crypto/md5"
        "fmt"
        "sort"
        "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() {
        if Curfn.Func.Nname.Sym.Name == "_" {
                return
@@ -559,9 +549,6 @@ func genlegacy(ptxt *obj.Prog, gcargs, gclocals *Sym) {
        // Emit garbage collection symbols.
        liveness(Curfn, ptxt, gcargs, gclocals)
 
-       gcsymdup(gcargs)
-       gcsymdup(gclocals)
-
        Thearch.Defframe(ptxt)
 
        if Debug['f'] != 0 {
index e04c8563b1bd898878f54b67a2bcf33138639747..5f96aa29cb45966522ebdef455eb92a65a438fb2 100644 (file)
@@ -18,6 +18,7 @@ package gc
 import (
        "cmd/internal/obj"
        "cmd/internal/sys"
+       "crypto/md5"
        "fmt"
        "sort"
        "strings"
@@ -1689,7 +1690,17 @@ func onebitwritesymbol(arr []Bvec, sym *Sym) {
        }
 
        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) {
index b31cd878cd408e4e3bfeb4753d15bb70e1e19522..61cb16d5cb82556c4dee6c56f88a97e51c6286a8 100644 (file)
@@ -4005,8 +4005,6 @@ func genssa(f *ssa.Func, ptxt *obj.Prog, gcargs, gclocals *Sym) {
 
        // Generate gc bitmaps.
        liveness(Curfn, ptxt, gcargs, gclocals)
-       gcsymdup(gcargs)
-       gcsymdup(gclocals)
 
        // Add frame prologue. Zero ambiguously live variables.
        Thearch.Defframe(ptxt)