uint64_t size = decode_uleb128 (p, &p);
uintptr_t num = decode_uleb128 (p, &p);
uintptr_t ref_offset;
+ uintptr_t last_obj_offset = 0;
ClassDesc *cd = lookup_class (ptr_base + ptrdiff);
if (size) {
HeapClassDesc *hcd = add_heap_shot_class (thread->current_heap_shot, cd, size);
/* FIXME: use object distance to measure how good
* the GC is at keeping related objects close
*/
+ uintptr_t offset = ctx->data_version > 1? last_obj_offset + decode_uleb128 (p, &p): -1;
intptr_t obj1diff = decode_sleb128 (p, &p);
+ last_obj_offset = offset;
if (collect_traces)
ho->refs [ref_offset + i] = OBJ_ADDR (obj1diff);
if (num_tracked_objects)
if (!load_data (ctx, 32))
return NULL;
p = ctx->buf;
- if (read_int32 (p) != LOG_HEADER_ID || p [6] != LOG_DATA_VERSION)
+ if (read_int32 (p) != LOG_HEADER_ID || p [6] > LOG_DATA_VERSION)
return NULL;
ctx->version_major = p [4];
ctx->version_minor = p [5];
* [class: sleb128] the object MonoClass* as a difference from ptr_base
* [size: uleb128] size of the object on the heap
* [num_refs: uleb128] number of object references
+ * if (format version > 1) each referenced objref is preceded by a
+ * uleb128 encoded offset: the first offset is from the object address
+ * and each next offset is relative to the previous one
* [objrefs: sleb128]+ object referenced as a difference from obj_base
*
*/
}
static int
-gc_reference (MonoObject *obj, MonoClass *klass, uintptr_t size, uintptr_t num, MonoObject **refs, void *data)
+gc_reference (MonoObject *obj, MonoClass *klass, uintptr_t size, uintptr_t num, MonoObject **refs, uintptr_t *offsets, void *data)
{
int i;
+ uintptr_t last_offset = 0;
//const char *name = mono_class_get_name (klass);
LogBuffer *logbuffer = ensure_logbuf (20 + num * 8);
emit_byte (logbuffer, TYPE_HEAP_OBJECT | TYPE_HEAP);
size &= ~7;
emit_value (logbuffer, size);
emit_value (logbuffer, num);
- for (i = 0; i < num; ++i)
+ for (i = 0; i < num; ++i) {
+ emit_value (logbuffer, offsets [i] - last_offset);
+ last_offset = offsets [i];
emit_obj (logbuffer, refs [i]);
+ }
//if (num)
// printf ("obj: %p, klass: %s, refs: %d, size: %d\n", obj, name, (int)num, (int)size);
return 0;