From 0c7c2926f95cd66ec85c53f7110824b2c58c46cb Mon Sep 17 00:00:00 2001 From: Ayke van Laethem Date: Wed, 11 Jun 2025 10:26:52 +0200 Subject: [PATCH] runtime: refactor obtaining the system stack The system stack is only needed when we're not on it. So we can directly call task.SystemStack() without problems. This also saves a tiny bit of binary size. --- builder/sizes_test.go | 6 +++--- src/internal/task/task_none.go | 6 ++++++ src/runtime/gc_stack_raw.go | 2 +- src/runtime/scheduler_none.go | 6 ------ src/runtime/scheduler_tasks.go | 17 ----------------- 5 files changed, 10 insertions(+), 27 deletions(-) delete mode 100644 src/runtime/scheduler_tasks.go diff --git a/builder/sizes_test.go b/builder/sizes_test.go index 931e9970e..6009810c0 100644 --- a/builder/sizes_test.go +++ b/builder/sizes_test.go @@ -42,9 +42,9 @@ func TestBinarySize(t *testing.T) { // This is a small number of very diverse targets that we want to test. tests := []sizeTest{ // microcontrollers - {"hifive1b", "examples/echo", 4560, 280, 0, 2268}, - {"microbit", "examples/serial", 2924, 388, 8, 2272}, - {"wioterminal", "examples/pininterrupt", 7383, 1489, 116, 6912}, + {"hifive1b", "examples/echo", 4556, 280, 0, 2268}, + {"microbit", "examples/serial", 2920, 388, 8, 2272}, + {"wioterminal", "examples/pininterrupt", 7379, 1489, 116, 6912}, // TODO: also check wasm. Right now this is difficult, because // wasm binaries are run through wasm-opt and therefore the diff --git a/src/internal/task/task_none.go b/src/internal/task/task_none.go index 280f1c4a8..60bd867ae 100644 --- a/src/internal/task/task_none.go +++ b/src/internal/task/task_none.go @@ -36,3 +36,9 @@ func OnSystemStack() bool { // This scheduler does not do any stack switching. return true } + +func SystemStack() uintptr { + // System stack is the current stack, so this shouldn't be called. + runtimePanic("scheduler is disabled") + return 0 // unreachable +} diff --git a/src/runtime/gc_stack_raw.go b/src/runtime/gc_stack_raw.go index 94cb5e43b..5c302b1f1 100644 --- a/src/runtime/gc_stack_raw.go +++ b/src/runtime/gc_stack_raw.go @@ -20,7 +20,7 @@ func markStack() { if !task.OnSystemStack() { // Mark system stack. - markRoots(getSystemStackPointer(), stackTop) + markRoots(task.SystemStack(), stackTop) } } diff --git a/src/runtime/scheduler_none.go b/src/runtime/scheduler_none.go index 3f88e03eb..153973971 100644 --- a/src/runtime/scheduler_none.go +++ b/src/runtime/scheduler_none.go @@ -73,9 +73,3 @@ func scheduler(returnAtDeadlock bool) { // this code should be unreachable. runtimePanic("unreachable: scheduler must not be called with the 'none' scheduler") } - -// getSystemStackPointer returns the current stack pointer of the system stack. -// This is always the current stack pointer. -func getSystemStackPointer() uintptr { - return getCurrentStackPointer() -} diff --git a/src/runtime/scheduler_tasks.go b/src/runtime/scheduler_tasks.go deleted file mode 100644 index 6ee540fd3..000000000 --- a/src/runtime/scheduler_tasks.go +++ /dev/null @@ -1,17 +0,0 @@ -//go:build scheduler.tasks - -package runtime - -import "internal/task" - -// getSystemStackPointer returns the current stack pointer of the system stack. -// This is not necessarily the same as the current stack pointer. -func getSystemStackPointer() uintptr { - // TODO: this always returns the correct stack on Cortex-M, so don't bother - // comparing against 0. - sp := task.SystemStack() - if sp == 0 { - sp = getCurrentStackPointer() - } - return sp -}