| // Copyright 2018 The Go Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style | |
| // license that can be found in the LICENSE file. | |
| package objabi | |
| import "strings" | |
| // A FuncFlag records bits about a function, passed to the runtime. | |
| type FuncFlag uint8 | |
| // Note: This list must match the list in runtime/symtab.go. | |
| const ( | |
| FuncFlag_TOPFRAME = 1 << iota | |
| FuncFlag_SPWRITE | |
| FuncFlag_ASM | |
| ) | |
| // A FuncID identifies particular functions that need to be treated | |
| // specially by the runtime. | |
| // Note that in some situations involving plugins, there may be multiple | |
| // copies of a particular special runtime function. | |
| type FuncID uint8 | |
| // Note: this list must match the list in runtime/symtab.go. | |
| const ( | |
| FuncID_normal FuncID = iota // not a special function | |
| FuncID_abort | |
| FuncID_asmcgocall | |
| FuncID_asyncPreempt | |
| FuncID_cgocallback | |
| FuncID_debugCallV2 | |
| FuncID_gcBgMarkWorker | |
| FuncID_goexit | |
| FuncID_gogo | |
| FuncID_gopanic | |
| FuncID_handleAsyncEvent | |
| FuncID_mcall | |
| FuncID_morestack | |
| FuncID_mstart | |
| FuncID_panicwrap | |
| FuncID_rt0_go | |
| FuncID_runfinq | |
| FuncID_runtime_main | |
| FuncID_sigpanic | |
| FuncID_systemstack | |
| FuncID_systemstack_switch | |
| FuncID_wrapper // any autogenerated code (hash/eq algorithms, method wrappers, etc.) | |
| ) | |
| var funcIDs = map[string]FuncID{ | |
| "abort": FuncID_abort, | |
| "asmcgocall": FuncID_asmcgocall, | |
| "asyncPreempt": FuncID_asyncPreempt, | |
| "cgocallback": FuncID_cgocallback, | |
| "debugCallV2": FuncID_debugCallV2, | |
| "gcBgMarkWorker": FuncID_gcBgMarkWorker, | |
| "rt0_go": FuncID_rt0_go, | |
| "goexit": FuncID_goexit, | |
| "gogo": FuncID_gogo, | |
| "gopanic": FuncID_gopanic, | |
| "handleAsyncEvent": FuncID_handleAsyncEvent, | |
| "main": FuncID_runtime_main, | |
| "mcall": FuncID_mcall, | |
| "morestack": FuncID_morestack, | |
| "mstart": FuncID_mstart, | |
| "panicwrap": FuncID_panicwrap, | |
| "runfinq": FuncID_runfinq, | |
| "sigpanic": FuncID_sigpanic, | |
| "systemstack_switch": FuncID_systemstack_switch, | |
| "systemstack": FuncID_systemstack, | |
| // Don't show in call stack but otherwise not special. | |
| "deferreturn": FuncID_wrapper, | |
| "runOpenDeferFrame": FuncID_wrapper, | |
| "deferCallSave": FuncID_wrapper, | |
| } | |
| // Get the function ID for the named function in the named file. | |
| // The function should be package-qualified. | |
| func GetFuncID(name string, isWrapper bool) FuncID { | |
| if isWrapper { | |
| return FuncID_wrapper | |
| } | |
| if strings.HasPrefix(name, "runtime.") { | |
| if id, ok := funcIDs[name[len("runtime."):]]; ok { | |
| return id | |
| } | |
| } | |
| return FuncID_normal | |
| } |