| // Copyright 2026 The IREE Authors | |
| // | |
| // Licensed under the Apache License v2.0 with LLVM Exceptions. | |
| // See https://llvm.org/LICENSE.txt for license information. | |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | |
| // dlmalloc configured for wasm32 freestanding. | |
| // | |
| // Doug Lea's malloc (v2.8.6, MIT-0 license) configured to use our sbrk() | |
| // implementation (which wraps wasm memory.grow). No mmap, no locks (single- | |
| // mutator), no system headers. Adds ~10KB to the wasm binary. | |
| // | |
| // All configuration is via #defines before including the upstream source. | |
| // The upstream source is unmodified (third_party/dlmalloc/malloc.c). | |
| // --- Configuration for wasm32 freestanding --- | |
| // Use our sbrk() (in sbrk.c) as the memory source. No mmap. | |
| #define HAVE_MMAP 0 | |
| #define HAVE_MREMAP 0 | |
| #define HAVE_MORECORE 1 | |
| // sbrk always returns contiguous memory (wasm linear memory is contiguous). | |
| #define MORECORE_CONTIGUOUS 1 | |
| // No threading — single-threaded wasm. | |
| #define USE_LOCKS 0 | |
| // No mspace support needed — IREE uses a single heap. | |
| #define MSPACES 0 | |
| #define ONLY_MSPACES 0 | |
| // Match max_align_t from <stddef.h>. Clang gives wasm32 long double 16-byte | |
| // alignment, so malloc must return at least 16-byte-aligned storage. | |
| #define MALLOC_ALIGNMENT ((size_t)16U) | |
| // Error handling: set errno on failure. Our abort() calls the JS host. | |
| #define MALLOC_FAILURE_ACTION errno = ENOMEM | |
| // Disable debug checks in release builds (controlled by NDEBUG). | |
| #ifndef NDEBUG | |
| #define DEBUG 1 | |
| #else | |
| #define DEBUG 0 | |
| #endif | |
| // Disable footers — they add 4 bytes per allocation for checking which | |
| // mspace an allocation came from. We only have one mspace. | |
| #define FOOTERS 0 | |
| // Omit legacy introspection/statistics entry points we don't expose through our | |
| // freestanding libc headers. | |
| #define NO_MALLINFO 1 | |
| #define NO_MALLOC_STATS 1 | |
| // No need for the dl_ prefix — we're the only malloc implementation. | |
| // (USE_DL_PREFIX is intentionally NOT defined.) | |
| // dlmalloc uses these from libc. Provide declarations so it compiles | |
| // without system headers. | |
| #include <errno.h> | |
| #include <stddef.h> | |
| #include <stdint.h> | |
| #include <string.h> // memcpy, memset (wasm builtins via -mbulk-memory). | |
| // Prevent dlmalloc from including system headers it doesn't need. | |
| #define LACKS_SYS_PARAM_H | |
| #define LACKS_SYS_MMAN_H | |
| #define LACKS_SYS_TYPES_H | |
| #define LACKS_STRINGS_H | |
| #define LACKS_SCHED_H | |
| #define LACKS_TIME_H | |
| #define LACKS_UNISTD_H | |
| #define LACKS_FCNTL_H | |
| // sbrk declaration (implemented in sbrk.c). | |
| // Uses ptrdiff_t to match dlmalloc's own declaration. | |
| extern void* sbrk(ptrdiff_t increment); | |
| // dlmalloc references abort() for fatal internal errors. | |
| #include <stdlib.h> | |
| // --- Include the upstream source --- | |
| #include "malloc.c" // NOLINT(build/include) - textual include of upstream dlmalloc |