mirror of
https://github.com/tinygo-org/tinygo.git
synced 2026-08-06 03:53:42 +00:00
747336f0a9
The extalloc collector has been broken for a while, and it doesn't seem reasonable to fix right now. In addition, after a recent change it no longer compiles. In the future similar functionality can hopefully be reintroduced, but for now this seems to be the most reasonable option.
36 lines
1.0 KiB
Go
36 lines
1.0 KiB
Go
//go:build gc.conservative && !baremetal && !tinygo.wasm
|
|
// +build gc.conservative,!baremetal,!tinygo.wasm
|
|
|
|
package runtime
|
|
|
|
import (
|
|
"unsafe"
|
|
)
|
|
|
|
//go:extern runtime.trackedGlobalsStart
|
|
var trackedGlobalsStart uintptr
|
|
|
|
//go:extern runtime.trackedGlobalsLength
|
|
var trackedGlobalsLength uintptr
|
|
|
|
//go:extern runtime.trackedGlobalsBitmap
|
|
var trackedGlobalsBitmap [0]uint8
|
|
|
|
// markGlobals marks all globals, which are reachable by definition.
|
|
//
|
|
// This implementation relies on a compiler pass that stores all globals in a
|
|
// single global (adjusting all uses of them accordingly) and creates a bit
|
|
// vector with the locations of each pointer. This implementation then walks the
|
|
// bit vector and for each pointer it indicates, it marks the root.
|
|
//
|
|
//go:nobounds
|
|
func markGlobals() {
|
|
for i := uintptr(0); i < trackedGlobalsLength; i++ {
|
|
if trackedGlobalsBitmap[i/8]&(1<<(i%8)) != 0 {
|
|
addr := trackedGlobalsStart + i*unsafe.Alignof(uintptr(0))
|
|
root := *(*uintptr)(unsafe.Pointer(addr))
|
|
markRoot(addr, root)
|
|
}
|
|
}
|
|
}
|