mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
cmd/compile: remove makefuncdatasym_nsym global
This causes a minor reduction in allocations, because the old funcdatasym names were being interned unnecessarily. Updates #15756 name old alloc/op new alloc/op delta Template 39.9MB ± 0% 39.9MB ± 0% ~ (p=0.280 n=10+10) Unicode 29.9MB ± 0% 29.8MB ± 0% -0.26% (p=0.000 n=10+10) GoTypes 113MB ± 0% 113MB ± 0% -0.12% (p=0.000 n=10+10) SSA 855MB ± 0% 855MB ± 0% -0.03% (p=0.001 n=10+10) Flate 25.4MB ± 0% 25.3MB ± 0% -0.30% (p=0.000 n=10+10) GoParser 31.9MB ± 0% 31.8MB ± 0% ~ (p=0.065 n=10+9) Reflect 78.4MB ± 0% 78.2MB ± 0% -0.15% (p=0.000 n=9+10) Tar 26.7MB ± 0% 26.7MB ± 0% -0.17% (p=0.000 n=9+10) XML 42.3MB ± 0% 42.4MB ± 0% +0.07% (p=0.011 n=10+10) name old allocs/op new allocs/op delta Template 390k ± 0% 390k ± 0% ~ (p=0.905 n=9+10) Unicode 319k ± 1% 319k ± 1% ~ (p=0.724 n=10+10) GoTypes 1.14M ± 0% 1.14M ± 0% ~ (p=0.393 n=10+10) SSA 7.60M ± 0% 7.60M ± 0% ~ (p=0.604 n=9+10) Flate 235k ± 1% 234k ± 1% ~ (p=0.105 n=10+10) GoParser 317k ± 0% 316k ± 1% ~ (p=0.280 n=10+10) Reflect 979k ± 0% 979k ± 0% ~ (p=0.315 n=10+10) Tar 251k ± 0% 251k ± 1% ~ (p=0.762 n=8+10) XML 393k ± 0% 394k ± 1% ~ (p=0.095 n=9+10) name old text-bytes new text-bytes delta HelloSize 684k ± 0% 684k ± 0% ~ (all equal) name old data-bytes new data-bytes delta HelloSize 138k ± 0% 138k ± 0% ~ (all equal) name old exe-bytes new exe-bytes delta HelloSize 1.03M ± 0% 1.03M ± 0% ~ (all equal) Change-Id: Idba33da4e89c325984ac46e4852cf12e4a7fd1a9 Reviewed-on: https://go-review.googlesource.com/39032 Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com> Reviewed-by: Robert Griesemer <gri@golang.org>
This commit is contained in:
parent
2f072a427a
commit
4927b9a9ff
3 changed files with 27 additions and 6 deletions
|
|
@ -654,6 +654,7 @@ var knownFormats = map[string]string{
|
||||||
"cmd/compile/internal/syntax.token %s": "",
|
"cmd/compile/internal/syntax.token %s": "",
|
||||||
"cmd/internal/src.Pos %s": "",
|
"cmd/internal/src.Pos %s": "",
|
||||||
"cmd/internal/src.Pos %v": "",
|
"cmd/internal/src.Pos %v": "",
|
||||||
|
"cmd/internal/src.XPos %v": "",
|
||||||
"error %v": "",
|
"error %v": "",
|
||||||
"float64 %.2f": "",
|
"float64 %.2f": "",
|
||||||
"float64 %.3f": "",
|
"float64 %.3f": "",
|
||||||
|
|
|
||||||
|
|
@ -16,11 +16,31 @@ import (
|
||||||
|
|
||||||
// "Portable" code generation.
|
// "Portable" code generation.
|
||||||
|
|
||||||
var makefuncdatasym_nsym int
|
func makefuncdatasym(pp *Progs, nameprefix string, funcdatakind int64, curfn *Node) *Sym {
|
||||||
|
// This symbol requires a unique, reproducible name;
|
||||||
|
// unique to avoid duplicate symbols,
|
||||||
|
// and reproducible for reproducible builds and toolstash.
|
||||||
|
// The function name will usually suffice.
|
||||||
|
suffix := curfn.Func.Nname.Sym.Name
|
||||||
|
if suffix == "_" {
|
||||||
|
// It is possible to have multiple functions called _,
|
||||||
|
// so in this rare case, use instead the function's position.
|
||||||
|
// This formatted string will be meaningless gibberish, but that's ok.
|
||||||
|
// It will be unique and reproducible, and it is rare anyway.
|
||||||
|
// Note that we can't just always use the position;
|
||||||
|
// it is possible to have multiple autogenerated functions at the same position.
|
||||||
|
// Fortunately, no autogenerated functions are called _.
|
||||||
|
if curfn.Pos == autogeneratedPos {
|
||||||
|
Fatalf("autogenerated func _")
|
||||||
|
}
|
||||||
|
suffix = fmt.Sprintf("%v", curfn.Pos)
|
||||||
|
}
|
||||||
|
// Add in the package path as well.
|
||||||
|
// When generating wrappers, we can end up compiling a function belonging
|
||||||
|
// to other packages, which might have a name that collides with one in our package.
|
||||||
|
symname := nameprefix + curfn.Func.Nname.Sym.Pkg.Path + "." + suffix
|
||||||
|
|
||||||
func makefuncdatasym(pp *Progs, nameprefix string, funcdatakind int64) *Sym {
|
sym := lookup(symname)
|
||||||
sym := lookupN(nameprefix, makefuncdatasym_nsym)
|
|
||||||
makefuncdatasym_nsym++
|
|
||||||
p := pp.Prog(obj.AFUNCDATA)
|
p := pp.Prog(obj.AFUNCDATA)
|
||||||
Addrconst(&p.From, funcdatakind)
|
Addrconst(&p.From, funcdatakind)
|
||||||
p.To.Type = obj.TYPE_MEM
|
p.To.Type = obj.TYPE_MEM
|
||||||
|
|
|
||||||
|
|
@ -4274,8 +4274,8 @@ func genssa(f *ssa.Func, pp *Progs) {
|
||||||
e := f.Frontend().(*ssafn)
|
e := f.Frontend().(*ssafn)
|
||||||
|
|
||||||
// Generate GC bitmaps.
|
// Generate GC bitmaps.
|
||||||
gcargs := makefuncdatasym(pp, "gcargs·", obj.FUNCDATA_ArgsPointerMaps)
|
gcargs := makefuncdatasym(pp, "gcargs·", obj.FUNCDATA_ArgsPointerMaps, e.curfn)
|
||||||
gclocals := makefuncdatasym(pp, "gclocals·", obj.FUNCDATA_LocalsPointerMaps)
|
gclocals := makefuncdatasym(pp, "gclocals·", obj.FUNCDATA_LocalsPointerMaps, e.curfn)
|
||||||
s.stackMapIndex = liveness(e, f, gcargs, gclocals)
|
s.stackMapIndex = liveness(e, f, gcargs, gclocals)
|
||||||
|
|
||||||
// Remember where each block starts.
|
// Remember where each block starts.
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue