Note: This list must match the list in runtime/symtab.go.
const ( FuncFlag_TOPFRAME = 1 << iota FuncFlag_SPWRITE FuncFlag_ASM )
const ( // PCDATA_UnsafePoint values. PCDATA_UnsafePointSafe = -1 // Safe for async preemption PCDATA_UnsafePointUnsafe = -2 // Unsafe for async preemption // PCDATA_Restart1(2) apply on a sequence of instructions, within // which if an async preemption happens, we should back off the PC // to the start of the sequence when resume. // We need two so we can distinguish the start/end of the sequence // in case that two sequences are next to each other. PCDATA_Restart1 = -3 PCDATA_Restart2 = -4 // Like PCDATA_RestartAtEntry, but back to function entry if async // preempted. PCDATA_RestartAtEntry = -5 )
PCDATA and FUNCDATA table indexes.
See funcdata.h and $GROOT/src/cmd/internal/objabi/funcdata.go.
const ( // ArgsSizeUnknown is set in Func.argsize to mark all functions // whose argument size is unknown (C vararg functions, and // assembly code without an explicit specification). // This value is generated by the compiler, assembler, or linker. ArgsSizeUnknown = -0x80000000 )
func WrapGoC(text []byte, natives []CFunc, stubs []GoC, modulename string, filename string)
WrapGoC wraps C functions and loader it into Go stubs
CFunc is a function information for C func
type CFunc struct { // C function name Name string // entry pc relative to entire text segment EntryOff uint32 // function text size in bytes TextSize uint32 // maximum stack depth of the function MaxStack uintptr // PC->SP delta lists of the function Pcsp [][2]uint32 }
Func contains information about a function.
type Func struct { ID uint8 // see runtime/symtab.go Flag uint8 // see runtime/symtab.go ArgsSize int32 // args byte size EntryOff uint32 // start pc, offset to moduledata.text TextSize uint32 // size of func text DeferReturn uint32 // offset of start of a deferreturn call instruction from entry, if any. FileIndex uint32 // index into filetab Name string // name of function // PC data Pcsp *Pcdata // PC -> SP delta Pcfile *Pcdata // PC -> file index Pcline *Pcdata // PC -> line number PcUnsafePoint *Pcdata // PC -> unsafe point, must be PCDATA_UnsafePointSafe or PCDATA_UnsafePointUnsafe PcStackMapIndex *Pcdata // PC -> stack map index, relative to ArgsPointerMaps and LocalsPointerMaps PcInlTreeIndex *Pcdata // PC -> inlining tree index, relative to InlTree PcArgLiveIndex *Pcdata // PC -> arg live index, relative to ArgLiveInfo // Func data, must implement encoding.BinaryMarshaler ArgsPointerMaps encoding.BinaryMarshaler // concrete type: *StackMap LocalsPointerMaps encoding.BinaryMarshaler // concrete type: *StackMap StackObjects encoding.BinaryMarshaler InlTree encoding.BinaryMarshaler OpenCodedDeferInfo encoding.BinaryMarshaler ArgInfo encoding.BinaryMarshaler ArgLiveInfo encoding.BinaryMarshaler WrapInfo encoding.BinaryMarshaler }
Function is a function pointer
type Function unsafe.Pointer
func Load(text []byte, funcs []Func, modulename string, filenames []string) (out []Function)
Load loads given machine codes and corresponding function information into go moduledata and returns runnable function pointer WARN: this API is experimental, use it carefully
GoC is the wrapper for Go calls to C
type GoC struct { // CName is the name of corresponding C function CName string // CEntry points out where to store the entry address of corresponding C function. // It won't be set if nil CEntry *uintptr // GoFunc is the POINTER of corresponding go stub function. // It is used to generate Go-C ABI conversion wrapper and receive the wrapper's address // eg. &func(a int, b int) int // FOR // int add(int a, int b) // It won't be set if nil GoFunc interface{} }
Loader is a helper used to load a module simply
type Loader struct { Name string // module name File string // file name Options }
func (self Loader) LoadOne(text []byte, funcName string, frameSize int, argSize int, argPtrs []bool, localPtrs []bool) Function
LoadFuncs loads only one function as module, and returns the function pointer
WARN:
Options used to load a module
type Options struct { // NoPreempt is used to disable async preemption for this module NoPreempt bool }
Pcdata represents pc->value mapping table.
WARN: we use ** [Pcdata[i].PC, Pcdata[i+1].PC) ** as the range where the Pcdata[i].Val is effective.
type Pcdata []Pcvalue
func (self Pcdata) MarshalBinary() (data []byte, err error)
see https://docs.google.com/document/d/1lyPIbmsYbXnpNj57a261hgOYVpNRcgydurVQIyZOz_o/pub
Pcvalue is the program count corresponding to the value Val
WARN: we use relative value here (to function entry)
type Pcvalue struct { PC uint32 // program count relative to function entry Val int32 // value relative to the value in function entry }