wasm: fix scanning of the stack

LLVM wasn't aware that runtime.stackChainStart must be kept live and
can't be optimized away. With this hack, it is forced to consider
stackChainStart live at the time of the stack scan.

This fixes the corruption in https://github.com/tinygo-org/tinygo/issues/3277
Этот коммит содержится в:
Ayke van Laethem 2022-11-17 14:06:37 +01:00 коммит произвёл Ron Evans
родитель 67841207e8
коммит 783c6a813a

Просмотреть файл

@ -5,6 +5,7 @@ package runtime
import (
"internal/task"
"runtime/volatile"
"unsafe"
)
@ -38,6 +39,13 @@ type stackChainObject struct {
// stackChainStart. Luckily we don't need to scan these, as these globals are
// stored on the goroutine stack and are therefore already getting scanned.
func markStack() {
// Hack to force LLVM to consider stackChainStart to be live.
// Without this hack, loads and stores may be considered dead and objects on
// the stack might not be correctly tracked. With this volatile load, LLVM
// is forced to consider stackChainStart (and everything it points to) as
// live.
volatile.LoadUint32((*uint32)(unsafe.Pointer(&stackChainStart)))
if task.OnSystemStack() {
markRoots(getCurrentStackPointer(), stackTop)
}