]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: thread Curfn through to debuginfo
authorJosh Bleecher Snyder <josharian@gmail.com>
Thu, 23 Mar 2017 23:39:04 +0000 (16:39 -0700)
committerJosh Bleecher Snyder <josharian@gmail.com>
Fri, 24 Mar 2017 16:22:58 +0000 (16:22 +0000)
Updates #15756

Change-Id: I860dd45cae9d851c7844654621bbc99efe7c7f03
Reviewed-on: https://go-review.googlesource.com/38591
Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
src/cmd/compile/internal/gc/gsubr.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 20a52f35d267aaf7fb68984f6d4f3657fb5b31b4..8b41569430421cf7cbe1cee26df27bef5a41c5e3 100644 (file)
@@ -37,15 +37,17 @@ import (
 
 // Progs accumulates Progs for a function and converts them into machine code.
 type Progs struct {
-       Text *obj.Prog // ATEXT Prog for this function
-       next *obj.Prog // next Prog
-       pc   int64     // virtual PC; count of Progs
-       pos  src.XPos  // position to use for new Progs
+       Text  *obj.Prog // ATEXT Prog for this function
+       next  *obj.Prog // next Prog
+       pc    int64     // virtual PC; count of Progs
+       pos   src.XPos  // position to use for new Progs
+       curfn *Node     // fn these Progs are for
 }
 
 // newProgs returns a new Progs for fn.
 func newProgs(fn *Node) *Progs {
        pp := new(Progs)
+       pp.curfn = fn
 
        // prime the pump
        pp.next = Ctxt.NewProg()
@@ -58,7 +60,7 @@ func newProgs(fn *Node) *Progs {
 
 // Flush converts from pp to machine code.
 func (pp *Progs) Flush() {
-       plist := &obj.Plist{Firstpc: pp.Text}
+       plist := &obj.Plist{Firstpc: pp.Text, Curfn: pp.curfn}
        obj.Flushplist(Ctxt, plist)
        // Clear pp to enable GC and avoid abuse.
        *pp = Progs{}
index 6f005237ca82f64b37a915fee37a266dfc013e4b..be7d44a42f08978399bea6ec735d380f9996e7c6 100644 (file)
@@ -310,13 +310,14 @@ func compile(fn *Node) {
        pp.Flush()
 }
 
-func debuginfo(fnsym *obj.LSym) []*dwarf.Var {
-       if expect := Linksym(Curfn.Func.Nname.Sym); fnsym != expect {
+func debuginfo(fnsym *obj.LSym, curfn interface{}) []*dwarf.Var {
+       fn := curfn.(*Node)
+       if expect := Linksym(fn.Func.Nname.Sym); fnsym != expect {
                Fatalf("unexpected fnsym: %v != %v", fnsym, expect)
        }
 
        var vars []*dwarf.Var
-       for _, n := range Curfn.Func.Dcl {
+       for _, n := range fn.Func.Dcl {
                if n.Op != ONAME { // might be OTYPE or OLITERAL
                        continue
                }
index 640716c171248d493b6fa2fcd8a72c0f8c6668f3..e7a4301c7d606dc1b3592518c122096cd811c4e4 100644 (file)
@@ -746,7 +746,7 @@ type Link struct {
        Armsize       int32
        Pc            int64
        DiagFunc      func(string, ...interface{})
-       DebugInfo     func(fn *LSym) []*dwarf.Var
+       DebugInfo     func(fn *LSym, curfn interface{}) []*dwarf.Var // if non-nil, curfn is a *gc.Node
        Cursym        *LSym
        Version       int
        Errors        int
index 150c46752c56e8cc9068a9e8bb469cc0c8a4841b..5bef20ad3750b5a485fd994672e9a09493c96021 100644 (file)
@@ -553,7 +553,7 @@ func (c dwCtxt) AddSectionOffset(s dwarf.Sym, size int, t interface{}, ofs int64
 
 // makeFuncDebugEntry makes a DWARF Debugging Information Entry
 // for TEXT symbol s.
-func makeFuncDebugEntry(ctxt *Link, s *LSym) {
+func makeFuncDebugEntry(ctxt *Link, curfn interface{}, s *LSym) {
        dsym := Linklookup(ctxt, dwarf.InfoPrefix+s.Name, int(s.Version))
        if dsym.Size != 0 {
                return
@@ -562,7 +562,7 @@ func makeFuncDebugEntry(ctxt *Link, s *LSym) {
        dsym.Set(AttrDuplicateOK, s.DuplicateOK())
        var vars []*dwarf.Var
        if ctxt.DebugInfo != nil {
-               vars = ctxt.DebugInfo(s)
+               vars = ctxt.DebugInfo(s, curfn)
        }
        dwarf.PutFunc(dwCtxt{ctxt}, dsym, s.Name, s.Version == 0, s, s.Size, vars)
        ctxt.Data = append(ctxt.Data, dsym)
index 6b2ae8bb9e7b52565cb2c4d6c2cfe27d932fbff7..36583c3f42fe85e425d8dec26a1c0ecabd7ef087 100644 (file)
@@ -12,6 +12,7 @@ import (
 
 type Plist struct {
        Firstpc *Prog
+       Curfn   interface{} // holds a *gc.Node, if non-nil
 }
 
 func Flushplist(ctxt *Link, plist *Plist) {
@@ -127,7 +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)
+               makeFuncDebugEntry(ctxt, plist.Curfn, s)
                if freeProgs {
                        s.Text = nil
                }