]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/internal/obj: sort relocs by off when printing
authorJosh Bleecher Snyder <josharian@gmail.com>
Sun, 13 Mar 2016 17:13:03 +0000 (10:13 -0700)
committerJosh Bleecher Snyder <josharian@gmail.com>
Sun, 13 Mar 2016 20:31:40 +0000 (20:31 +0000)
This makes the output of compiling with -S more
stable in the face of unimportant variation in the
order in which relocs are generated.
It is also more pleasant to read the relocs when
they are sorted.

Also, do some minor cleanup.

For #14786

Change-Id: Id92020b13fd21777dfb5b29c2722c3b2eb27001b
Reviewed-on: https://go-review.googlesource.com/20641
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
src/cmd/internal/obj/objfile.go

index fff2b9d14e7015b585de7ec7e1531db920a21ff4..c2a55aa2b0d2f71c7aa39d2882628147d63bfbe6 100644 (file)
@@ -104,6 +104,7 @@ import (
        "fmt"
        "log"
        "path/filepath"
+       "sort"
        "strings"
 )
 
@@ -417,11 +418,9 @@ func writesym(ctxt *Link, b *Biobuf, s *LSym) {
                        i += 16
                }
 
-               var r *Reloc
-               var name string
-               for i := 0; i < len(s.R); i++ {
-                       r = &s.R[i]
-                       name = ""
+               sort.Sort(relocByOff(s.R)) // generate stable output
+               for _, r := range s.R {
+                       name := ""
                        if r.Sym != nil {
                                name = r.Sym.Name
                        }
@@ -562,3 +561,10 @@ func wrsym(b *Biobuf, s *LSym) {
        wrstring(b, s.Name)
        wrint(b, int64(s.Version))
 }
+
+// relocByOff sorts relocations by their offsets.
+type relocByOff []Reloc
+
+func (x relocByOff) Len() int           { return len(x) }
+func (x relocByOff) Less(i, j int) bool { return x[i].Off < x[j].Off }
+func (x relocByOff) Swap(i, j int)      { x[i], x[j] = x[j], x[i] }