mirror of
https://github.com/ThrowTheSwitch/CMock.git
synced 2026-08-13 06:37:52 +00:00
Improve alignment determination (Fixes #178)
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user