From ad74bc4a92d0c903308b2e40fa07446a735dbbd2 Mon Sep 17 00:00:00 2001 From: Matthew Dempsky Date: Mon, 28 Aug 2023 05:43:51 -0700 Subject: [PATCH] cmd/internal/obj: add Func type to replace "curfn any" This adds a modicum of type safety to these APIs, which are otherwise quite confusing to follow. Change-Id: I268a9a1a99a47dcfef6dc1e9e5be13673af3fb85 Reviewed-on: https://go-review.googlesource.com/c/go/+/523396 Reviewed-by: Cherry Mui LUCI-TryBot-Result: Go LUCI Auto-Submit: Matthew Dempsky --- src/cmd/compile/internal/dwarfgen/dwarf.go | 4 ++-- src/cmd/internal/obj/dwarf.go | 20 +++++++++----------- src/cmd/internal/obj/link.go | 7 ++++++- src/cmd/internal/obj/plist.go | 2 +- 4 files changed, 18 insertions(+), 15 deletions(-) diff --git a/src/cmd/compile/internal/dwarfgen/dwarf.go b/src/cmd/compile/internal/dwarfgen/dwarf.go index dfb1cfc0d36..d81fd7fd007 100644 --- a/src/cmd/compile/internal/dwarfgen/dwarf.go +++ b/src/cmd/compile/internal/dwarfgen/dwarf.go @@ -23,7 +23,7 @@ import ( "cmd/internal/src" ) -func Info(fnsym *obj.LSym, infosym *obj.LSym, curfn interface{}) (scopes []dwarf.Scope, inlcalls dwarf.InlCalls, startPos src.XPos) { +func Info(fnsym *obj.LSym, infosym *obj.LSym, curfn obj.Func) (scopes []dwarf.Scope, inlcalls dwarf.InlCalls) { fn := curfn.(*ir.Func) if fn.Nname != nil { @@ -128,7 +128,7 @@ func Info(fnsym *obj.LSym, infosym *obj.LSym, curfn interface{}) (scopes []dwarf if base.Flag.GenDwarfInl > 0 { inlcalls = assembleInlines(fnsym, dwarfVars) } - return scopes, inlcalls, fn.Pos() + return scopes, inlcalls } func declPos(decl *ir.Name) src.XPos { diff --git a/src/cmd/internal/obj/dwarf.go b/src/cmd/internal/obj/dwarf.go index 482222bb745..825f0133f1a 100644 --- a/src/cmd/internal/obj/dwarf.go +++ b/src/cmd/internal/obj/dwarf.go @@ -345,7 +345,7 @@ func (ctxt *Link) fileSymbol(fn *LSym) *LSym { // populateDWARF fills in the DWARF Debugging Information Entries for // TEXT symbol 's'. The various DWARF symbols must already have been // initialized in InitTextSym. -func (ctxt *Link) populateDWARF(curfn interface{}, s *LSym) { +func (ctxt *Link) populateDWARF(curfn Func, s *LSym) { myimportpath := ctxt.Pkgpath if myimportpath == "" { return @@ -358,9 +358,7 @@ func (ctxt *Link) populateDWARF(curfn interface{}, s *LSym) { var scopes []dwarf.Scope var inlcalls dwarf.InlCalls if ctxt.DebugInfo != nil { - // Don't need startPos because s.Func().StartLine is populated, - // as s is in this package. - scopes, inlcalls, _ = ctxt.DebugInfo(s, info, curfn) + scopes, inlcalls = ctxt.DebugInfo(s, info, curfn) } var err error dwctxt := dwCtxt{ctxt} @@ -427,7 +425,7 @@ func (ctxt *Link) DwarfGlobal(typename string, varSym *LSym) { dwarf.PutGlobal(dwCtxt{ctxt}, dieSym, typeSym, varSym, varname) } -func (ctxt *Link) DwarfAbstractFunc(curfn interface{}, s *LSym) { +func (ctxt *Link) DwarfAbstractFunc(curfn Func, s *LSym) { absfn := ctxt.DwFixups.AbsFuncDwarfSym(s) if absfn.Size != 0 { ctxt.Diag("internal error: DwarfAbstractFunc double process %v", s) @@ -435,8 +433,8 @@ func (ctxt *Link) DwarfAbstractFunc(curfn interface{}, s *LSym) { if s.Func() == nil { s.NewFuncInfo() } - scopes, _, startPos := ctxt.DebugInfo(s, absfn, curfn) - _, startLine := ctxt.getFileSymbolAndLine(startPos) + scopes, _ := ctxt.DebugInfo(s, absfn, curfn) + _, startLine := ctxt.getFileSymbolAndLine(curfn.Pos()) dwctxt := dwCtxt{ctxt} fnstate := dwarf.FnState{ Name: s.Name, @@ -515,8 +513,8 @@ type relFixup struct { } type fnState struct { - // precursor function (really *gc.Node) - precursor interface{} + // precursor function + precursor Func // abstract function symbol absfn *LSym } @@ -529,14 +527,14 @@ func NewDwarfFixupTable(ctxt *Link) *DwarfFixupTable { } } -func (ft *DwarfFixupTable) GetPrecursorFunc(s *LSym) interface{} { +func (ft *DwarfFixupTable) GetPrecursorFunc(s *LSym) Func { if fnstate, found := ft.precursor[s]; found { return fnstate.precursor } return nil } -func (ft *DwarfFixupTable) SetPrecursorFunc(s *LSym, fn interface{}) { +func (ft *DwarfFixupTable) SetPrecursorFunc(s *LSym, fn Func) { if _, found := ft.precursor[s]; found { ft.ctxt.Diag("internal error: DwarfFixupTable.SetPrecursorFunc double call on %v", s) } diff --git a/src/cmd/internal/obj/link.go b/src/cmd/internal/obj/link.go index f13f9b4c706..0b7878656ca 100644 --- a/src/cmd/internal/obj/link.go +++ b/src/cmd/internal/obj/link.go @@ -1001,6 +1001,11 @@ type RegSpill struct { Spill, Unspill As } +// A Func represents a Go function. If non-nil, it must be a *ir.Func. +type Func interface { + Pos() src.XPos +} + // Link holds the context for writing object code from a compiler // to be linker input or for reading that input into the linker. type Link struct { @@ -1030,7 +1035,7 @@ type Link struct { Imports []goobj.ImportedPkg DiagFunc func(string, ...interface{}) DiagFlush func() - DebugInfo func(fn *LSym, info *LSym, curfn interface{}) ([]dwarf.Scope, dwarf.InlCalls, src.XPos) // if non-nil, curfn is a *ir.Func + DebugInfo func(fn *LSym, info *LSym, curfn Func) ([]dwarf.Scope, dwarf.InlCalls) GenAbstractFunc func(fn *LSym) Errors int diff --git a/src/cmd/internal/obj/plist.go b/src/cmd/internal/obj/plist.go index 6aa5888d3db..cd6e2313ad7 100644 --- a/src/cmd/internal/obj/plist.go +++ b/src/cmd/internal/obj/plist.go @@ -14,7 +14,7 @@ import ( type Plist struct { Firstpc *Prog - Curfn interface{} // holds a *gc.Node, if non-nil + Curfn Func } // ProgAlloc is a function that allocates Progs.