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

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