| 144 | } |
| 145 | |
| 146 | void DbgHotScanner::ScanSpan(TCFake::Span* span, int expectedStartPage, int memKind) |
| 147 | { |
| 148 | if (span->location != TCFake::Span::IN_USE) |
| 149 | return; |
| 150 | |
| 151 | if (span->start != expectedStartPage) |
| 152 | { |
| 153 | return; |
| 154 | } |
| 155 | |
| 156 | intptr pageSize = (intptr)1 << kPageShift; |
| 157 | int spanSize = pageSize * span->length; |
| 158 | addr_target spanStart = ((addr_target)span->start << kPageShift); |
| 159 | |
| 160 | if (spanSize > mScanData.size()) |
| 161 | { |
| 162 | mScanData.Resize(spanSize); |
| 163 | } |
| 164 | void* spanPtr = &mScanData[0]; |
| 165 | mDebugger->ReadMemory(spanStart, spanSize, spanPtr); |
| 166 | void* spanEnd = (void*)((intptr)spanPtr + spanSize); |
| 167 | |
| 168 | //BF_LOGASSERT((spanStart >= TCFake::PageHeap::sAddressStart) && (spanEnd <= TCFake::PageHeap::sAddressEnd)); |
| 169 | |
| 170 | int elementSize = mDbgGCData.mSizeClasses[span->sizeclass]; |
| 171 | if (elementSize == 0) |
| 172 | elementSize = spanSize; |
| 173 | //BF_LOGASSERT(elementSize >= sizeof(bf::System::Object)); |
| 174 | |
| 175 | auto _MarkTypeUsed = [&](int typeId, intptr size) |
| 176 | { |
| 177 | if (typeId < 0) |
| 178 | return; |
| 179 | while (mDebugger->mHotResolveData->mTypeData.size() <= typeId) |
| 180 | mDebugger->mHotResolveData->mTypeData.Add(DbgHotResolveData::TypeData()); |
| 181 | auto& typeData = mDebugger->mHotResolveData->mTypeData[typeId]; |
| 182 | typeData.mSize += size; |
| 183 | typeData.mCount++; |
| 184 | }; |
| 185 | |
| 186 | int objectSize = ((mDbgGCData.mDbgFlags & BfRtFlags_ObjectHasDebugFlags) != 0) ? sizeof(addr_target)*2 : sizeof(addr_target); |
| 187 | |
| 188 | mDebugger->mDebugTarget->GetCompilerSettings(); |
| 189 | if (mDebugger->mDebugTarget->mBfObjectSize != 0) |
| 190 | objectSize = mDebugger->mDebugTarget->mBfObjectSize; |
| 191 | |
| 192 | while (spanPtr <= (uint8*)spanEnd - elementSize) |
| 193 | { |
| 194 | addr_target classVDataAddr = 0; |
| 195 | if (memKind == 0) |
| 196 | { |
| 197 | // Obj |
| 198 | Fake_BfObject_WithFlags* obj = (Fake_BfObject_WithFlags*)spanPtr; |
| 199 | if (obj->mAllocCheckPtr != 0) |
| 200 | { |
| 201 | int objectFlags = obj->mObjectFlags; |
| 202 | if ((objectFlags & BF_OBJECTFLAG_DELETED) == 0) |
| 203 | { |
nothing calls this directly
no test coverage detected