]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/internal/obj: move STEXT-only LSym fields into new FuncInfo struct
authorMatthew Dempsky <mdempsky@google.com>
Sat, 4 Mar 2017 00:45:21 +0000 (16:45 -0800)
committerMatthew Dempsky <mdempsky@google.com>
Mon, 6 Mar 2017 22:17:23 +0000 (22:17 +0000)
Shrinks LSym somewhat for non-STEXT LSyms, which are much more common.

While here, switch to tracking Automs in a slice instead of a linked
list. (Previously, this would have made LSyms larger.)

Passes toolstash-check.

Change-Id: I082e50e1d1f1b544c9e06b6e412a186be6a4a2b5
Reviewed-on: https://go-review.googlesource.com/37872
Reviewed-by: Josh Bleecher Snyder <josharian@gmail.com>
src/cmd/compile/internal/gc/pgen.go
src/cmd/internal/obj/link.go
src/cmd/internal/obj/objfile.go
src/cmd/internal/obj/pcln.go
src/cmd/internal/obj/plist.go
src/cmd/internal/obj/sizeof_test.go

index 9719a8c4062fd4cca7d15de8b5d18b3a6eb4c0ef..d2f68b7c33f47f48dfa8a33939ec3bf392951ca5 100644 (file)
@@ -436,6 +436,10 @@ func gendebug(fnsym *obj.LSym, decls []*Node) {
                return
        }
 
+       if fnsym.FuncInfo == nil {
+               fnsym.FuncInfo = new(obj.FuncInfo)
+       }
+
        for _, n := range decls {
                if n.Op != ONAME { // might be OTYPE or OLITERAL
                        continue
@@ -461,8 +465,13 @@ func gendebug(fnsym *obj.LSym, decls []*Node) {
                        Gotype:  Linksym(ngotype(n)),
                }
 
-               a.Link = fnsym.Autom
-               fnsym.Autom = a
+               fnsym.Autom = append(fnsym.Autom, a)
+       }
+
+       // Reverse to make toolstash happy.
+       // TODO(mdempsky): Remove.
+       for i, j := 0, len(fnsym.Autom)-1; i < j; i, j = i+1, j-1 {
+               fnsym.Autom[i], fnsym.Autom[j] = fnsym.Autom[j], fnsym.Autom[i]
        }
 }
 
index a9881166a1b63164cfd818c7718a399a586cd984..62e960895416dd5173bba9202c9664a66a136d12 100644 (file)
@@ -326,15 +326,22 @@ type LSym struct {
        Attribute
 
        RefIdx int // Index of this symbol in the symbol reference list.
-       Args   int32
-       Locals int32
        Size   int64
        Gotype *LSym
-       Autom  *Auto
-       Text   *Prog
-       Pcln   *Pcln
        P      []byte
        R      []Reloc
+
+       // TODO(mdempsky): De-anonymize field.
+       *FuncInfo
+}
+
+// A FuncInfo contains extra fields for STEXT symbols.
+type FuncInfo struct {
+       Args   int32
+       Locals int32
+       Text   *Prog
+       Autom  []*Auto
+       Pcln   Pcln
 }
 
 // Attribute is a set of symbol attributes.
@@ -691,7 +698,6 @@ func (r RelocType) IsDirectJump() bool {
 
 type Auto struct {
        Asym    *LSym
-       Link    *Auto
        Aoffset int32
        Name    AddrName
        Gotype  *LSym
index a30fe39fc280d6fa0d5dd86af377a1c37510e92b..fbf4d4b244746b711076e81f64a53d50e0fdf6ef 100644 (file)
@@ -153,7 +153,7 @@ func (w *objWriter) addLengths(s *LSym) {
                return
        }
 
-       pc := s.Pcln
+       pc := &s.Pcln
 
        data := 0
        data += len(pc.Pcsp.P)
@@ -167,11 +167,7 @@ func (w *objWriter) addLengths(s *LSym) {
        w.nData += data
        w.nPcdata += len(pc.Pcdata)
 
-       autom := 0
-       for a := s.Autom; a != nil; a = a.Link {
-               autom++
-       }
-       w.nAutom += autom
+       w.nAutom += len(s.Autom)
        w.nFuncdata += len(pc.Funcdataoff)
        w.nFile += len(pc.File)
 }
@@ -227,7 +223,7 @@ func WriteObjFile(ctxt *Link, b *bufio.Writer) {
        // Data block
        for _, s := range ctxt.Text {
                w.wr.Write(s.P)
-               pc := s.Pcln
+               pc := &s.Pcln
                w.wr.Write(pc.Pcsp.P)
                w.wr.Write(pc.Pcfile.P)
                w.wr.Write(pc.Pcline.P)
@@ -294,11 +290,11 @@ func (w *objWriter) writeRefs(s *LSym) {
        }
 
        if s.Type == STEXT {
-               for a := s.Autom; a != nil; a = a.Link {
+               for _, a := range s.Autom {
                        w.writeRef(a.Asym, false)
                        w.writeRef(a.Gotype, false)
                }
-               pc := s.Pcln
+               pc := &s.Pcln
                for _, d := range pc.Funcdata {
                        w.writeRef(d, false)
                }
@@ -338,15 +334,15 @@ func (w *objWriter) writeSymDebug(s *LSym) {
                        fmt.Fprintf(ctxt.Bso, " leaf")
                }
        }
-
        fmt.Fprintf(ctxt.Bso, "\n")
-       for p := s.Text; p != nil; p = p.Link {
-               fmt.Fprintf(ctxt.Bso, "\t%#04x %v\n", uint(int(p.Pc)), p)
+       if s.Type == STEXT {
+               for p := s.Text; p != nil; p = p.Link {
+                       fmt.Fprintf(ctxt.Bso, "\t%#04x %v\n", uint(int(p.Pc)), p)
+               }
        }
-       var c int
-       var j int
-       for i := 0; i < len(s.P); {
+       for i := 0; i < len(s.P); i += 16 {
                fmt.Fprintf(ctxt.Bso, "\t%#04x", uint(i))
+               j := i
                for j = i; j < i+16 && j < len(s.P); j++ {
                        fmt.Fprintf(ctxt.Bso, " %02x", s.P[j])
                }
@@ -355,7 +351,7 @@ func (w *objWriter) writeSymDebug(s *LSym) {
                }
                fmt.Fprintf(ctxt.Bso, "  ")
                for j = i; j < i+16 && j < len(s.P); j++ {
-                       c = int(s.P[j])
+                       c := int(s.P[j])
                        if ' ' <= c && c <= 0x7e {
                                fmt.Fprintf(ctxt.Bso, "%c", c)
                        } else {
@@ -364,7 +360,6 @@ func (w *objWriter) writeSymDebug(s *LSym) {
                }
 
                fmt.Fprintf(ctxt.Bso, "\n")
-               i += 16
        }
 
        sort.Sort(relocByOff(s.R)) // generate stable output
@@ -440,12 +435,8 @@ func (w *objWriter) writeSym(s *LSym) {
                flags |= 1 << 2
        }
        w.writeInt(flags)
-       n := 0
-       for a := s.Autom; a != nil; a = a.Link {
-               n++
-       }
-       w.writeInt(int64(n))
-       for a := s.Autom; a != nil; a = a.Link {
+       w.writeInt(int64(len(s.Autom)))
+       for _, a := range s.Autom {
                w.writeRefIndex(a.Asym)
                w.writeInt(int64(a.Aoffset))
                if a.Name == NAME_AUTO {
@@ -458,7 +449,7 @@ func (w *objWriter) writeSym(s *LSym) {
                w.writeRefIndex(a.Gotype)
        }
 
-       pc := s.Pcln
+       pc := &s.Pcln
        w.writeInt(int64(len(pc.Pcsp.P)))
        w.writeInt(int64(len(pc.Pcfile.P)))
        w.writeInt(int64(len(pc.Pcline.P)))
@@ -575,7 +566,7 @@ func gendwarf(ctxt *Link, text []*LSym) []*LSym {
                var vars []*dwarf.Var
                var abbrev int
                var offs int32
-               for a := s.Autom; a != nil; a = a.Link {
+               for _, a := range s.Autom {
                        switch a.Name {
                        case NAME_AUTO:
                                abbrev = dwarf.DW_ABRV_AUTO
index 3ed146aceafc797103509a565f57b60fdc103149..2395c6ed0e828c1843fbeebf00be588dacf6deb9 100644 (file)
@@ -254,8 +254,7 @@ func pctopcdata(ctxt *Link, sym *LSym, oldval int32, p *Prog, phase int32, arg i
 func linkpcln(ctxt *Link, cursym *LSym) {
        ctxt.Cursym = cursym
 
-       pcln := new(Pcln)
-       cursym.Pcln = pcln
+       pcln := &cursym.Pcln
 
        npcdata := 0
        nfuncdata := 0
index 8584020f04b6e485dcd7661040bc3954cca38483..8532bbc1d49c0af9eed76ace790079e1bfd85f61 100644 (file)
@@ -46,6 +46,9 @@ func flushplist(ctxt *Link, plist *Plist, freeProgs bool) {
 
                                continue
                        }
+                       if s.FuncInfo == nil {
+                               s.FuncInfo = new(FuncInfo)
+                       }
 
                        if s.Text != nil {
                                log.Fatalf("duplicate TEXT for %s", s.Name)
index 8051715989e8678d8310dd2f163171c5395926c5..5d5a710290a6a7c523db26118ff016b849f760cd 100644 (file)
@@ -23,7 +23,7 @@ func TestSizeof(t *testing.T) {
                _64bit uintptr     // size on 64bit platforms
        }{
                {Addr{}, 40, 64},
-               {LSym{}, 76, 128},
+               {LSym{}, 60, 104},
                {Prog{}, 148, 232},
        }