diff options
Diffstat (limited to 'vendor/github.com/bytedance/sonic/loader/pcdata.go')
-rw-r--r-- | vendor/github.com/bytedance/sonic/loader/pcdata.go | 100 |
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 |