From e18a5ba0ca142c64aa03c6fb500d69cbbaab1bb6 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Thu, 2 Apr 2020 22:47:29 -0400 Subject: [PATCH] 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 --- src/cmd/link/internal/ld/lib.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) 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 }