blob: c4cd1aef36de7a430b0ecc02272532ef36e8532f [file]
// 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