@@ -86,11 +86,11 @@ hmu_verify(void *vheap, hmu_t *hmu);
8686#define GC_MIN_ALIGNMENT 8
8787#endif
8888
89- #define GC_SMALLEST_SIZE \
90- GC_ALIGN_8(HMU_SIZE + OBJ_PREFIX_SIZE + OBJ_SUFFIX_SIZE + 8)
91- #define GC_GET_REAL_SIZE ( x ) \
92- GC_ALIGN_8(HMU_SIZE + OBJ_PREFIX_SIZE + OBJ_SUFFIX_SIZE \
93- + (((x) > 8) ? (x) : 8))
89+ /* Smallest allocation size for normal allocations
90+ * The +8 ensures minimum allocation size for tree node structure */
91+ #define GC_SMALLEST_SIZE GC_ALIGN_8(OBJ_EXTRA_SIZE + 8)
92+
93+ #define GC_GET_REAL_SIZE ( x ) GC_ALIGN_8(OBJ_EXTRA_SIZE + (((x) > 8) ? (x) : 8))
9494
9595/*
9696 * ============================================================================
@@ -150,13 +150,17 @@ hmu_verify(void *vheap, hmu_t *hmu);
150150 * ----------------------
151151 *
152152 * Low Address High Address
153- * ┌─────────────┬──────────┬────────────────┬──────────────┬─────────────┐
154- * │ HMU Header │ Padding │ Magic + Offset │ Aligned Data │ Padding │
155- * │ (meta) │ (0-align)│ (4 bytes) │ (size) │ (overhead) │
156- * └─────────────┴──────────┴────────────────┴──────────────┴─────────────┘
157- * ▲ ▲
158- * │ │
159- * magic_ptr user_ptr (returned, aligned)
153+ * ┌─────────────┬──────────┬─────────┬─────────┬──────────────┬─────────────┐
154+ * │ HMU Header │ Padding │ Offset │ Magic │ Aligned Data │ Padding │
155+ * │ (4 bytes) │(variable)│(4 bytes)│(4 bytes)│ (size) │ (overhead) │
156+ * └─────────────┴──────────┴─────────┴─────────┴──────────────┴─────────────┘
157+ * ▲ └────8 bytes────┘ ▲
158+ * hmu user_ptr (returned, aligned)
159+ *
160+ * Padding is variable-length to satisfy alignment constraint:
161+ * align_up(HMU_SIZE + ALIGNED_ALLOC_METADATA_SIZE, alignment)
162+ * For alignment >= 12: HMU_SIZE + padding + 8 = alignment
163+ * For alignment < 12: HMU_SIZE + padding + 8 = round_up(12, alignment)
160164 *
161165 * Constraints and Limitations:
162166 * ----------------------------
@@ -182,10 +186,35 @@ hmu_verify(void *vheap, hmu_t *hmu);
182186 * void *new_ptr = wasm_runtime_realloc(ptr, 512); // Returns NULL!
183187 */
184188
189+ /* Aligned allocation constants */
190+ /* Size of offset field before aligned ptr */
191+ #define ALIGNED_ALLOC_OFFSET_SIZE 4
192+ /* Size of magic marker before aligned ptr */
193+ #define ALIGNED_ALLOC_MAGIC_SIZE 4
194+ /* Total: 8 bytes */
195+ #define ALIGNED_ALLOC_METADATA_SIZE \
196+ (ALIGNED_ALLOC_OFFSET_SIZE + ALIGNED_ALLOC_MAGIC_SIZE)
197+
185198/* Aligned allocation magic markers */
186199#define ALIGNED_ALLOC_MAGIC_MASK 0xFFFF0000
187200#define ALIGNED_ALLOC_MAGIC_VALUE 0xA11C0000
188201
202+ /* Get magic pointer from aligned object pointer */
203+ #define ALIGNED_ALLOC_GET_MAGIC_PTR (obj ) \
204+ ((uint32_t *)((char *)(obj)-ALIGNED_ALLOC_MAGIC_SIZE))
205+
206+ /* Get offset pointer from aligned object pointer */
207+ #define ALIGNED_ALLOC_GET_OFFSET_PTR (obj ) \
208+ ((uint32_t *)((char *)(obj)-ALIGNED_ALLOC_METADATA_SIZE))
209+
210+ /* Extra overhead for aligned allocations beyond normal OBJ_EXTRA_SIZE */
211+ #define ALIGNED_ALLOC_EXTRA_OVERHEAD ALIGNED_ALLOC_METADATA_SIZE
212+
213+ /* Smallest allocation size for aligned allocations */
214+ #define GC_ALIGNED_SMALLEST_SIZE (alignment ) \
215+ GC_ALIGN_8(OBJ_EXTRA_SIZE + ALIGNED_ALLOC_METADATA_SIZE \
216+ + ((alignment) > 8 ? (alignment - 8) : 8))
217+
189218/**
190219 * Check if a gc_object was allocated with alignment requirements.
191220 *
@@ -202,7 +231,7 @@ gc_is_aligned_allocation(gc_object_t obj)
202231 if (!obj )
203232 return false;
204233
205- uint32_t * magic_ptr = ( uint32_t * )(( char * ) obj - 4 );
234+ uint32_t * magic_ptr = ALIGNED_ALLOC_GET_MAGIC_PTR ( obj );
206235 return ((* magic_ptr & ALIGNED_ALLOC_MAGIC_MASK )
207236 == ALIGNED_ALLOC_MAGIC_VALUE );
208237}
0 commit comments