mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
cmd/link: scope test to linux & net.sendFile
Limits the scope of new test added in71c2bf5513. Discussion: https://go-review.googlesource.com/c/go/+/684377. Change-Id: I0e8f513eb564aae277ba8a80ebdad469eb1e6e6a GitHub-Last-Rev:add2b2e209GitHub-Pull-Request: golang/go#74720 Reviewed-on: https://go-review.googlesource.com/c/go/+/689916 Reviewed-by: Keith Randall <khr@golang.org> Auto-Submit: Keith Randall <khr@golang.org> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Michael Knyszek <mknyszek@google.com> Reviewed-by: Keith Randall <khr@google.com>
This commit is contained in:
parent
71c2bf5513
commit
489868f776
2 changed files with 17 additions and 23 deletions
|
|
@ -278,7 +278,7 @@ func createDwarfVars(fnsym *obj.LSym, complexOK bool, fn *ir.Func, apDecls []*ir
|
||||||
base.Fatalf("invalid heap allocated var without Heapaddr")
|
base.Fatalf("invalid heap allocated var without Heapaddr")
|
||||||
}
|
}
|
||||||
debug := fn.DebugInfo.(*ssa.FuncDebug)
|
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) {
|
dvar.PutLocationList = func(listSym, startPC dwarf.Sym) {
|
||||||
debug.PutLocationList(list, base.Ctxt, listSym.(*obj.LSym), startPC.(*obj.LSym))
|
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
|
// createHeapDerefLocationList creates a location list for a heap-escaped variable
|
||||||
// that describes "dereference pointer at stack offset"
|
// 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
|
// Get the stack offset where the heap pointer is stored
|
||||||
heapPtrOffset := n.Heapaddr.FrameOffset()
|
heapPtrOffset := n.Heapaddr.FrameOffset()
|
||||||
if base.Ctxt.Arch.FixedFrameSize == 0 {
|
if base.Ctxt.Arch.FixedFrameSize == 0 {
|
||||||
|
|
|
||||||
|
|
@ -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) {
|
func TestDWARFLocationList(t *testing.T) {
|
||||||
|
if runtime.GOOS != "linux" {
|
||||||
|
t.Skip("skipping test on non-linux OS")
|
||||||
|
}
|
||||||
testenv.MustHaveCGO(t)
|
testenv.MustHaveCGO(t)
|
||||||
testenv.MustHaveGoBuild(t)
|
testenv.MustHaveGoBuild(t)
|
||||||
|
|
||||||
|
|
@ -305,22 +316,10 @@ func TestDWARFLocationList(t *testing.T) {
|
||||||
// Look for the net.sendFile subprogram
|
// Look for the net.sendFile subprogram
|
||||||
if entry.Tag == dwarf.TagSubprogram {
|
if entry.Tag == dwarf.TagSubprogram {
|
||||||
fnName, ok := entry.Val(dwarf.AttrName).(string)
|
fnName, ok := entry.Val(dwarf.AttrName).(string)
|
||||||
if !ok {
|
if !ok || fnName != "net.sendFile" {
|
||||||
|
reader.SkipChildren()
|
||||||
continue
|
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 {
|
for {
|
||||||
paramEntry, err := reader.Next()
|
paramEntry, err := reader.Next()
|
||||||
|
|
@ -332,13 +331,8 @@ func TestDWARFLocationList(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if paramEntry.Tag == dwarf.TagFormalParameter {
|
if paramEntry.Tag == dwarf.TagFormalParameter {
|
||||||
paramName, hasName := paramEntry.Val(dwarf.AttrName).(string)
|
paramName, _ := paramEntry.Val(dwarf.AttrName).(string)
|
||||||
if !hasName {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
if paramName[0] == '~' {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
// Check if this parameter has a location attribute
|
// Check if this parameter has a location attribute
|
||||||
if loc := paramEntry.Val(dwarf.AttrLocation); loc != nil {
|
if loc := paramEntry.Val(dwarf.AttrLocation); loc != nil {
|
||||||
switch locData := loc.(type) {
|
switch locData := loc.(type) {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue