1
0
mirror of https://github.com/golang/go synced 2024-09-29 19:24:33 -06:00
This commit is contained in:
qiulaidongfeng 2024-01-09 19:15:51 +08:00
parent b5a512b47c
commit c620abf967
2 changed files with 14 additions and 18 deletions

View File

@ -7095,30 +7095,13 @@ func EmitArgInfo(f *ir.Func, abiInfo *abi.ABIParamResultInfo) *obj.LSym {
return t.IsStruct() || t.IsArray() || t.IsComplex() || t.IsInterface() || t.IsString() || t.IsSlice() return t.IsStruct() || t.IsArray() || t.IsComplex() || t.IsInterface() || t.IsString() || t.IsSlice()
} }
// Populate the data.
// The data is a stream of bytes, which contains the offsets and sizes of the
// non-aggregate arguments or non-aggregate fields/elements of aggregate-typed
// arguments, along with special "operators". Specifically,
// - for each non-aggrgate arg/field/element, its offset from FP (1 byte) and
// size (1 byte)
// - special operators:
// - 0xff - end of sequence
// - 0xfe - print { (at the start of an aggregate-typed argument)
// - 0xfd - print } (at the end of an aggregate-typed argument)
// - 0xfc - print ... (more args/fields/elements)
// - 0xfb - print _ (offset too large)
// These constants need to be in sync with runtime.traceback.go:printArgs.
const (
_special = 0xf0 // above this are operators, below this are ordinary offsets
)
wOff := 0 wOff := 0
n := 0 n := 0
writebyte := func(o uint8) { wOff = objw.Uint8(x, wOff, o) } writebyte := func(o uint8) { wOff = objw.Uint8(x, wOff, o) }
// Write one non-aggregate arg/field/element. // Write one non-aggregate arg/field/element.
write1 := func(sz, offset int64) { write1 := func(sz, offset int64) {
if offset >= _special { if offset >= rtabi.TraceArgsSpecial {
writebyte(rtabi.TraceArgsOffsetTooLarge) writebyte(rtabi.TraceArgsOffsetTooLarge)
} else { } else {
writebyte(uint8(offset)) writebyte(uint8(offset))

View File

@ -723,10 +723,23 @@ const (
TraceArgsMaxLen = (TraceArgsMaxDepth*3+2)*TraceArgsLimit + 1 TraceArgsMaxLen = (TraceArgsMaxDepth*3+2)*TraceArgsLimit + 1
) )
// Populate the data.
// The data is a stream of bytes, which contains the offsets and sizes of the
// non-aggregate arguments or non-aggregate fields/elements of aggregate-typed
// arguments, along with special "operators". Specifically,
// - for each non-aggrgate arg/field/element, its offset from FP (1 byte) and
// size (1 byte)
// - special operators:
// - 0xff - end of sequence
// - 0xfe - print { (at the start of an aggregate-typed argument)
// - 0xfd - print } (at the end of an aggregate-typed argument)
// - 0xfc - print ... (more args/fields/elements)
// - 0xfb - print _ (offset too large)
const ( const (
TraceArgsEndSeq = 0xff TraceArgsEndSeq = 0xff
TraceArgsStartAgg = 0xfe TraceArgsStartAgg = 0xfe
TraceArgsEndAgg = 0xfd TraceArgsEndAgg = 0xfd
TraceArgsDotdotdot = 0xfc TraceArgsDotdotdot = 0xfc
TraceArgsOffsetTooLarge = 0xfb TraceArgsOffsetTooLarge = 0xfb
TraceArgsSpecial = 0xf0 // above this are operators, below this are ordinary offsets
) )