]> Cypherpunks repositories - gostls13.git/commitdiff
[dev.link] cmd/link: pass reloc by value to Adddynrel2
authorCherry Zhang <cherryyz@google.com>
Thu, 30 Apr 2020 05:32:48 +0000 (01:32 -0400)
committerCherry Zhang <cherryyz@google.com>
Thu, 30 Apr 2020 15:53:43 +0000 (15:53 +0000)
Adddynrel2 is a function pointer. In dynrelocsym we pass &r to
it, which will cause r to escape. Pass it by value instead.

Linking cmd/compile,

name           old alloc/op   new alloc/op   delta
Dodata_GC        15.8MB ± 0%     5.9MB ± 0%  -62.55%  (p=0.008 n=5+5)

Change-Id: Ib86005d1026ebaca57777b27ead037e613585f44
Reviewed-on: https://go-review.googlesource.com/c/go/+/231045
Run-TryBot: Cherry Zhang <cherryyz@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Than McIntosh <thanm@google.com>
Reviewed-by: Jeremy Faller <jeremy@golang.org>
src/cmd/link/internal/amd64/asm.go
src/cmd/link/internal/arm/asm.go
src/cmd/link/internal/arm64/asm.go
src/cmd/link/internal/ld/data.go
src/cmd/link/internal/ld/lib.go
src/cmd/link/internal/ld/xcoff.go
src/cmd/link/internal/ppc64/asm.go
src/cmd/link/internal/s390x/asm.go
src/cmd/link/internal/x86/asm.go

index f3b3d703b564a67ce835da83c901d5a68c9d93e0..e1daaec2c73459cdbce683c88edc357b65d5779a 100644 (file)
@@ -78,7 +78,7 @@ func makeWritable(s *sym.Symbol) {
        }
 }
 
-func adddynrel2(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loader.Sym, r *loader.Reloc2, rIdx int) bool {
+func adddynrel2(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loader.Sym, r loader.Reloc2, rIdx int) bool {
        targ := r.Sym()
        var targType sym.SymKind
        if targ != 0 {
@@ -242,7 +242,7 @@ func adddynrel2(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s load
 
        // Reread the reloc to incorporate any changes in type above.
        relocs := ldr.Relocs(s)
-       *r = relocs.At2(rIdx)
+       r = relocs.At2(rIdx)
 
        switch r.Type() {
        case objabi.R_CALL,
index e42ea0f6e5cbd15923285da4273d6e1ac8445c86..c95de0de2f153b24c71911f99961a4ac9d2463e4 100644 (file)
@@ -103,7 +103,7 @@ func braddoff(a int32, b int32) int32 {
        return int32((uint32(a))&0xff000000 | 0x00ffffff&uint32(a+b))
 }
 
-func adddynrel2(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loader.Sym, r *loader.Reloc2, rIdx int) bool {
+func adddynrel2(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loader.Sym, r loader.Reloc2, rIdx int) bool {
 
        targ := r.Sym()
        var targType sym.SymKind
@@ -216,7 +216,7 @@ func adddynrel2(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s load
 
        // Reread the reloc to incorporate any changes in type above.
        relocs := ldr.Relocs(s)
-       *r = relocs.At2(rIdx)
+       r = relocs.At2(rIdx)
 
        switch r.Type() {
        case objabi.R_CALLARM:
index f49172ea23a8cb06da374b83a9137d17f31b51c8..2d12fc2f5956c1640401a680980bceba61d25c20 100644 (file)
@@ -78,7 +78,7 @@ func gentext2(ctxt *ld.Link, ldr *loader.Loader) {
        initfunc.AddReloc(rel2)
 }
 
-func adddynrel2(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loader.Sym, r *loader.Reloc2, rIdx int) bool {
+func adddynrel2(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loader.Sym, r loader.Reloc2, rIdx int) bool {
 
        targ := r.Sym()
        var targType sym.SymKind
@@ -213,7 +213,7 @@ func adddynrel2(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s load
 
        // Reread the reloc to incorporate any changes in type above.
        relocs := ldr.Relocs(s)
-       *r = relocs.At2(rIdx)
+       r = relocs.At2(rIdx)
 
        switch r.Type() {
        case objabi.R_CALL,
index ae515a7d46c1af609acd438fa3833c5798869455..4852a18049de9d6b64acddbd7cd18293dde5660f 100644 (file)
@@ -714,7 +714,7 @@ func dynrelocsym2(ctxt *Link, s loader.Sym) {
                        // It's expected that some relocations will be done
                        // later by relocsym (R_TLS_LE, R_ADDROFF), so
                        // don't worry if Adddynrel returns false.
-                       thearch.Adddynrel2(target, ldr, syms, s, &r, ri)
+                       thearch.Adddynrel2(target, ldr, syms, s, r, ri)
                        continue
                }
 
@@ -723,7 +723,7 @@ func dynrelocsym2(ctxt *Link, s loader.Sym) {
                        if rSym != 0 && !ldr.AttrReachable(rSym) {
                                ctxt.Errorf(s, "dynamic relocation to unreachable symbol %s", ldr.SymName(rSym))
                        }
-                       if !thearch.Adddynrel2(target, ldr, syms, s, &r, ri) {
+                       if !thearch.Adddynrel2(target, ldr, syms, s, r, ri) {
                                ctxt.Errorf(s, "unsupported dynamic relocation for symbol %s (type=%d (%s) stype=%d (%s))", ldr.SymName(rSym), r.Type(), sym.RelocName(ctxt.Arch, r.Type()), ldr.SymType(rSym), ldr.SymType(rSym))
                        }
                }
index 9a87cbef3395500c0c9382a635db486bc0ac6a56..a328efd03b595b6547f77e95f427e7ed4bbc68e4 100644 (file)
@@ -233,7 +233,7 @@ type Arch struct {
        Dragonflydynld string
        Solarisdynld   string
        Adddynrel      func(*Target, *loader.Loader, *ArchSyms, *sym.Symbol, *sym.Reloc) bool
-       Adddynrel2     func(*Target, *loader.Loader, *ArchSyms, loader.Sym, *loader.Reloc2, int) bool
+       Adddynrel2     func(*Target, *loader.Loader, *ArchSyms, loader.Sym, loader.Reloc2, int) bool
        Archinit       func(*Link)
        // Archreloc is an arch-specific hook that assists in relocation processing
        // (invoked by 'relocsym'); it handles target-specific relocation tasks.
index bb039884afdc84532ecc3a367598056f3fc4652d..281747b64d1a74188f0d3d08b0467b54809b0df6 100644 (file)
@@ -1109,7 +1109,7 @@ func (f *xcoffFile) adddynimpsym(ctxt *Link, s loader.Sym) {
 
 // Xcoffadddynrel adds a dynamic relocation in a XCOFF file.
 // This relocation will be made by the loader.
-func Xcoffadddynrel2(target *Target, ldr *loader.Loader, syms *ArchSyms, s loader.Sym, r *loader.Reloc2, rIdx int) bool {
+func Xcoffadddynrel2(target *Target, ldr *loader.Loader, syms *ArchSyms, s loader.Sym, r loader.Reloc2, rIdx int) bool {
        if target.IsExternal() {
                return true
        }
index dfc55a30fd187521b005ef62ea2bdba6821040a2..7a5dc565e68f242dce0fefb20b49e77c3cd2af37 100644 (file)
@@ -267,7 +267,7 @@ func gencallstub2(ctxt *ld.Link, ldr *loader.Loader, abicase int, stub *loader.S
        stub.AddUint32(ctxt.Arch, 0x4e800420) // bctr
 }
 
-func adddynrel2(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loader.Sym, r *loader.Reloc2, rIdx int) bool {
+func adddynrel2(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loader.Sym, r loader.Reloc2, rIdx int) bool {
        if target.IsElf() {
                return addelfdynrel2(target, ldr, syms, s, r, rIdx)
        } else if target.IsAIX() {
@@ -276,7 +276,7 @@ func adddynrel2(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s load
        return false
 }
 
-func addelfdynrel2(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loader.Sym, r *loader.Reloc2, rIdx int) bool {
+func addelfdynrel2(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loader.Sym, r loader.Reloc2, rIdx int) bool {
        targ := r.Sym()
        var targType sym.SymKind
        if targ != 0 {
index a9cb79a1ccfb08625b66a8b5a55fd99dc4980798..4def25868aabe4f9ee3f5dca62d7c8f1b3e8af5a 100644 (file)
@@ -75,7 +75,7 @@ func gentext2(ctxt *ld.Link, ldr *loader.Loader) {
        initfunc.AddUint32(ctxt.Arch, 0)
 }
 
-func adddynrel2(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loader.Sym, r *loader.Reloc2, rIdx int) bool {
+func adddynrel2(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loader.Sym, r loader.Reloc2, rIdx int) bool {
        targ := r.Sym()
        var targType sym.SymKind
        if targ != 0 {
index 53e5c71712af31852c63a8037008355a4f194b37..df704a444d152c2d75bae6134724a7cac67927f9 100644 (file)
@@ -129,7 +129,7 @@ func gentext2(ctxt *ld.Link, ldr *loader.Loader) {
        o(0xc3)
 }
 
-func adddynrel2(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loader.Sym, r *loader.Reloc2, rIdx int) bool {
+func adddynrel2(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loader.Sym, r loader.Reloc2, rIdx int) bool {
        targ := r.Sym()
        var targType sym.SymKind
        if targ != 0 {
@@ -281,7 +281,7 @@ func adddynrel2(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s load
 
        // Reread the reloc to incorporate any changes in type above.
        relocs := ldr.Relocs(s)
-       *r = relocs.At2(rIdx)
+       r = relocs.At2(rIdx)
 
        switch r.Type() {
        case objabi.R_CALL,