Skip to content

Commit ab1a822

Browse files
authored
more filtering in enum conservatively (#95937)
1 parent fe70ca6 commit ab1a822

File tree

2 files changed

+17
-2
lines changed

2 files changed

+17
-2
lines changed

src/coreclr/nativeaot/Runtime/gcrhenv.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -291,6 +291,7 @@ void MethodTable::InitializeAsGcFreeType()
291291
#endif // !DACCESS_COMPILE
292292

293293
extern void GcEnumObject(PTR_OBJECTREF pObj, uint32_t flags, EnumGcRefCallbackFunc * fnGcEnumRef, EnumGcRefScanContext * pSc);
294+
extern void GcEnumObjectConservatively(PTR_PTR_Object ppObj, EnumGcRefCallbackFunc* fnGcEnumRef, EnumGcRefScanContext* pSc);
294295
extern void GcEnumObjectsConservatively(PTR_OBJECTREF pLowerBound, PTR_OBJECTREF pUpperBound, EnumGcRefCallbackFunc * fnGcEnumRef, EnumGcRefScanContext * pSc);
295296
extern void GcBulkEnumObjects(PTR_OBJECTREF pObjs, DWORD cObjs, EnumGcRefCallbackFunc * fnGcEnumRef, EnumGcRefScanContext * pSc);
296297

@@ -356,7 +357,7 @@ void RedhawkGCInterface::EnumGcRef(PTR_RtuObjectRef pRef, GCRefKind kind, void *
356357
// static
357358
void RedhawkGCInterface::EnumGcRefConservatively(PTR_RtuObjectRef pRef, void* pfnEnumCallback, void* pvCallbackData)
358359
{
359-
GcEnumObject((PTR_OBJECTREF)pRef, GC_CALL_INTERIOR | GC_CALL_PINNED, (EnumGcRefCallbackFunc*)pfnEnumCallback, (EnumGcRefScanContext*)pvCallbackData);
360+
GcEnumObjectConservatively((PTR_OBJECTREF)pRef, (EnumGcRefCallbackFunc*)pfnEnumCallback, (EnumGcRefScanContext*)pvCallbackData);
360361
}
361362

362363
#ifndef DACCESS_COMPILE

src/coreclr/nativeaot/Runtime/gcrhscan.cpp

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,21 @@ void GcEnumObjectsConservatively(PTR_PTR_Object ppLowerBound, PTR_PTR_Object ppU
156156
// value is a GC heap reference but it's a cheap check that weeds out a lot of spurious values.
157157
PTR_Object pObj = *ppObj;
158158
if (((PTR_UInt8)pObj >= g_lowest_address) && ((PTR_UInt8)pObj <= g_highest_address))
159-
fnGcEnumRef(ppObj, pSc, GC_CALL_INTERIOR|GC_CALL_PINNED);
159+
PromoteCarefully(ppObj, GC_CALL_INTERIOR | GC_CALL_PINNED, fnGcEnumRef, pSc);
160160
}
161161
}
162162
}
163+
164+
void GcEnumObjectConservatively(PTR_PTR_Object ppObj, EnumGcRefCallbackFunc* fnGcEnumRef, EnumGcRefScanContext* pSc)
165+
{
166+
// Only report potential references in the promotion phase. Since we report everything as pinned there
167+
// should be no work to do in the relocation phase.
168+
if (pSc->promotion)
169+
{
170+
// Only report values that lie in the GC heap range. This doesn't conclusively guarantee that the
171+
// value is a GC heap reference but it's a cheap check that weeds out a lot of spurious values.
172+
PTR_Object pObj = *ppObj;
173+
if (((PTR_UInt8)pObj >= g_lowest_address) && ((PTR_UInt8)pObj <= g_highest_address))
174+
PromoteCarefully(ppObj, GC_CALL_INTERIOR | GC_CALL_PINNED, fnGcEnumRef, pSc);
175+
}
176+
}

0 commit comments

Comments
 (0)