1// Copyright 2018 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5package objabi
6
7import "strings"
8
9// A FuncFlag records bits about a function, passed to the runtime.
10type FuncFlag uint8
11
12// Note: This list must match the list in runtime/symtab.go.
13const (
14	FuncFlag_TOPFRAME = 1 << iota
15	FuncFlag_SPWRITE
16	FuncFlag_ASM
17)
18
19// A FuncID identifies particular functions that need to be treated
20// specially by the runtime.
21// Note that in some situations involving plugins, there may be multiple
22// copies of a particular special runtime function.
23type FuncID uint8
24
25// Note: this list must match the list in runtime/symtab.go.
26const (
27	FuncID_normal FuncID = iota // not a special function
28	FuncID_abort
29	FuncID_asmcgocall
30	FuncID_asyncPreempt
31	FuncID_cgocallback
32	FuncID_debugCallV2
33	FuncID_gcBgMarkWorker
34	FuncID_goexit
35	FuncID_gogo
36	FuncID_gopanic
37	FuncID_handleAsyncEvent
38	FuncID_mcall
39	FuncID_morestack
40	FuncID_mstart
41	FuncID_panicwrap
42	FuncID_rt0_go
43	FuncID_runfinq
44	FuncID_runtime_main
45	FuncID_sigpanic
46	FuncID_systemstack
47	FuncID_systemstack_switch
48	FuncID_wrapper // any autogenerated code (hash/eq algorithms, method wrappers, etc.)
49)
50
51var funcIDs = map[string]FuncID{
52	"abort":            FuncID_abort,
53	"asmcgocall":       FuncID_asmcgocall,
54	"asyncPreempt":     FuncID_asyncPreempt,
55	"cgocallback":      FuncID_cgocallback,
56	"debugCallV2":      FuncID_debugCallV2,
57	"gcBgMarkWorker":   FuncID_gcBgMarkWorker,
58	"go":               FuncID_rt0_go,
59	"goexit":           FuncID_goexit,
60	"gogo":             FuncID_gogo,
61	"gopanic":          FuncID_gopanic,
62	"handleAsyncEvent": FuncID_handleAsyncEvent,
63	"main":             FuncID_runtime_main,
64	"mcall":            FuncID_mcall,
65	"morestack":        FuncID_morestack,
66	"mstart":           FuncID_mstart,
67	"panicwrap":        FuncID_panicwrap,
68	"runfinq":          FuncID_runfinq,
69	"sigpanic":         FuncID_sigpanic,
70	"switch":           FuncID_systemstack_switch,
71	"systemstack":      FuncID_systemstack,
72
73	// Don't show in call stack but otherwise not special.
74	"deferreturn":       FuncID_wrapper,
75	"runOpenDeferFrame": FuncID_wrapper,
76	"deferCallSave":     FuncID_wrapper,
77}
78
79// Get the function ID for the named function in the named file.
80// The function should be package-qualified.
81func GetFuncID(name string, isWrapper bool) FuncID {
82	if isWrapper {
83		return FuncID_wrapper
84	}
85	if strings.HasPrefix(name, "runtime.") {
86		if id, ok := funcIDs[name[len("runtime."):]]; ok {
87			return id
88		}
89	}
90	return FuncID_normal
91}
92