diff --git a/src/cmock.c b/src/cmock.c index 1cc1725..190284a 100644 --- a/src/cmock.c +++ b/src/cmock.c @@ -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; diff --git a/src/cmock_internals.h b/src/cmock_internals.h index b3d23f5..118e28c 100644 --- a/src/cmock_internals.h +++ b/src/cmock_internals.h @@ -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)