gc: use raw stack access whenever possible

The only architecture that actually needs special support for scanning
the stack is WebAssembly. All others allow raw access to the stack with
a small bit of assembly. Therefore, don't manually keep track of all
these objects on the stack manually and instead just use conservative
stack scanning.

This results in a massive code size decrease in the affected targets
(only tested linux/amd64 for code size) - sometimes around 33%. It also
allows for future improvements such as using proper stackful goroutines.
This commit is contained in:
Ayke van Laethem
2020-09-25 16:09:37 +02:00
committed by Ron Evans
parent bfa29f17da
commit 67de8b490d
13 changed files with 125 additions and 11 deletions
+14 -1
View File
@@ -8,19 +8,32 @@ type timeUnit int64
const asyncScheduler = false
var stackTop uintptr
func postinit() {}
// Entry point for Go. Initialize all packages and call main.main().
//export main
func main() int {
preinit()
run()
// Obtain the initial stack pointer right before calling the run() function.
// The run function has been moved to a separate (non-inlined) function so
// that the correct stack pointer is read.
stackTop = getCurrentStackPointer()
runMain()
// Call exit to correctly finish the program
// Without this, the application crashes at start, not sure why
return exit(0)
}
// Must be a separate function to get the correct stack pointer.
//go:noinline
func runMain() {
run()
}
// sleepTicks sleeps for the specified system ticks
func sleepTicks(d timeUnit) {
sleepThread(uint64(ticksToNanoseconds(d)))