-
Notifications
You must be signed in to change notification settings - Fork 0
/
runtime_go1.22.go
86 lines (67 loc) · 2.32 KB
/
runtime_go1.22.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
//go:build go1.22 && !go1.23
// +build go1.22,!go1.23
// MIT license, copy and modify from https://github.com/tlog-dev/loc
//nolint:unused
package log
import (
_ "unsafe"
)
// inlinedCall is the encoding of entries in the FUNCDATA_InlTree table.
type inlinedCall struct {
funcID uint8 // type of the called function
_ [3]byte
nameOff int32 // offset into pclntab for name of called function
parentPc int32 // position of an instruction whose source position is the call site (offset from entry)
startLine int32 // line number of start of function (func keyword/TEXT directive)
}
type inlineUnwinder struct {
f funcInfo
inlTree *[1 << 20]inlinedCall
}
type inlineFrame struct {
pc uintptr
index int32
}
type srcFunc struct {
datap *uintptr
nameOff int32
startLine int32
funcID uint8
}
func pcNameFileLine(pc uintptr) (name, file string, line int32) {
funcInfo := findfunc(pc)
if funcInfo._func == nil {
return
}
entry := funcInfoEntry(funcInfo)
if pc > entry {
// We store the pc of the start of the instruction following
// the instruction in question (the call or the inline mark).
// This is done for historical reasons, and to make FuncForPC
// work correctly for entries in the result of runtime.Callers.
pc--
}
file, line = funcline1(funcInfo, pc, false)
// It's important that interpret pc non-strictly as cgoTraceback may
// have added bogus PCs with a valid funcInfo but invalid PCDATA.
u, uf := newInlineUnwinder(funcInfo, pc)
sf := inlineUnwinder_srcFunc(&u, uf)
name = srcFunc_name(sf)
// name = funcNameForPrint(srcFunc_name(sf))
return
}
//go:linkname newInlineUnwinder runtime.newInlineUnwinder
func newInlineUnwinder(f funcInfo, pc uintptr) (inlineUnwinder, inlineFrame)
//go:linkname inlineUnwinder_srcFunc runtime.(*inlineUnwinder).srcFunc
func inlineUnwinder_srcFunc(*inlineUnwinder, inlineFrame) srcFunc
//go:linkname inlineUnwinder_isInlined runtime.(*inlineUnwinder).isInlined
func inlineUnwinder_isInlined(*inlineUnwinder, inlineFrame) bool
//go:linkname srcFunc_name runtime.srcFunc.name
func srcFunc_name(srcFunc) string
//go:linkname funcNameForPrint runtime.funcNameForPrint
func funcNameForPrint(name string) string
// Fastrandn returns a pseudorandom uint32 in [0,n).
//
//go:noescape
//go:linkname Fastrandn runtime.cheaprandn
func Fastrandn(x uint32) uint32