| // 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, |
| "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, |
| "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 |
| } |