summaryrefslogtreecommitdiff
path: root/vendor/github.com/bytedance/sonic/loader/funcdata.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/bytedance/sonic/loader/funcdata.go')
-rw-r--r--vendor/github.com/bytedance/sonic/loader/funcdata.go144
1 files changed, 144 insertions, 0 deletions
diff --git a/vendor/github.com/bytedance/sonic/loader/funcdata.go b/vendor/github.com/bytedance/sonic/loader/funcdata.go
new file mode 100644
index 000000000..9b760f615
--- /dev/null
+++ b/vendor/github.com/bytedance/sonic/loader/funcdata.go
@@ -0,0 +1,144 @@
+/**
+ * Copyright 2023 ByteDance Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package loader
+
+import (
+ `encoding`
+ `encoding/binary`
+ `fmt`
+ `reflect`
+ `strings`
+ `sync`
+ `unsafe`
+)
+
+const (
+ _MinLC uint8 = 1
+ _PtrSize uint8 = 8
+)
+
+const (
+ _N_FUNCDATA = 8
+ _INVALID_FUNCDATA_OFFSET = ^uint32(0)
+ _FUNC_SIZE = unsafe.Sizeof(_func{})
+
+ _MINFUNC = 16 // minimum size for a function
+ _BUCKETSIZE = 256 * _MINFUNC
+ _SUBBUCKETS = 16
+ _SUB_BUCKETSIZE = _BUCKETSIZE / _SUBBUCKETS
+)
+
+// PCDATA and FUNCDATA table indexes.
+//
+// See funcdata.h and $GROOT/src/cmd/internal/objabi/funcdata.go.
+const (
+ _FUNCDATA_ArgsPointerMaps = 0
+ _FUNCDATA_LocalsPointerMaps = 1
+ _FUNCDATA_StackObjects = 2
+ _FUNCDATA_InlTree = 3
+ _FUNCDATA_OpenCodedDeferInfo = 4
+ _FUNCDATA_ArgInfo = 5
+ _FUNCDATA_ArgLiveInfo = 6
+ _FUNCDATA_WrapInfo = 7
+
+ // 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
+)
+
+// moduledata used to cache the funcdata and findfuncbucket of one module
+var moduleCache = struct {
+ m map[*moduledata][]byte
+ sync.Mutex
+}{
+ m: make(map[*moduledata][]byte),
+}
+
+// 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
+}
+
+func getOffsetOf(data interface{}, field string) uintptr {
+ t := reflect.TypeOf(data)
+ fv, ok := t.FieldByName(field)
+ if !ok {
+ panic(fmt.Sprintf("field %s not found in struct %s", field, t.Name()))
+ }
+ return fv.Offset
+}
+
+func rnd(v int64, r int64) int64 {
+ if r <= 0 {
+ return v
+ }
+ v += r - 1
+ c := v % r
+ if c < 0 {
+ c += r
+ }
+ v -= c
+ return v
+}
+
+var (
+ byteOrder binary.ByteOrder = binary.LittleEndian
+)
+
+func funcNameParts(name string) (string, string, string) {
+ i := strings.IndexByte(name, '[')
+ if i < 0 {
+ return name, "", ""
+ }
+ // TODO: use LastIndexByte once the bootstrap compiler is >= Go 1.5.
+ j := len(name) - 1
+ for j > i && name[j] != ']' {
+ j--
+ }
+ if j <= i {
+ return name, "", ""
+ }
+ return name[:i], "[...]", name[j+1:]
+} \ No newline at end of file