runtime: refactor markGlobals to findGlobals

Instead of markGlobals calling markRoots unconditionally (which doesn't
make sense for -gc=none and -gc=leaking), provide markRoots as a
callback function.

This is in preparation for -gc=boehm, where the previous design is even
more awkward and a callback makes far more sense.

I've tested the size impact using `make smoketest XTENSA=0`. There is
none, except for two cases:

  * One with `-opt=0` so const-propagation for the callback didn't take
    place.
  * One other on AVR, I don't know why but as it's only 16 bytes in a
    very specific case I'm going to assume it's just a random change in
    compiler output that caused a size difference.
This commit is contained in:
Ayke van Laethem
2023-09-01 17:50:41 +02:00
committed by Ron Evans
parent dc449882ad
commit 4643401a1d
8 changed files with 20 additions and 27 deletions
+4 -4
View File
@@ -245,17 +245,17 @@ var bssStartSymbol [0]byte
//go:extern __bss_end
var bssEndSymbol [0]byte
// Mark global variables.
// Find global variables.
// The linker script provides __*_start and __*_end symbols that can be used to
// scan the given sections. They are already aligned so don't need to be
// manually aligned here.
func markGlobals() {
func findGlobals(found func(start, end uintptr)) {
dataStart := uintptr(unsafe.Pointer(&dataStartSymbol))
dataEnd := uintptr(unsafe.Pointer(&dataEndSymbol))
markRoots(dataStart, dataEnd)
found(dataStart, dataEnd)
bssStart := uintptr(unsafe.Pointer(&bssStartSymbol))
bssEnd := uintptr(unsafe.Pointer(&bssEndSymbol))
markRoots(bssStart, bssEnd)
found(bssStart, bssEnd)
}
// getContextPtr returns the hblauncher context