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>
"*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": "",
defer hidePanic()
Ctxt = obj.Linknew(Thearch.LinkArch)
+ Ctxt.DebugInfo = debuginfo
Ctxt.DiagFunc = yyerror
Ctxt.Bso = bufio.NewWriter(os.Stdout)
import (
"cmd/compile/internal/ssa"
+ "cmd/internal/dwarf"
"cmd/internal/obj"
"cmd/internal/src"
"cmd/internal/sys"
gcargs := makefuncdatasym("gcargs·", obj.FUNCDATA_ArgsPointerMaps)
gclocals := makefuncdatasym("gclocals·", obj.FUNCDATA_LocalsPointerMaps)
- gendebug(fnsym, fn.Func.Dcl)
-
genssa(ssafn, ptxt, gcargs, gclocals)
ssafn.Free()
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
import (
"bufio"
+ "cmd/internal/dwarf"
"cmd/internal/src"
"cmd/internal/sys"
"fmt"
Armsize int32
Pc int64
DiagFunc func(string, ...interface{})
+ DebugInfo func(fn *LSym) []*dwarf.Var
Mode int
Cursym *LSym
Version int
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)
}
ctxt.Arch.Preprocess(ctxt, s)
ctxt.Arch.Assemble(ctxt, s)
linkpcln(ctxt, s)
+ makeFuncDebugEntry(ctxt, s)
if freeProgs {
s.Text = nil
}
// 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()