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).
Этот коммит содержится в:
Ayke van Laethem 2021-07-25 14:30:16 +02:00 коммит произвёл Ron Evans
родитель e834d78871
коммит 65c1978965
2 изменённых файлов: 12 добавлений и 2 удалений

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

@ -32,9 +32,11 @@ var (
const wasmPageSize = 64 * 1024
// Align on word boundary.
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

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

@ -228,6 +228,14 @@ func setHeapEnd(newHeapEnd uintptr) {
// This function can be called again when the heap size increases. The caller is
// responsible for copying the metadata to the new location.
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
// Allocate some memory to keep 2 bits of information about every block.