]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/internal/obj: move dwarf.Var generation into compiler
authorMatthew Dempsky <mdempsky@google.com>
Mon, 6 Mar 2017 15:32:37 +0000 (07:32 -0800)
committerMatthew Dempsky <mdempsky@google.com>
Tue, 7 Mar 2017 17:32:54 +0000 (17:32 +0000)
Passes toolstash -cmp.

Change-Id: I4bd60f7ebba5457e7b3ece688fee2351bfeeb59a
Reviewed-on: https://go-review.googlesource.com/37874
Run-TryBot: Matthew Dempsky <mdempsky@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Alessandro Arzilli <alessandro.arzilli@gmail.com>
Reviewed-by: Than McIntosh <thanm@google.com>
src/cmd/compile/fmt_test.go
src/cmd/compile/internal/gc/main.go
src/cmd/compile/internal/gc/pgen.go
src/cmd/internal/obj/link.go
src/cmd/internal/obj/objfile.go
src/cmd/internal/obj/plist.go

index 544179e414ad4cba7c3565a943a31448df55b813..ab223aaed0d7bc1d7b4dcb6694299c522b4c2206 100644 (file)
@@ -592,6 +592,7 @@ var knownFormats = map[string]string{
        "*cmd/compile/internal/ssa.Value %v":              "",
        "*cmd/compile/internal/ssa.sparseTreeMapEntry %v": "",
        "*cmd/internal/obj.Addr %v":                       "",
+       "*cmd/internal/obj.LSym %v":                       "",
        "*cmd/internal/obj.Prog %p":                       "",
        "*cmd/internal/obj.Prog %s":                       "",
        "*cmd/internal/obj.Prog %v":                       "",
index 490ac7db406e12059626f0dfea6f9ce64dd01ceb..2c4615cba11eeccb6065735b61968de5a8be99cf 100644 (file)
@@ -113,6 +113,7 @@ func Main() {
        defer hidePanic()
 
        Ctxt = obj.Linknew(Thearch.LinkArch)
+       Ctxt.DebugInfo = debuginfo
        Ctxt.DiagFunc = yyerror
        Ctxt.Bso = bufio.NewWriter(os.Stdout)
 
index 29d146c9cc09dbf9ff2f5f8f2472f52aa4a80f67..33811b80c298de0dd9d6538f0473d052f63ec5a1 100644 (file)
@@ -6,6 +6,7 @@ package gc
 
 import (
        "cmd/compile/internal/ssa"
+       "cmd/internal/dwarf"
        "cmd/internal/obj"
        "cmd/internal/src"
        "cmd/internal/sys"
@@ -420,8 +421,6 @@ func compile(fn *Node) {
        gcargs := makefuncdatasym("gcargs·", obj.FUNCDATA_ArgsPointerMaps)
        gclocals := makefuncdatasym("gclocals·", obj.FUNCDATA_LocalsPointerMaps)
 
-       gendebug(fnsym, fn.Func.Dcl)
-
        genssa(ssafn, ptxt, gcargs, gclocals)
        ssafn.Free()
 
@@ -431,42 +430,67 @@ func compile(fn *Node) {
        fieldtrack(fnsym, fn.Func.FieldTrack)
 }
 
-func gendebug(fnsym *obj.LSym, decls []*Node) {
-       if fnsym == nil {
-               return
-       }
-
-       if fnsym.FuncInfo == nil {
-               fnsym.FuncInfo = new(obj.FuncInfo)
+func debuginfo(fnsym *obj.LSym) []*dwarf.Var {
+       if expect := Linksym(Curfn.Func.Nname.Sym); fnsym != expect {
+               Fatalf("unexpected fnsym: %v != %v", fnsym, expect)
        }
 
-       for _, n := range decls {
+       var vars []*dwarf.Var
+       for _, n := range Curfn.Func.Dcl {
                if n.Op != ONAME { // might be OTYPE or OLITERAL
                        continue
                }
 
                var name obj.AddrName
+               var abbrev int
+               offs := n.Xoffset
+
                switch n.Class {
                case PAUTO:
                        if !n.Used() {
                                continue
                        }
                        name = obj.NAME_AUTO
+
+                       abbrev = dwarf.DW_ABRV_AUTO
+                       if Ctxt.FixedFrameSize() == 0 {
+                               offs -= int64(Widthptr)
+                       }
+                       if obj.Framepointer_enabled(obj.GOOS, obj.GOARCH) {
+                               offs -= int64(Widthptr)
+                       }
+
                case PPARAM, PPARAMOUT:
                        name = obj.NAME_PARAM
+
+                       abbrev = dwarf.DW_ABRV_PARAM
+                       offs += Ctxt.FixedFrameSize()
+
                default:
                        continue
                }
 
-               a := &obj.Auto{
+               gotype := Linksym(ngotype(n))
+               fnsym.Autom = append(fnsym.Autom, &obj.Auto{
                        Asym:    obj.Linklookup(Ctxt, n.Sym.Name, 0),
                        Aoffset: int32(n.Xoffset),
                        Name:    name,
-                       Gotype:  Linksym(ngotype(n)),
-               }
+                       Gotype:  gotype,
+               })
 
-               fnsym.Autom = append(fnsym.Autom, a)
+               typename := dwarf.InfoPrefix + gotype.Name[len("type."):]
+               vars = append(vars, &dwarf.Var{
+                       Name:   n.Sym.Name,
+                       Abbrev: abbrev,
+                       Offset: int32(offs),
+                       Type:   obj.Linklookup(Ctxt, typename, 0),
+               })
        }
+
+       // Stable sort so that ties are broken with declaration order.
+       sort.Stable(dwarf.VarsByOffset(vars))
+
+       return vars
 }
 
 // fieldtrack adds R_USEFIELD relocations to fnsym to record any
index 62e960895416dd5173bba9202c9664a66a136d12..e55af81c989c0d810bb073592077862a3f3dfe32 100644 (file)
@@ -32,6 +32,7 @@ package obj
 
 import (
        "bufio"
+       "cmd/internal/dwarf"
        "cmd/internal/src"
        "cmd/internal/sys"
        "fmt"
@@ -752,6 +753,7 @@ type Link struct {
        Armsize       int32
        Pc            int64
        DiagFunc      func(string, ...interface{})
+       DebugInfo     func(fn *LSym) []*dwarf.Var
        Mode          int
        Cursym        *LSym
        Version       int
index 1bd4f53ae46c72cd8ceac2ff4684fbe10253f4e1..9a208b20b1edd5f968155061f8e4fc7d5f0a4d00 100644 (file)
@@ -551,54 +551,19 @@ func (c dwCtxt) AddSectionOffset(s dwarf.Sym, size int, t interface{}, ofs int64
        r.Type = R_DWARFREF
 }
 
-func gendwarf(ctxt *Link, text []*LSym) []*LSym {
-       dctxt := dwCtxt{ctxt}
-       var dw []*LSym
-
-       for _, s := range text {
-               dsym := Linklookup(ctxt, dwarf.InfoPrefix+s.Name, int(s.Version))
-               if dsym.Size != 0 {
-                       continue
-               }
-               dw = append(dw, dsym)
-               dsym.Type = SDWARFINFO
-               dsym.Set(AttrDuplicateOK, s.DuplicateOK())
-               var vars []*dwarf.Var
-               var abbrev int
-               var offs int32
-               for _, a := range s.Autom {
-                       switch a.Name {
-                       case NAME_AUTO:
-                               abbrev = dwarf.DW_ABRV_AUTO
-                               offs = a.Aoffset
-                               if ctxt.FixedFrameSize() == 0 {
-                                       offs -= int32(ctxt.Arch.PtrSize)
-                               }
-                               if Framepointer_enabled(GOOS, GOARCH) {
-                                       offs -= int32(ctxt.Arch.PtrSize)
-                               }
-
-                       case NAME_PARAM:
-                               abbrev = dwarf.DW_ABRV_PARAM
-                               offs = a.Aoffset + int32(ctxt.FixedFrameSize())
-
-                       default:
-                               continue
-                       }
-
-                       typename := dwarf.InfoPrefix + a.Gotype.Name[len("type."):]
-                       vars = append(vars, &dwarf.Var{
-                               Name:   a.Asym.Name,
-                               Abbrev: abbrev,
-                               Offset: offs,
-                               Type:   Linklookup(ctxt, typename, 0),
-                       })
-               }
-
-               // Stable sort so that ties are broken with declaration order.
-               sort.Stable(dwarf.VarsByOffset(vars))
-
-               dwarf.PutFunc(dctxt, dsym, s.Name, s.Version == 0, s, s.Size, vars)
+// makeFuncDebugEntry makes a DWARF Debugging Information Entry
+// for TEXT symbol s.
+func makeFuncDebugEntry(ctxt *Link, s *LSym) {
+       dsym := Linklookup(ctxt, dwarf.InfoPrefix+s.Name, int(s.Version))
+       if dsym.Size != 0 {
+               return
+       }
+       dsym.Type = SDWARFINFO
+       dsym.Set(AttrDuplicateOK, s.DuplicateOK())
+       var vars []*dwarf.Var
+       if ctxt.DebugInfo != nil {
+               vars = ctxt.DebugInfo(s)
        }
-       return dw
+       dwarf.PutFunc(dwCtxt{ctxt}, dsym, s.Name, s.Version == 0, s, s.Size, vars)
+       ctxt.Data = append(ctxt.Data, dsym)
 }
index 8532bbc1d49c0af9eed76ace790079e1bfd85f61..4ff71632a04094a43a4ad8cbfb2c3778a2362296 100644 (file)
@@ -128,6 +128,7 @@ func flushplist(ctxt *Link, plist *Plist, freeProgs bool) {
                ctxt.Arch.Preprocess(ctxt, s)
                ctxt.Arch.Assemble(ctxt, s)
                linkpcln(ctxt, s)
+               makeFuncDebugEntry(ctxt, s)
                if freeProgs {
                        s.Text = nil
                }
@@ -135,7 +136,6 @@ func flushplist(ctxt *Link, plist *Plist, freeProgs bool) {
 
        // Add to running list in ctxt.
        ctxt.Text = append(ctxt.Text, text...)
-       ctxt.Data = append(ctxt.Data, gendwarf(ctxt, text)...)
        ctxt.Curp = nil
        if freeProgs {
                ctxt.freeProgs()