mirror of
https://github.com/tinygo-org/tinygo.git
synced 2026-08-18 11:33:59 +00:00
wasm: align heap to 16 bytes
This commit fixes two things:
* It changes the alignment to 16 bytes (from 4), to match max_align_t
in C.
* It manually aligns heapStart on WebAssembly, to work around a bug in
wasm-ld with --stack-first (see https://reviews.llvm.org/D106499).
This commit is contained in:
committed by
Ron Evans
parent
e834d78871
commit
65c1978965
@@ -32,9 +32,11 @@ var (
|
|||||||
|
|
||||||
const wasmPageSize = 64 * 1024
|
const wasmPageSize = 64 * 1024
|
||||||
|
|
||||||
// Align on word boundary.
|
|
||||||
func align(ptr uintptr) uintptr {
|
func align(ptr uintptr) uintptr {
|
||||||
return (ptr + 3) &^ 3
|
// Align to 16, which is the alignment of max_align_t:
|
||||||
|
// https://godbolt.org/z/dYqTsWrGq
|
||||||
|
const heapAlign = 16
|
||||||
|
return (ptr + heapAlign - 1) &^ (heapAlign - 1)
|
||||||
}
|
}
|
||||||
|
|
||||||
func getCurrentStackPointer() uintptr
|
func getCurrentStackPointer() uintptr
|
||||||
|
|||||||
@@ -228,6 +228,14 @@ func setHeapEnd(newHeapEnd uintptr) {
|
|||||||
// This function can be called again when the heap size increases. The caller is
|
// This function can be called again when the heap size increases. The caller is
|
||||||
// responsible for copying the metadata to the new location.
|
// responsible for copying the metadata to the new location.
|
||||||
func calculateHeapAddresses() {
|
func calculateHeapAddresses() {
|
||||||
|
if GOARCH == "wasm" {
|
||||||
|
// This is a workaround for a bug in wasm-ld: wasm-ld doesn't always
|
||||||
|
// align __heap_base and when this memory is shared through an API, it
|
||||||
|
// might result in unaligned memory. For details, see:
|
||||||
|
// https://reviews.llvm.org/D106499
|
||||||
|
// It should be removed once we switch to LLVM 13, where this is fixed.
|
||||||
|
heapStart = align(heapStart)
|
||||||
|
}
|
||||||
totalSize := heapEnd - heapStart
|
totalSize := heapEnd - heapStart
|
||||||
|
|
||||||
// Allocate some memory to keep 2 bits of information about every block.
|
// Allocate some memory to keep 2 bits of information about every block.
|
||||||
|
|||||||
Reference in New Issue
Block a user