[dev.link] cmd/compile: mark stmp and stkobj symbols as static

Mark compiler-generated ".stmp_%d" and "<fn>.stkobj" symbols as
AttrStatic, so as to tell the linker that they do not need to be
inserted into its name lookup tables.

Change-Id: I59ffd11659b2c54c2d0ad41275d05c3f919e3b88
Reviewed-on: https://go-review.googlesource.com/c/go/+/240497
Run-TryBot: Than McIntosh <thanm@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Cherry Zhang <cherryyz@google.com>
This commit is contained in:
Than McIntosh 2020-06-30 07:55:16 -04:00
parent 59a702aa6a
commit 0434d40934
4 changed files with 11 additions and 4 deletions

View File

@ -291,10 +291,8 @@ func addGCLocals() {
} }
if x := s.Func.StackObjects; x != nil { if x := s.Func.StackObjects; x != nil {
attr := int16(obj.RODATA) attr := int16(obj.RODATA)
if s.DuplicateOK() {
attr |= obj.DUPOK
}
ggloblsym(x, int32(len(x.P)), attr) ggloblsym(x, int32(len(x.P)), attr)
x.Set(obj.AttrStatic, true)
} }
if x := s.Func.OpenCodedDeferInfo; x != nil { if x := s.Func.OpenCodedDeferInfo; x != nil {
ggloblsym(x, int32(len(x.P)), obj.RODATA|obj.DUPOK) ggloblsym(x, int32(len(x.P)), obj.RODATA|obj.DUPOK)

View File

@ -6,6 +6,7 @@ package gc
import ( import (
"cmd/compile/internal/types" "cmd/compile/internal/types"
"cmd/internal/obj"
"fmt" "fmt"
) )
@ -360,7 +361,7 @@ var statuniqgen int // name generator for static temps
// returned node for readonly nodes. // returned node for readonly nodes.
func staticname(t *types.Type) *Node { func staticname(t *types.Type) *Node {
// Don't use lookupN; it interns the resulting string, but these are all unique. // Don't use lookupN; it interns the resulting string, but these are all unique.
n := newname(lookup(fmt.Sprintf(".stmp_%d", statuniqgen))) n := newname(lookup(fmt.Sprintf("%s%d", obj.StaticNamePref, statuniqgen)))
statuniqgen++ statuniqgen++
addvar(n, t, PEXTERN) addvar(n, t, PEXTERN)
return n return n

View File

@ -170,6 +170,9 @@ func (ctxt *Link) Globl(s *LSym, size int64, flag int) {
} else if flag&TLSBSS != 0 { } else if flag&TLSBSS != 0 {
s.Type = objabi.STLSBSS s.Type = objabi.STLSBSS
} }
if strings.HasPrefix(s.Name, "\"\"."+StaticNamePref) {
s.Set(AttrStatic, true)
}
} }
// EmitEntryLiveness generates PCDATA Progs after p to switch to the // EmitEntryLiveness generates PCDATA Progs after p to switch to the

View File

@ -264,6 +264,11 @@ func isNonPkgSym(ctxt *Link, s *LSym) bool {
return false return false
} }
// StaticNamePref is the prefix the front end applies to static temporary
// variables. When turned into LSyms, these can be tagged as static so
// as to avoid inserting them into the linker's name lookup tables.
const StaticNamePref = ".stmp_"
type traverseFlag uint32 type traverseFlag uint32
const ( const (