]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/link: move all FUNCDATA refs into go.func.*
authorJosh Bleecher Snyder <josharian@gmail.com>
Fri, 24 Sep 2021 20:50:22 +0000 (13:50 -0700)
committerJosh Bleecher Snyder <josharian@gmail.com>
Tue, 5 Oct 2021 15:47:07 +0000 (15:47 +0000)
This change moves all symbols referred to by FUNCDATA
into go.func.* and go.funcrel.*.

Surprisingly (because it inhibits some content-addressability),
it shrinks binaries by a little bit, about 0.1%.

This paves the way for a subsequent change to change
FUNCDATA relocations to offsets.

Change-Id: I70e487205073699f442192b0791cc92da5663057
Reviewed-on: https://go-review.googlesource.com/c/go/+/352189
Trust: Josh Bleecher Snyder <josharian@gmail.com>
Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Cherry Mui <cherryyz@google.com>
src/cmd/internal/obj/objfile.go
src/cmd/link/internal/ld/symtab.go

index 0f3356f85e72bf780d2c8f1191f0a9d5f7a6eab9..687cddc70cf7167638b5440860c24f0ca8814368 100644 (file)
@@ -408,7 +408,21 @@ func contentHashSection(s *LSym) byte {
        name := s.Name
        if s.IsPcdata() {
                return 'P'
-       } else if strings.HasPrefix(name, "type.") {
+       }
+       if strings.HasPrefix(name, "runtime.gcbits.") {
+               return 'G' // gcbits
+       }
+       if strings.HasPrefix(name, "gcargs.") ||
+               strings.HasPrefix(name, "gclocals.") ||
+               strings.HasPrefix(name, "gclocals·") ||
+               strings.HasSuffix(name, ".opendefer") ||
+               strings.HasSuffix(name, ".arginfo0") ||
+               strings.HasSuffix(name, ".arginfo1") ||
+               strings.HasSuffix(name, ".args_stackmap") ||
+               strings.HasSuffix(name, ".stkobj") {
+               return 'F' // go.func.* or go.funcrel.*
+       }
+       if strings.HasPrefix(name, "type.") {
                return 'T'
        }
        return 0
index 5e7eeeb94f9886a8a04c95f1c8421b28e9e12ad8..7fddc59bb5fe985accb8897a515ae0b274f384ab 100644 (file)
@@ -507,13 +507,9 @@ func (ctxt *Link) symtab(pcln *pclntab) []sym.SymKind {
                symgcbits   = groupSym("runtime.gcbits.*", sym.SGCBITS)
        )
 
-       var symgofuncrel loader.Sym
-       if !ctxt.DynlinkingGo() {
-               if ctxt.UseRelro() {
-                       symgofuncrel = groupSym("go.funcrel.*", sym.SGOFUNCRELRO)
-               } else {
-                       symgofuncrel = symgofunc
-               }
+       symgofuncrel := symgofunc
+       if ctxt.UseRelro() {
+               symgofuncrel = groupSym("go.funcrel.*", sym.SGOFUNCRELRO)
        }
 
        symt := ldr.CreateSymForUpdate("runtime.symtab", 0)
@@ -555,7 +551,7 @@ func (ctxt *Link) symtab(pcln *pclntab) []sym.SymKind {
                        }
                        if ctxt.UseRelro() {
                                symGroupType[s] = sym.SGOFUNCRELRO
-                               if symgofuncrel != 0 {
+                               if !ctxt.DynlinkingGo() {
                                        ldr.SetCarrierSym(s, symgofuncrel)
                                }
                        } else {
@@ -569,10 +565,17 @@ func (ctxt *Link) symtab(pcln *pclntab) []sym.SymKind {
                        ldr.SymType(s) == sym.SGOFUNC && s != symgofunc, // inltree, see pcln.go
                        strings.HasSuffix(name, ".opendefer"),
                        strings.HasSuffix(name, ".arginfo0"),
-                       strings.HasSuffix(name, ".arginfo1"):
-                       symGroupType[s] = sym.SGOFUNC
+                       strings.HasSuffix(name, ".arginfo1"),
+                       strings.HasSuffix(name, ".args_stackmap"),
+                       strings.HasSuffix(name, ".stkobj"):
                        ldr.SetAttrNotInSymbolTable(s, true)
-                       ldr.SetCarrierSym(s, symgofunc)
+                       if ctxt.UseRelro() && strings.HasSuffix(name, ".stkobj") {
+                               symGroupType[s] = sym.SGOFUNCRELRO
+                               ldr.SetCarrierSym(s, symgofuncrel)
+                       } else {
+                               symGroupType[s] = sym.SGOFUNC
+                               ldr.SetCarrierSym(s, symgofunc)
+                       }
                        if ctxt.Debugvlog != 0 {
                                align := ldr.SymAlign(s)
                                liveness += (ldr.SymSize(s) + int64(align) - 1) &^ (int64(align) - 1)