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