]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/internal/dwarf: use []*Var instead of linked lists
authorMatthew Dempsky <mdempsky@google.com>
Mon, 6 Feb 2017 23:52:36 +0000 (15:52 -0800)
committerMatthew Dempsky <mdempsky@google.com>
Tue, 7 Feb 2017 20:17:24 +0000 (20:17 +0000)
Passes toolstash -cmp.

Change-Id: I202b29495ca1aaf3c52879fa99fdc0a4b86703af
Reviewed-on: https://go-review.googlesource.com/36419
Run-TryBot: Matthew Dempsky <mdempsky@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Josh Bleecher Snyder <josharian@gmail.com>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
src/cmd/internal/dwarf/dwarf.go
src/cmd/internal/obj/objfile.go

index 725f5027bb531636d89d31631036e56d85568821..3644146725a3a1a574cbcc925821335b8d463942 100644 (file)
@@ -25,7 +25,6 @@ type Var struct {
        Abbrev int // Either DW_ABRV_AUTO or DW_ABRV_PARAM
        Offset int32
        Type   Sym
-       Link   *Var
 }
 
 // A Context specifies how to add data to a Sym.
@@ -565,7 +564,7 @@ func HasChildren(die *DWDie) bool {
 
 // PutFunc writes a DIE for a function to s.
 // It also writes child DIEs for each variable in vars.
-func PutFunc(ctxt Context, s Sym, name string, external bool, startPC Sym, size int64, vars *Var) {
+func PutFunc(ctxt Context, s Sym, name string, external bool, startPC Sym, size int64, vars []*Var) {
        Uleb128put(ctxt, s, DW_ABRV_FUNCTION)
        putattr(ctxt, s, DW_ABRV_FUNCTION, DW_FORM_string, DW_CLS_STRING, int64(len(name)), name)
        putattr(ctxt, s, DW_ABRV_FUNCTION, DW_FORM_addr, DW_CLS_ADDRESS, 0, startPC)
@@ -576,7 +575,7 @@ func PutFunc(ctxt Context, s Sym, name string, external bool, startPC Sym, size
        }
        putattr(ctxt, s, DW_ABRV_FUNCTION, DW_FORM_flag, DW_CLS_FLAG, ev, 0)
        names := make(map[string]bool)
-       for v := vars; v != nil; v = v.Link {
+       for _, v := range vars {
                if strings.Contains(v.Name, ".autotmp_") {
                        continue
                }
@@ -602,3 +601,11 @@ func PutFunc(ctxt Context, s Sym, name string, external bool, startPC Sym, size
        }
        Uleb128put(ctxt, s, 0)
 }
+
+// VarsByOffset attaches the methods of sort.Interface to []*Var,
+// sorting in increasing Offset.
+type VarsByOffset []*Var
+
+func (s VarsByOffset) Len() int           { return len(s) }
+func (s VarsByOffset) Less(i, j int) bool { return s[i].Offset < s[j].Offset }
+func (s VarsByOffset) Swap(i, j int)      { s[i], s[j] = s[j], s[i] }
index eb56c6f54cdfa27227534aef52739f4a07cf0846..96122fb23352961d4049328f0665af45fbcb71a2 100644 (file)
@@ -561,7 +561,7 @@ func gendwarf(ctxt *Link, text []*LSym) []*LSym {
                dw = append(dw, dsym)
                dsym.Type = SDWARFINFO
                dsym.Set(AttrDuplicateOK, s.DuplicateOK())
-               var vars dwarf.Var
+               var vars []*dwarf.Var
                var abbrev int
                var offs int32
                for a := s.Autom; a != nil; a = a.Link {
@@ -583,23 +583,26 @@ func gendwarf(ctxt *Link, text []*LSym) []*LSym {
                        default:
                                continue
                        }
+
                        typename := dwarf.InfoPrefix + a.Gotype.Name[len("type."):]
-                       dwvar := &dwarf.Var{
+                       vars = append(vars, &dwarf.Var{
                                Name:   a.Asym.Name,
                                Abbrev: abbrev,
-                               Offset: int32(offs),
+                               Offset: offs,
                                Type:   Linklookup(ctxt, typename, 0),
-                       }
-                       dws := &vars.Link
-                       for ; *dws != nil; dws = &(*dws).Link {
-                               if offs <= (*dws).Offset {
-                                       break
-                               }
-                       }
-                       dwvar.Link = *dws
-                       *dws = dwvar
+                       })
                }
-               dwarf.PutFunc(dctxt, dsym, s.Name, s.Version == 0, s, s.Size, vars.Link)
+
+               // We want to sort variables by offset, breaking ties
+               // with declaration order. Autom holds variables in
+               // reverse declaration order, so we reverse the
+               // assembled slice and then apply a stable sort.
+               for i, j := 0, len(vars)-1; i < j; i, j = i+1, j-1 {
+                       vars[i], vars[j] = vars[j], vars[i]
+               }
+               sort.Stable(dwarf.VarsByOffset(vars))
+
+               dwarf.PutFunc(dctxt, dsym, s.Name, s.Version == 0, s, s.Size, vars)
        }
        return dw
 }