mirror of
https://github.com/tinygo-org/tinygo.git
synced 2026-08-09 05:23:40 +00:00
runtime (gc): scan callee-saved registers while marking stack
This commit is contained in:
@@ -3,12 +3,38 @@
|
||||
|
||||
package runtime
|
||||
|
||||
import "internal/task"
|
||||
|
||||
// markStack marks all root pointers found on the stack.
|
||||
//
|
||||
// This implementation is conservative and relies on the stack top (provided by
|
||||
// the linker) and getting the current stack pointer from a register. Also, it
|
||||
// assumes a descending stack. Thus, it is not very portable.
|
||||
func markStack() {
|
||||
// Mark system stack.
|
||||
markRoots(getSystemStackPointer(), stackTop)
|
||||
// Scan the current stack, and all current registers.
|
||||
scanCurrentStack()
|
||||
|
||||
if !task.OnSystemStack() {
|
||||
// Mark system stack.
|
||||
markRoots(getSystemStackPointer(), stackTop)
|
||||
}
|
||||
}
|
||||
|
||||
//go:export tinygo_scanCurrentStack
|
||||
func scanCurrentStack()
|
||||
|
||||
//go:export tinygo_scanstack
|
||||
func scanstack(sp uintptr) {
|
||||
// Mark current stack.
|
||||
// This function is called by scanCurrentStack, after pushing all registers onto the stack.
|
||||
// Callee-saved registers have been pushed onto stack by tinygo_localscan, so this will scan them too.
|
||||
if task.OnSystemStack() {
|
||||
// This is the system stack.
|
||||
// Scan all words on the stack.
|
||||
markRoots(sp, stackTop)
|
||||
} else {
|
||||
// This is a goroutine stack.
|
||||
// It is an allocation, so scan it as if it were a value in a global.
|
||||
markRoot(0, sp)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user