Improve alignment determination (Fixes #178)

This commit is contained in:
Mark VanderVoord
2026-06-30 10:59:10 -04:00
parent ebdc8ee128
commit a25354f659
2 changed files with 27 additions and 0 deletions
+4
View File
@@ -25,8 +25,12 @@ const char* CMockStringMismatch = "Function called with unexpected argument v
static unsigned char* CMock_Guts_Buffer = NULL;
static CMOCK_MEM_INDEX_TYPE CMock_Guts_BufferSize = CMOCK_MEM_ALIGN_SIZE;
static CMOCK_MEM_INDEX_TYPE CMock_Guts_FreePtr = CMOCK_MEM_ALIGN_SIZE;
#else
#if !defined(UNITY_EXCLUDE_STDDEF_H) && defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L)
static _Alignas(max_align_t) long long CMock_Guts_Space[(CMOCK_MEM_SIZE + CMOCK_MEM_ALIGN_SIZE + sizeof(long long) - 1) / sizeof(long long)];
#else
static long long CMock_Guts_Space[(CMOCK_MEM_SIZE + CMOCK_MEM_ALIGN_SIZE + sizeof(long long) - 1) / sizeof(long long)];
#endif
static unsigned char* CMock_Guts_Buffer = (unsigned char*)CMock_Guts_Space;
static CMOCK_MEM_INDEX_TYPE CMock_Guts_BufferSize = CMOCK_MEM_SIZE + CMOCK_MEM_ALIGN_SIZE;//sizeof(CMock_Guts_Space);
static CMOCK_MEM_INDEX_TYPE CMock_Guts_FreePtr = CMOCK_MEM_ALIGN_SIZE;
+23
View File
@@ -76,6 +76,18 @@ extern const char* CMockStringMismatch;
#else
#define CMOCK_MEM_ALIGN (2)
#endif
/* Boost to 8-byte alignment when 64-bit integers or doubles are enabled,
* since those types require 8-byte alignment even on 32-bit platforms */
#if CMOCK_MEM_ALIGN < 3
#if defined(UNITY_SUPPORT_64) || defined(UNITY_INCLUDE_DOUBLE)
#undef CMOCK_MEM_ALIGN
#define CMOCK_MEM_ALIGN (3)
#endif
#endif
/* sentinel: CMOCK_MEM_ALIGN was auto-detected (not user-supplied) */
#define CMOCK_MEM_ALIGN_AUTO
#endif
/* amount of memory to allow cmock to use in its internal heap */
@@ -98,6 +110,17 @@ extern const char* CMockStringMismatch;
/* automatically calculated defs for easier reading */
#define CMOCK_MEM_ALIGN_SIZE (CMOCK_MEM_INDEX_TYPE)(1u << CMOCK_MEM_ALIGN)
#define CMOCK_MEM_ALIGN_MASK (CMOCK_MEM_INDEX_TYPE)(CMOCK_MEM_ALIGN_SIZE - 1)
/* When CMOCK_MEM_ALIGN was auto-detected and stddef.h is available (C11+),
* use sizeof(max_align_t) to guarantee alignment is sufficient for all
* fundamental types on this platform, taking the larger of the two values */
#if defined(CMOCK_MEM_ALIGN_AUTO) && !defined(UNITY_EXCLUDE_STDDEF_H) && defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L)
#undef CMOCK_MEM_ALIGN_SIZE
#undef CMOCK_MEM_ALIGN_MASK
#define CMOCK_MEM_ALIGN_SIZE (CMOCK_MEM_INDEX_TYPE)(sizeof(max_align_t) > (1u << CMOCK_MEM_ALIGN) ? sizeof(max_align_t) : (1u << CMOCK_MEM_ALIGN))
#define CMOCK_MEM_ALIGN_MASK (CMOCK_MEM_INDEX_TYPE)(CMOCK_MEM_ALIGN_SIZE - 1)
#endif
#define CMOCK_MEM_INDEX_SIZE (CMOCK_MEM_INDEX_TYPE)(CMOCK_MEM_PTR_AS_INT)((sizeof(CMOCK_MEM_INDEX_TYPE) > CMOCK_MEM_ALIGN_SIZE) ? sizeof(CMOCK_MEM_INDEX_TYPE) : CMOCK_MEM_ALIGN_SIZE)