diff --git a/core/tiny_region_id.h b/core/tiny_region_id.h index 444275ec..f7e4e18a 100644 --- a/core/tiny_region_id.h +++ b/core/tiny_region_id.h @@ -232,9 +232,21 @@ static inline void* tiny_region_id_write_header(void* base, int class_idx) { } } while (0); - *header_ptr = HEADER_MAGIC | (class_idx & HEADER_CLASS_MASK); - PTR_TRACK_HEADER_WRITE(base, HEADER_MAGIC | (class_idx & HEADER_CLASS_MASK)); - void* user = header_ptr + 1; // skip header for user pointer + // P3: Skip header write when class_map is active (default) + // class_map provides class_idx lookup, so header byte is no longer needed + // ENV: HAKMEM_TINY_WRITE_HEADER=1 to force header write (legacy mode) + // Memory layout preserved: user = base + 1 (1B unused when skipped) + static int g_write_header = -1; + if (__builtin_expect(g_write_header == -1, 0)) { + const char* e = getenv("HAKMEM_TINY_WRITE_HEADER"); + g_write_header = (e && *e && *e != '0') ? 1 : 0; + } + if (__builtin_expect(g_write_header, 0)) { + // Legacy mode: write header for debugging or compatibility + *header_ptr = HEADER_MAGIC | (class_idx & HEADER_CLASS_MASK); + PTR_TRACK_HEADER_WRITE(base, HEADER_MAGIC | (class_idx & HEADER_CLASS_MASK)); + } + void* user = header_ptr + 1; // skip header for user pointer (layout preserved) PTR_TRACK_MALLOC(base, 0, class_idx); // Track at BASE (where header is) // ========== ALLOCATION LOGGING (Debug builds only) ==========