]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/link: in stack bound check, don't check a call repetitively
authorCherry Zhang <cherryyz@google.com>
Fri, 3 Apr 2020 02:47:29 +0000 (22:47 -0400)
committerCherry Zhang <cherryyz@google.com>
Fri, 3 Apr 2020 14:12:25 +0000 (14:12 +0000)
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 <thanm@google.com>
Reviewed-by: Austin Clements <austin@google.com>
src/cmd/link/internal/ld/lib.go

index 3f21fc54ef6b6d9179ad6854b5c504481a1a1d53..f7b8e04ddfde447e543bd5028608da771f7383ef 100644 (file)
@@ -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
                        }