From b5a512b47c1061854fefeec37876ce5589b84417 Mon Sep 17 00:00:00 2001 From: qiulaidongfeng <2645477756@qq.com> Date: Sun, 31 Dec 2023 18:24:06 +0800 Subject: [PATCH] cmd/compile/internal/ssagen,runtime: merge trace consts into internal/abi For #59670 --- src/cmd/compile/internal/ssagen/ssa.go | 39 ++++++++------------------ src/internal/abi/type.go | 20 +++++++++++++ src/runtime/traceback.go | 30 ++++---------------- 3 files changed, 37 insertions(+), 52 deletions(-) diff --git a/src/cmd/compile/internal/ssagen/ssa.go b/src/cmd/compile/internal/ssagen/ssa.go index c794d6ffd9..a7193b6e37 100644 --- a/src/cmd/compile/internal/ssagen/ssa.go +++ b/src/cmd/compile/internal/ssagen/ssa.go @@ -7109,24 +7109,7 @@ func EmitArgInfo(f *ir.Func, abiInfo *abi.ABIParamResultInfo) *obj.LSym { // - 0xfb - print _ (offset too large) // These constants need to be in sync with runtime.traceback.go:printArgs. const ( - _endSeq = 0xff - _startAgg = 0xfe - _endAgg = 0xfd - _dotdotdot = 0xfc - _offsetTooLarge = 0xfb - _special = 0xf0 // above this are operators, below this are ordinary offsets - ) - - const ( - limit = 10 // print no more than 10 args/components - maxDepth = 5 // no more than 5 layers of nesting - - // maxLen is a (conservative) upper bound of the byte stream length. For - // each arg/component, it has no more than 2 bytes of data (size, offset), - // and no more than one {, }, ... at each level (it cannot have both the - // data and ... unless it is the last one, just be conservative). Plus 1 - // for _endSeq. - maxLen = (maxDepth*3+2)*limit + 1 + _special = 0xf0 // above this are operators, below this are ordinary offsets ) wOff := 0 @@ -7136,7 +7119,7 @@ func EmitArgInfo(f *ir.Func, abiInfo *abi.ABIParamResultInfo) *obj.LSym { // Write one non-aggregate arg/field/element. write1 := func(sz, offset int64) { if offset >= _special { - writebyte(_offsetTooLarge) + writebyte(rtabi.TraceArgsOffsetTooLarge) } else { writebyte(uint8(offset)) writebyte(uint8(sz)) @@ -7148,19 +7131,19 @@ func EmitArgInfo(f *ir.Func, abiInfo *abi.ABIParamResultInfo) *obj.LSym { // Returns whether to continue visiting. var visitType func(baseOffset int64, t *types.Type, depth int) bool visitType = func(baseOffset int64, t *types.Type, depth int) bool { - if n >= limit { - writebyte(_dotdotdot) + if n >= rtabi.TraceArgsLimit { + writebyte(rtabi.TraceArgsDotdotdot) return false } if !isAggregate(t) { write1(t.Size(), baseOffset) return true } - writebyte(_startAgg) + writebyte(rtabi.TraceArgsStartAgg) depth++ - if depth >= maxDepth { - writebyte(_dotdotdot) - writebyte(_endAgg) + if depth >= rtabi.TraceArgsMaxDepth { + writebyte(rtabi.TraceArgsDotdotdot) + writebyte(rtabi.TraceArgsEndAgg) n++ return true } @@ -7197,7 +7180,7 @@ func EmitArgInfo(f *ir.Func, abiInfo *abi.ABIParamResultInfo) *obj.LSym { } } } - writebyte(_endAgg) + writebyte(rtabi.TraceArgsEndAgg) return true } @@ -7212,8 +7195,8 @@ func EmitArgInfo(f *ir.Func, abiInfo *abi.ABIParamResultInfo) *obj.LSym { break } } - writebyte(_endSeq) - if wOff > maxLen { + writebyte(rtabi.TraceArgsEndSeq) + if wOff > rtabi.TraceArgsMaxLen { base.Fatalf("ArgInfo too large") } diff --git a/src/internal/abi/type.go b/src/internal/abi/type.go index 86f055cb91..bb13890e3f 100644 --- a/src/internal/abi/type.go +++ b/src/internal/abi/type.go @@ -710,3 +710,23 @@ func NewName(n, tag string, exported, embedded bool) Name { return Name{Bytes: &b[0]} } + +const ( + TraceArgsLimit = 10 // print no more than 10 args/components + TraceArgsMaxDepth = 5 // no more than 5 layers of nesting + + // maxLen is a (conservative) upper bound of the byte stream length. For + // each arg/component, it has no more than 2 bytes of data (size, offset), + // and no more than one {, }, ... at each level (it cannot have both the + // data and ... unless it is the last one, just be conservative). Plus 1 + // for _endSeq. + TraceArgsMaxLen = (TraceArgsMaxDepth*3+2)*TraceArgsLimit + 1 +) + +const ( + TraceArgsEndSeq = 0xff + TraceArgsStartAgg = 0xfe + TraceArgsEndAgg = 0xfd + TraceArgsDotdotdot = 0xfc + TraceArgsOffsetTooLarge = 0xfb +) diff --git a/src/runtime/traceback.go b/src/runtime/traceback.go index 1e5afc6bdd..4ca4ac51ad 100644 --- a/src/runtime/traceback.go +++ b/src/runtime/traceback.go @@ -650,25 +650,7 @@ func tracebackPCs(u *unwinder, skip int, pcBuf []uintptr) int { // printArgs prints function arguments in traceback. func printArgs(f funcInfo, argp unsafe.Pointer, pc uintptr) { - // The "instruction" of argument printing is encoded in _FUNCDATA_ArgInfo. - // See cmd/compile/internal/ssagen.emitArgInfo for the description of the - // encoding. - // These constants need to be in sync with the compiler. - const ( - _endSeq = 0xff - _startAgg = 0xfe - _endAgg = 0xfd - _dotdotdot = 0xfc - _offsetTooLarge = 0xfb - ) - - const ( - limit = 10 // print no more than 10 args/components - maxDepth = 5 // no more than 5 layers of nesting - maxLen = (maxDepth*3+2)*limit + 1 // max length of _FUNCDATA_ArgInfo (see the compiler side for reasoning) - ) - - p := (*[maxLen]uint8)(funcdata(f, abi.FUNCDATA_ArgInfo)) + p := (*[abi.TraceArgsMaxLen]uint8)(funcdata(f, abi.FUNCDATA_ArgInfo)) if p == nil { return } @@ -721,19 +703,19 @@ printloop: o := p[pi] pi++ switch o { - case _endSeq: + case abi.TraceArgsEndSeq: break printloop - case _startAgg: + case abi.TraceArgsStartAgg: printcomma() print("{") start = true continue - case _endAgg: + case abi.TraceArgsEndAgg: print("}") - case _dotdotdot: + case abi.TraceArgsDotdotdot: printcomma() print("...") - case _offsetTooLarge: + case abi.TraceArgsOffsetTooLarge: printcomma() print("_") default: