Skip to content

Commit 5bdc1b3

Browse files
authored
correctly track element pointer in heap snapshot (#51592)
Fixes #51576 on a simple snapshot I collected on my machine.
1 parent 91f8020 commit 5bdc1b3

File tree

1 file changed

+17
-11
lines changed

1 file changed

+17
-11
lines changed

src/gc.c

+17-11
Original file line numberDiff line numberDiff line change
@@ -2064,7 +2064,8 @@ STATIC_INLINE void gc_mark_objarray(jl_ptls_t ptls, jl_value_t *obj_parent, jl_v
20642064
// the first young object before starting this chunk
20652065
// (this also would be valid for young objects, but probably less beneficial)
20662066
for (; obj_begin < obj_end; obj_begin += step) {
2067-
new_obj = *obj_begin;
2067+
jl_value_t **slot = obj_begin;
2068+
new_obj = *slot;
20682069
if (new_obj != NULL) {
20692070
verify_parent2("obj array", obj_parent, obj_begin, "elem(%d)",
20702071
gc_slot_to_arrayidx(obj_parent, obj_begin));
@@ -2073,7 +2074,7 @@ STATIC_INLINE void gc_mark_objarray(jl_ptls_t ptls, jl_value_t *obj_parent, jl_v
20732074
nptr |= 1;
20742075
if (!gc_marked(o->header))
20752076
break;
2076-
gc_heap_snapshot_record_array_edge(obj_parent, &new_obj);
2077+
gc_heap_snapshot_record_array_edge(obj_parent, slot);
20772078
}
20782079
}
20792080
}
@@ -2095,13 +2096,14 @@ STATIC_INLINE void gc_mark_objarray(jl_ptls_t ptls, jl_value_t *obj_parent, jl_v
20952096
}
20962097
}
20972098
for (; obj_begin < scan_end; obj_begin += step) {
2099+
jl_value_t **slot = obj_begin;
20982100
new_obj = *obj_begin;
20992101
if (new_obj != NULL) {
21002102
verify_parent2("obj array", obj_parent, obj_begin, "elem(%d)",
21012103
gc_slot_to_arrayidx(obj_parent, obj_begin));
21022104
gc_assert_parent_validity(obj_parent, new_obj);
21032105
gc_try_claim_and_push(mq, new_obj, &nptr);
2104-
gc_heap_snapshot_record_array_edge(obj_parent, &new_obj);
2106+
gc_heap_snapshot_record_array_edge(obj_parent, slot);
21052107
}
21062108
}
21072109
if (too_big) {
@@ -2132,7 +2134,8 @@ STATIC_INLINE void gc_mark_array8(jl_ptls_t ptls, jl_value_t *ary8_parent, jl_va
21322134
for (; ary8_begin < ary8_end; ary8_begin += elsize) {
21332135
int early_end = 0;
21342136
for (uint8_t *pindex = elem_begin; pindex < elem_end; pindex++) {
2135-
new_obj = ary8_begin[*pindex];
2137+
jl_value_t **slot = &ary8_begin[*pindex];
2138+
new_obj = *slot;
21362139
if (new_obj != NULL) {
21372140
verify_parent2("array", ary8_parent, &new_obj, "elem(%d)",
21382141
gc_slot_to_arrayidx(ary8_parent, ary8_begin));
@@ -2143,7 +2146,7 @@ STATIC_INLINE void gc_mark_array8(jl_ptls_t ptls, jl_value_t *ary8_parent, jl_va
21432146
early_end = 1;
21442147
break;
21452148
}
2146-
gc_heap_snapshot_record_array_edge(ary8_parent, &new_obj);
2149+
gc_heap_snapshot_record_array_edge(ary8_parent, slot);
21472150
}
21482151
}
21492152
if (early_end)
@@ -2169,13 +2172,14 @@ STATIC_INLINE void gc_mark_array8(jl_ptls_t ptls, jl_value_t *ary8_parent, jl_va
21692172
}
21702173
for (; ary8_begin < ary8_end; ary8_begin += elsize) {
21712174
for (uint8_t *pindex = elem_begin; pindex < elem_end; pindex++) {
2172-
new_obj = ary8_begin[*pindex];
2175+
jl_value_t **slot = &ary8_begin[*pindex];
2176+
new_obj = *slot;
21732177
if (new_obj != NULL) {
21742178
verify_parent2("array", ary8_parent, &new_obj, "elem(%d)",
21752179
gc_slot_to_arrayidx(ary8_parent, ary8_begin));
21762180
gc_assert_parent_validity(ary8_parent, new_obj);
21772181
gc_try_claim_and_push(mq, new_obj, &nptr);
2178-
gc_heap_snapshot_record_array_edge(ary8_parent, &new_obj);
2182+
gc_heap_snapshot_record_array_edge(ary8_parent, slot);
21792183
}
21802184
}
21812185
}
@@ -2207,7 +2211,8 @@ STATIC_INLINE void gc_mark_array16(jl_ptls_t ptls, jl_value_t *ary16_parent, jl_
22072211
for (; ary16_begin < ary16_end; ary16_begin += elsize) {
22082212
int early_end = 0;
22092213
for (uint16_t *pindex = elem_begin; pindex < elem_end; pindex++) {
2210-
new_obj = ary16_begin[*pindex];
2214+
jl_value_t **slot = &ary16_begin[*pindex];
2215+
new_obj = *slot;
22112216
if (new_obj != NULL) {
22122217
verify_parent2("array", ary16_parent, &new_obj, "elem(%d)",
22132218
gc_slot_to_arrayidx(ary16_parent, ary16_begin));
@@ -2218,7 +2223,7 @@ STATIC_INLINE void gc_mark_array16(jl_ptls_t ptls, jl_value_t *ary16_parent, jl_
22182223
early_end = 1;
22192224
break;
22202225
}
2221-
gc_heap_snapshot_record_array_edge(ary16_parent, &new_obj);
2226+
gc_heap_snapshot_record_array_edge(ary16_parent, slot);
22222227
}
22232228
}
22242229
if (early_end)
@@ -2244,13 +2249,14 @@ STATIC_INLINE void gc_mark_array16(jl_ptls_t ptls, jl_value_t *ary16_parent, jl_
22442249
}
22452250
for (; ary16_begin < scan_end; ary16_begin += elsize) {
22462251
for (uint16_t *pindex = elem_begin; pindex < elem_end; pindex++) {
2247-
new_obj = ary16_begin[*pindex];
2252+
jl_value_t **slot = &ary16_begin[*pindex];
2253+
new_obj = *slot;
22482254
if (new_obj != NULL) {
22492255
verify_parent2("array", ary16_parent, &new_obj, "elem(%d)",
22502256
gc_slot_to_arrayidx(ary16_parent, ary16_begin));
22512257
gc_assert_parent_validity(ary16_parent, new_obj);
22522258
gc_try_claim_and_push(mq, new_obj, &nptr);
2253-
gc_heap_snapshot_record_array_edge(ary16_parent, &new_obj);
2259+
gc_heap_snapshot_record_array_edge(ary16_parent, slot);
22542260
}
22552261
}
22562262
}

0 commit comments

Comments
 (0)