From 489868f7769be02cd5f222754f26ac2aa70c64f3 Mon Sep 17 00:00:00 2001 From: Derek Parker Date: Wed, 23 Jul 2025 17:52:35 +0000 Subject: [PATCH] cmd/link: scope test to linux & net.sendFile Limits the scope of new test added in 71c2bf551303930faa32886446910fa5bd0a701a. Discussion: https://go-review.googlesource.com/c/go/+/684377. Change-Id: I0e8f513eb564aae277ba8a80ebdad469eb1e6e6a GitHub-Last-Rev: add2b2e2096e5221ac3d54376c1afa1bec10482c GitHub-Pull-Request: golang/go#74720 Reviewed-on: https://go-review.googlesource.com/c/go/+/689916 Reviewed-by: Keith Randall Auto-Submit: Keith Randall LUCI-TryBot-Result: Go LUCI Reviewed-by: Michael Knyszek Reviewed-by: Keith Randall --- src/cmd/compile/internal/dwarfgen/dwarf.go | 4 +-- src/cmd/link/dwarf_test.go | 36 +++++++++------------- 2 files changed, 17 insertions(+), 23 deletions(-) diff --git a/src/cmd/compile/internal/dwarfgen/dwarf.go b/src/cmd/compile/internal/dwarfgen/dwarf.go index af2b191010..7d75c0c5ce 100644 --- a/src/cmd/compile/internal/dwarfgen/dwarf.go +++ b/src/cmd/compile/internal/dwarfgen/dwarf.go @@ -278,7 +278,7 @@ func createDwarfVars(fnsym *obj.LSym, complexOK bool, fn *ir.Func, apDecls []*ir base.Fatalf("invalid heap allocated var without Heapaddr") } debug := fn.DebugInfo.(*ssa.FuncDebug) - list := createHeapDerefLocationList(n, fnsym, debug.EntryID, ssa.FuncEnd.ID) + list := createHeapDerefLocationList(n, debug.EntryID) dvar.PutLocationList = func(listSym, startPC dwarf.Sym) { debug.PutLocationList(list, base.Ctxt, listSym.(*obj.LSym), startPC.(*obj.LSym)) } @@ -558,7 +558,7 @@ func createComplexVar(fnsym *obj.LSym, fn *ir.Func, varID ssa.VarID, closureVars // createHeapDerefLocationList creates a location list for a heap-escaped variable // that describes "dereference pointer at stack offset" -func createHeapDerefLocationList(n *ir.Name, fnsym *obj.LSym, entryID, prologEndID ssa.ID) []byte { +func createHeapDerefLocationList(n *ir.Name, entryID ssa.ID) []byte { // Get the stack offset where the heap pointer is stored heapPtrOffset := n.Heapaddr.FrameOffset() if base.Ctxt.Arch.FixedFrameSize == 0 { diff --git a/src/cmd/link/dwarf_test.go b/src/cmd/link/dwarf_test.go index 4305354d16..d269aa70c6 100644 --- a/src/cmd/link/dwarf_test.go +++ b/src/cmd/link/dwarf_test.go @@ -257,7 +257,18 @@ func TestDWARFiOS(t *testing.T) { }) } +// This test ensures that variables promoted to the heap, specifically +// function return parameters, have correct location lists generated. +// +// TODO(deparker): This test is intentionally limited to GOOS=="linux" +// and scoped to net.sendFile, which was the function reported originally in +// issue #65405. There is relevant discussion in https://go-review.googlesource.com/c/go/+/684377 +// pertaining to these limitations. There are other missing location lists which must be fixed +// particularly in functions where `linkname` is involved. func TestDWARFLocationList(t *testing.T) { + if runtime.GOOS != "linux" { + t.Skip("skipping test on non-linux OS") + } testenv.MustHaveCGO(t) testenv.MustHaveGoBuild(t) @@ -305,22 +316,10 @@ func TestDWARFLocationList(t *testing.T) { // Look for the net.sendFile subprogram if entry.Tag == dwarf.TagSubprogram { fnName, ok := entry.Val(dwarf.AttrName).(string) - if !ok { + if !ok || fnName != "net.sendFile" { + reader.SkipChildren() continue } - if strings.Contains(fnName, ".eq") || // Ignore autogenerated equality funcs - strings.HasPrefix(fnName, "internal/") || // Ignore internal/runtime package TODO(deparker): Fix these too (likely same issue as other ignored packages below). - strings.HasPrefix(fnName, "runtime.") || // Ignore runtime package which contain funcs implemented in assembly or exposed through linkname which seems to not generate location lists correctly (most likely linkname causing this). TODO(deparker) Fix these too. - strings.HasPrefix(fnName, "reflect.") || // Ignore reflect package. TODO(deparker) Fix these too. - strings.HasPrefix(fnName, "time.") { // Ignore funcs in time package which are exposed through linkname and seem to not generate location lists correctly TODO(deparker) Fix these too. - continue - } - if fnName == "syscall.compileCallback" || fnName == "maps.clone" { - continue // Ignore for now, possibly caused by linkname usage. TODO(deparker) Fix this too. - } - if runtime.GOOS == "windows" && strings.HasPrefix(fnName, "syscall.") { - continue // Ignore, caused by linkname usage. TODO(deparker) Fix these too. - } for { paramEntry, err := reader.Next() @@ -332,13 +331,8 @@ func TestDWARFLocationList(t *testing.T) { } if paramEntry.Tag == dwarf.TagFormalParameter { - paramName, hasName := paramEntry.Val(dwarf.AttrName).(string) - if !hasName { - continue - } - if paramName[0] == '~' { - continue - } + paramName, _ := paramEntry.Val(dwarf.AttrName).(string) + // Check if this parameter has a location attribute if loc := paramEntry.Val(dwarf.AttrLocation); loc != nil { switch locData := loc.(type) { -- 2.50.0