]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/internal/obj: add Func type to replace "curfn any"
authorMatthew Dempsky <mdempsky@google.com>
Mon, 28 Aug 2023 12:43:51 +0000 (05:43 -0700)
committerGopher Robot <gobot@golang.org>
Tue, 29 Aug 2023 20:19:46 +0000 (20:19 +0000)
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 <cherryyz@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Auto-Submit: Matthew Dempsky <mdempsky@google.com>

src/cmd/compile/internal/dwarfgen/dwarf.go
src/cmd/internal/obj/dwarf.go
src/cmd/internal/obj/link.go
src/cmd/internal/obj/plist.go

index dfb1cfc0d36c0c7902f9f50a19d1face324e7cbb..d81fd7fd00797c677fb28077eaaaeb06a8b15a82 100644 (file)
@@ -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 {
index 482222bb745767859978d753ada98ac4699aca5d..825f0133f1aa651efb45a06a414b95fceecbd93d 100644 (file)
@@ -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)
        }
index f13f9b4c706e6ea6e5937cbb7bf64694a261f861..0b7878656caf751267704fdf66b0746e2a2540d6 100644 (file)
@@ -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
 
index 6aa5888d3db4edd588668e26a5f09593b9dfce7f..cd6e2313ad7aa9a1f55c2d8e0ccde27902a063d7 100644 (file)
@@ -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.