From: Cherry Zhang Date: Fri, 3 Apr 2020 02:47:29 +0000 (-0400) Subject: cmd/link: in stack bound check, don't check a call repetitively X-Git-Tag: go1.15beta1~670 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=e18a5ba0ca142c64aa03c6fb500d69cbbaab1bb6;p=gostls13.git cmd/link: in stack bound check, don't check a call repetitively In stack bound check pass, check a call once, not over and over again. Fix an accidental quadratic behavior... In particular, switching to the new linker caused MIPS builders noticeably slower. This CL fixes it. Change-Id: Idd00c79e80af6278652c92a1d9d7bb2d194e9490 Reviewed-on: https://go-review.googlesource.com/c/go/+/227078 Reviewed-by: Than McIntosh Reviewed-by: Austin Clements --- diff --git a/src/cmd/link/internal/ld/lib.go b/src/cmd/link/internal/ld/lib.go index 3f21fc54ef..f7b8e04ddf 100644 --- a/src/cmd/link/internal/ld/lib.go +++ b/src/cmd/link/internal/ld/lib.go @@ -2360,6 +2360,7 @@ func (sc *stkChk) check(up *chain, depth int) int { relocs := ldr.Relocs(s) var ch1 chain pcsp := obj.NewPCIter(uint32(ctxt.Arch.MinLC)) + ri := 0 for pcsp.Init(info.Pcsp()); !pcsp.Done; pcsp.Next() { // pcsp.value is in effect for [pcsp.pc, pcsp.nextpc). @@ -2370,8 +2371,8 @@ func (sc *stkChk) check(up *chain, depth int) int { } // Process calls in this span. - for i := 0; i < relocs.Count(); i++ { - r := relocs.At2(i) + for ; ri < relocs.Count(); ri++ { + r := relocs.At2(ri) if uint32(r.Off()) >= pcsp.NextPC { break }