diff options
Diffstat (limited to 'src/cmd/internal')
| -rw-r--r-- | src/cmd/internal/obj/link.go | 2 | ||||
| -rw-r--r-- | src/cmd/internal/obj/objfile.go | 63 | ||||
| -rw-r--r-- | src/cmd/internal/obj/plist.go | 2 |
3 files changed, 17 insertions, 50 deletions
diff --git a/src/cmd/internal/obj/link.go b/src/cmd/internal/obj/link.go index 62e9608954..e55af81c98 100644 --- a/src/cmd/internal/obj/link.go +++ b/src/cmd/internal/obj/link.go @@ -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 diff --git a/src/cmd/internal/obj/objfile.go b/src/cmd/internal/obj/objfile.go index 1bd4f53ae4..9a208b20b1 100644 --- a/src/cmd/internal/obj/objfile.go +++ b/src/cmd/internal/obj/objfile.go @@ -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) } diff --git a/src/cmd/internal/obj/plist.go b/src/cmd/internal/obj/plist.go index 8532bbc1d4..4ff71632a0 100644 --- a/src/cmd/internal/obj/plist.go +++ b/src/cmd/internal/obj/plist.go @@ -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() |
