diff options
Diffstat (limited to 'src/runtime/stack.go')
-rw-r--r-- | src/runtime/stack.go | 40 |
1 files changed, 31 insertions, 9 deletions
diff --git a/src/runtime/stack.go b/src/runtime/stack.go index babfdfccf0..b21c9c9518 100644 --- a/src/runtime/stack.go +++ b/src/runtime/stack.go @@ -702,15 +702,15 @@ func adjustframe(frame *stkframe, arg unsafe.Pointer) bool { // we call into morestack.) continue } - t := obj.typ - gcdata := t.gcdata + ptrdata := obj.ptrdata() + gcdata := obj.gcdata var s *mspan - if t.kind&kindGCProg != 0 { + if obj.useGCProg() { // See comments in mgcmark.go:scanstack - s = materializeGCProg(t.ptrdata, gcdata) + s = materializeGCProg(ptrdata, gcdata) gcdata = (*byte)(unsafe.Pointer(s.startAddr)) } - for i := uintptr(0); i < t.ptrdata; i += sys.PtrSize { + for i := uintptr(0); i < ptrdata; i += sys.PtrSize { if *addb(gcdata, i/(8*sys.PtrSize))>>(i/sys.PtrSize&7)&1 != 0 { adjustpointer(adjinfo, unsafe.Pointer(p+i)) } @@ -1346,20 +1346,42 @@ var ( abiRegArgsType *_type = efaceOf(&abiRegArgsEface)._type methodValueCallFrameObjs = []stackObjectRecord{ { - off: -int(alignUp(abiRegArgsType.size, 8)), // It's always the highest address local. - typ: abiRegArgsType, + off: -int32(alignUp(abiRegArgsType.size, 8)), // It's always the highest address local. + size: int32(abiRegArgsType.size), + _ptrdata: int32(abiRegArgsType.ptrdata), + gcdata: abiRegArgsType.gcdata, }, } ) +func init() { + if abiRegArgsType.kind&kindGCProg != 0 { + throw("abiRegArgsType needs GC Prog, update methodValueCallFrameObjs") + } +} + // A stackObjectRecord is generated by the compiler for each stack object in a stack frame. // This record must match the generator code in cmd/compile/internal/liveness/plive.go:emitStackObjects. type stackObjectRecord struct { // offset in frame // if negative, offset from varp // if non-negative, offset from argp - off int - typ *_type + off int32 + size int32 + _ptrdata int32 // ptrdata, or -ptrdata is GC prog is used + gcdata *byte // pointer map or GC prog of the type +} + +func (r *stackObjectRecord) useGCProg() bool { + return r._ptrdata < 0 +} + +func (r *stackObjectRecord) ptrdata() uintptr { + x := r._ptrdata + if x < 0 { + return uintptr(-x) + } + return uintptr(x) } // This is exported as ABI0 via linkname so obj can call it. |