type inlinedCall … type inlineUnwinder … type inlineFrame … // newInlineUnwinder creates an inlineUnwinder initially set to the inner-most // inlined frame at PC. PC should be a "call PC" (not a "return PC"). // // This unwinder uses non-strict handling of PC because it's assumed this is // only ever used for symbolic debugging. If things go really wrong, it'll just // fall back to the outermost frame. // // newInlineUnwinder should be an internal detail, // but widely used packages access it using linkname. // Notable members of the hall of shame include: // - github.com/phuslu/log // // Do not remove or change the type signature. // See go.dev/issue/67401. // //go:linkname newInlineUnwinder func newInlineUnwinder(f funcInfo, pc uintptr) (inlineUnwinder, inlineFrame) { … } func (u *inlineUnwinder) resolveInternal(pc uintptr) inlineFrame { … } func (uf inlineFrame) valid() bool { … } // next returns the frame representing uf's logical caller. func (u *inlineUnwinder) next(uf inlineFrame) inlineFrame { … } // isInlined returns whether uf is an inlined frame. func (u *inlineUnwinder) isInlined(uf inlineFrame) bool { … } // srcFunc returns the srcFunc representing the given frame. // // srcFunc should be an internal detail, // but widely used packages access it using linkname. // Notable members of the hall of shame include: // - github.com/phuslu/log // // Do not remove or change the type signature. // See go.dev/issue/67401. // // The go:linkname is below. func (u *inlineUnwinder) srcFunc(uf inlineFrame) srcFunc { … } //go:linkname badSrcFunc runtime.(*inlineUnwinder).srcFunc func badSrcFunc(*inlineUnwinder, inlineFrame) srcFunc // fileLine returns the file name and line number of the call within the given // frame. As a convenience, for the innermost frame, it returns the file and // line of the PC this unwinder was started at (often this is a call to another // physical function). // // It returns "?", 0 if something goes wrong. func (u *inlineUnwinder) fileLine(uf inlineFrame) (file string, line int) { … }