1*6c57e368SRobert Clausecker /* 2*6c57e368SRobert Clausecker * Copyright (c) 2025 Robert Clausecker <fuz@FreeBSD.org> 3*6c57e368SRobert Clausecker * 4*6c57e368SRobert Clausecker * SPDX-License-Identifier: BSD-2-Clause 5*6c57e368SRobert Clausecker */ 6*6c57e368SRobert Clausecker 7*6c57e368SRobert Clausecker #include <stdint.h> 8*6c57e368SRobert Clausecker #include <stdlib.h> 9*6c57e368SRobert Clausecker 10*6c57e368SRobert Clausecker size_t memalignment(const void * p)11*6c57e368SRobert Clauseckermemalignment(const void *p) 12*6c57e368SRobert Clausecker { 13*6c57e368SRobert Clausecker uintptr_t align; 14*6c57e368SRobert Clausecker 15*6c57e368SRobert Clausecker if (p == NULL) 16*6c57e368SRobert Clausecker return (0); 17*6c57e368SRobert Clausecker 18*6c57e368SRobert Clausecker align = (uintptr_t)p; 19*6c57e368SRobert Clausecker align &= -align; 20*6c57e368SRobert Clausecker 21*6c57e368SRobert Clausecker #if UINTPTR_MAX > SIZE_MAX 22*6c57e368SRobert Clausecker /* if alignment overflows size_t, return maximum possible */ 23*6c57e368SRobert Clausecker if (align > SIZE_MAX) 24*6c57e368SRobert Clausecker align = SIZE_MAX - SIZE_MAX/2; 25*6c57e368SRobert Clausecker #endif 26*6c57e368SRobert Clausecker 27*6c57e368SRobert Clausecker return (align); 28*6c57e368SRobert Clausecker } 29