28
`github.com/bytedance/sonic/internal/jit`
29
`github.com/twitchyliquid64/golang-asm/obj`
35
debugSyncGC = os.Getenv("SONIC_SYNC_GC") != ""
36
debugAsyncGC = os.Getenv("SONIC_NO_ASYNC_GC") == ""
37
debugCheckPtr = os.Getenv("SONIC_CHECK_POINTER") != ""
41
_Instr_End = newInsOp(_OP_is_nil)
44
_F_println = jit.Func(println_wrapper)
45
_F_print = jit.Func(print)
48
func (self *_Assembler) dsave(r ...obj.Addr) {
50
if i > _FP_debug / 8 - 1 {
51
panic("too many registers to save")
53
self.Emit("MOVQ", v, jit.Ptr(_SP, _FP_fargs + _FP_saves + _FP_locals + int64(i) * 8))
58
func (self *_Assembler) dload(r ...obj.Addr) {
60
if i > _FP_debug / 8 - 1 {
61
panic("too many registers to load")
63
self.Emit("MOVQ", jit.Ptr(_SP, _FP_fargs + _FP_saves + _FP_locals + int64(i) * 8), v)
68
func println_wrapper(i int, op1 int, op2 int){
69
println(i, " Intrs ", op1, _OpNames[op1], "next: ", op2, _OpNames[op2])
84
func (self *_Assembler) dcall(fn obj.Addr) {
85
self.Emit("MOVQ", fn, _R10)
86
self.Rjmp("CALL", _R10)
89
func (self *_Assembler) debug_gc() {
93
self.dsave(_REG_debug...)
95
self.dload(_REG_debug...)
98
func (self *_Assembler) debug_instr(i int, v *_Instr) {
100
if i+1 == len(self.p) {
101
self.print_gc(i, v, &_Instr_End)
103
next := &(self.p[i+1])
104
self.print_gc(i, v, next)
105
name := _OpNames[next.op()]
106
if strings.Contains(name, "save") {
116
func checkptrBase(p unsafe.Pointer) uintptr
120
func findObject(p, refBase, refOff uintptr) (base uintptr, s unsafe.Pointer, objIndex uintptr)
123
_F_checkptr = jit.Func(checkptr)
124
_F_printptr = jit.Func(printptr)
128
_R10 = jit.Reg("R10")
130
var _REG_debug = []obj.Addr {
149
func checkptr(ptr uintptr) {
153
fmt.Printf("pointer: %x\n", ptr)
154
f := checkptrBase(unsafe.Pointer(uintptr(ptr)))
156
fmt.Printf("! unknown-based pointer: %x\n", ptr)
158
fmt.Printf("! stack pointer: %x\n", ptr)
160
fmt.Printf("base: %x\n", f)
165
func findobj(ptr uintptr) {
166
base, s, objIndex := findObject(ptr, 0, 0)
167
if s != nil && base == 0 {
168
fmt.Printf("! invalid pointer: %x\n", ptr)
170
fmt.Printf("objIndex: %d\n", objIndex)
173
func (self *_Assembler) check_ptr(ptr obj.Addr, lea bool) {
178
self.dsave(_REG_debug...)
180
self.Emit("LEAQ", ptr, _R10)
182
self.Emit("MOVQ", ptr, _R10)
184
self.Emit("MOVQ", _R10, jit.Ptr(_SP, 0))
185
self.dcall(_F_checkptr)
186
self.dload(_REG_debug...)
189
func printptr(i int, ptr uintptr) {
190
fmt.Printf("[%d] ptr: %x\n", i, ptr)
193
func (self *_Assembler) print_ptr(i int, ptr obj.Addr, lea bool) {
194
self.dsave(_REG_debug...)
196
self.Emit("LEAQ", ptr, _R10)
198
self.Emit("MOVQ", ptr, _R10)
201
self.Emit("MOVQ", jit.Imm(int64(i)), _AX)
202
self.Emit("MOVQ", _R10, _BX)
203
self.dcall(_F_printptr)
204
self.dload(_REG_debug...)