/* libmisc/intercept.c - Interceptable ("weak") functions * * Copyright (C) 2024-2025 Luke T. Shumaker * SPDX-License-Identifier: AGPL-3.0-or-later */ #include /* for uintptr_t */ #include /* for fputc(), stderr */ #include /* for abort(), aligned_alloc(), realloc(), free(), random() */ #include /* for memcpy() */ #include #include [[gnu::weak]] void __lm_putchar(unsigned char c) { (void)fputc(c, stderr); } [[gnu::weak]] void __lm_abort(void) { abort(); } [[gnu::weak]] void *__lm_heap_aligned_realloc(void *ptr, size_t align, size_t size) { if (!size) size = 1; size = LM_ROUND_UP(size, align); if (!ptr) { void *ret = aligned_alloc(align, size); memset(ret, 0, size); return ret; } ptr = realloc(ptr, size); if ((uintptr_t)ptr % align) { void *new = aligned_alloc(align, size); memcpy(new, ptr, size); free(ptr); ptr = new; } return ptr; } [[gnu::weak]] void __lm_heap_free(void *ptr) { free(ptr); } [[gnu::weak]] void __lm_heap_take(void *) {} [[gnu::weak]] uint32_t __lm_rand_uint31(void) { return (uint32_t)random(); } [[gnu::weak]] uint32_t __lm_rand_uint32(void) { return __lm_rand_uint31() << 31 | __lm_rand_uint31(); } [[gnu::weak]] uint64_t __lm_rand_uint62(void) { return (((uint64_t)__lm_rand_uint31()) << 31) | __lm_rand_uint31(); } [[gnu::weak]] uint64_t __lm_rand_uint64(void) { return (((uint64_t)__lm_rand_uint31()) << 62) | (((uint64_t)__lm_rand_uint31()) << 31) | __lm_rand_uint31(); } [[gnu::weak]] uint64_t __lm_rand_uint63(void) { return __lm_rand_uint64() & UINT64_C(0x7fffffffffffffff); }