summaryrefslogtreecommitdiff
path: root/vendor/github.com/bytedance/sonic/loader/pcdata.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/bytedance/sonic/loader/pcdata.go')
-rw-r--r--vendor/github.com/bytedance/sonic/loader/pcdata.go100
1 files changed, 100 insertions, 0 deletions
diff --git a/vendor/github.com/bytedance/sonic/loader/pcdata.go b/vendor/github.com/bytedance/sonic/loader/pcdata.go
new file mode 100644
index 000000000..b5c62d17b
--- /dev/null
+++ b/vendor/github.com/bytedance/sonic/loader/pcdata.go
@@ -0,0 +1,100 @@
+/**
+ * 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
+
+const (
+ _N_PCDATA = 4
+
+ _PCDATA_UnsafePoint = 0
+ _PCDATA_StackMapIndex = 1
+ _PCDATA_InlTreeIndex = 2
+ _PCDATA_ArgLiveIndex = 3
+
+ _PCDATA_INVALID_OFFSET = 0
+)
+
+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_START_VAL = -1
+)
+
+var emptyByte byte
+
+func encodeValue(v int) []byte {
+ return encodeVariant(toZigzag(v))
+}
+
+func toZigzag(v int) int {
+ return (v << 1) ^ (v >> 31)
+}
+
+func encodeVariant(v int) []byte {
+ var u int
+ var r []byte
+
+ /* split every 7 bits */
+ for v > 127 {
+ u = v & 0x7f
+ v = v >> 7
+ r = append(r, byte(u) | 0x80)
+ }
+
+ /* check for last one */
+ if v == 0 {
+ return r
+ }
+
+ /* add the last one */
+ r = append(r, byte(v))
+ return r
+}
+
+type Pcvalue struct {
+ PC uint32 // PC offset from func entry
+ Val int32
+}
+
+type Pcdata []Pcvalue
+
+// see https://docs.google.com/document/d/1lyPIbmsYbXnpNj57a261hgOYVpNRcgydurVQIyZOz_o/pub
+func (self Pcdata) MarshalBinary() (data []byte, err error) {
+ // delta value always starts from -1
+ sv := int32(_PCDATA_START_VAL)
+ sp := uint32(0)
+ for _, v := range self {
+ data = append(data, encodeVariant(toZigzag(int(v.Val - sv)))...)
+ data = append(data, encodeVariant(int(v.PC - sp))...)
+ sp = v.PC
+ sv = v.Val
+ }
+ return
+} \ No newline at end of file