]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/link: use uint32 as symbol index
authorCherry Mui <cherryyz@google.com>
Fri, 21 Apr 2023 16:02:30 +0000 (12:02 -0400)
committerCherry Mui <cherryyz@google.com>
Mon, 24 Apr 2023 16:49:08 +0000 (16:49 +0000)
Currently, a symbol's global index, the Sym type, is defined as an
int, which is 64-bit on 64-bit machines. We're unlikely to have
more than 4 billion symbols in the near future. Even if we will,
we will probably hit some other limit (e.g. section size) before
the symbol number limit. Use a 32-bit type to reduce memory usage.

E,g, linking cmd/compile in external linking mode (on macOS/amd64)

Munmap_GC    43.2M ± 0%     35.5M ± 1%   -17.74%  (p=0.000 n=16+20)

This brings the memory usage back before the previous CL, and even
lower.

Change-Id: Ie185f1586638fe70d8121312bfa9410942d518c7
Reviewed-on: https://go-review.googlesource.com/c/go/+/487416
Reviewed-by: Austin Clements <austin@google.com>
Run-TryBot: Cherry Mui <cherryyz@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Than McIntosh <thanm@google.com>
src/cmd/link/internal/ld/stackcheck.go
src/cmd/link/internal/loader/loader.go

index 24a96fb996810e5f92a763240b04f1747ba10d91..98e7edaeb1477b4d5c8136e51954f961b778639d 100644 (file)
@@ -42,7 +42,7 @@ const stackCheckCycle int16 = 1<<15 - 1
 
 // stackCheckIndirect is a sentinel Sym value used to represent the
 // target of an indirect/closure call.
-const stackCheckIndirect loader.Sym = -1
+const stackCheckIndirect loader.Sym = ^loader.Sym(0)
 
 // doStackCheck walks the call tree to check that there is always
 // enough stack space for call frames, especially for a chain of
index 1dea66393db2d94fa196c5f63263f171edfc051e..455ef587d1c2934e5022bfc6642ceb5953f403df 100644 (file)
@@ -27,7 +27,7 @@ var _ = fmt.Print
 
 // Sym encapsulates a global symbol index, used to identify a specific
 // Go symbol. The 0-valued Sym is corresponds to an invalid symbol.
-type Sym int
+type Sym uint32
 
 // Relocs encapsulates the set of relocations on a given symbol; an
 // instance of this type is returned by the Loader Relocs() method.
@@ -364,6 +364,9 @@ func (st *loadState) addSym(name string, ver int, r *oReader, li uint32, kind in
                panic("addSym called after external symbol is created")
        }
        i := Sym(len(l.objSyms))
+       if int(i) != len(l.objSyms) { // overflow
+               panic("too many symbols")
+       }
        addToGlobal := func() {
                l.objSyms = append(l.objSyms, objSym{r.objidx, li})
        }
@@ -485,6 +488,9 @@ func (st *loadState) addSym(name string, ver int, r *oReader, li uint32, kind in
 // name/version.
 func (l *Loader) newExtSym(name string, ver int) Sym {
        i := Sym(len(l.objSyms))
+       if int(i) != len(l.objSyms) { // overflow
+               panic("too many symbols")
+       }
        if l.extStart == 0 {
                l.extStart = i
        }