1
0
mirror of https://github.com/golang/go synced 2024-11-24 07:50:13 -07:00

cmd/compile: thread Curfn through to debuginfo

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>
This commit is contained in:
Josh Bleecher Snyder 2017-03-23 16:39:04 -07:00
parent 3a1ce1085a
commit 6652572b75
5 changed files with 16 additions and 12 deletions

View 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{}

View 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
}

View 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

View 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)

View 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
}