1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-08 03:28:20 +02:00

Fixed sTypes lookups with LLVM debug info

This commit is contained in:
Brian Fiete 2020-08-25 11:25:22 -07:00
parent 78cdfd5d24
commit dbbbed4528
4 changed files with 44 additions and 22 deletions

View file

@ -1134,32 +1134,48 @@ DbgTypedValue DbgExprEvaluator::GetBeefTypeById(int typeId)
if (mDebugTarget->mTargetBinary == NULL)
return DbgTypedValue();
mDebugTarget->mTargetBinary->ParseTypeData();
auto typeTypeEntry = mDebugTarget->mTargetBinary->FindType("System.Type", DbgLanguage_Beef);
if ((typeTypeEntry == NULL) || (typeTypeEntry->mValue == NULL))
return DbgTypedValue();
auto typeType = typeTypeEntry->mValue;
if (typeType->mNeedsGlobalsPopulated)
typeType->mCompileUnit->mDbgModule->PopulateTypeGlobals(typeType);
for (auto member : typeType->mMemberList)
if (mDebugTarget->mTargetBinary->mBfTypesInfoAddr == 0)
{
if ((member->mIsStatic) && (member->mName != NULL) && (strcmp(member->mName, "sTypes") == 0) && (member->mLocationData != NULL))
mDebugTarget->mTargetBinary->mBfTypesInfoAddr = -1;
mDebugTarget->mTargetBinary->ParseTypeData();
auto typeTypeEntry = mDebugTarget->mTargetBinary->FindType("System.Type", DbgLanguage_Beef);
if ((typeTypeEntry != NULL) && (typeTypeEntry->mValue != NULL))
{
auto stackFrame = GetStackFrame();
DbgAddrType addrType;
intptr valAddr = member->mCompileUnit->mDbgModule->EvaluateLocation(NULL, member->mLocationData, member->mLocationLen, stackFrame, &addrType);
if (valAddr != 0)
auto typeType = typeTypeEntry->mValue;
mDebugTarget->mTargetBinary->mBfTypeType = typeType;
if (typeType->mNeedsGlobalsPopulated)
typeType->mCompileUnit->mDbgModule->PopulateTypeGlobals(typeType);
for (auto member : typeType->mMemberList)
{
DbgTypedValue typedVal;
typedVal.mType = typeType;
addr_target addr = valAddr + typeId * sizeof(addr_target);
typedVal.mSrcAddress = mDebugger->ReadMemory<addr_target>(addr);
return typedVal;
if ((member->mIsStatic) && (member->mName != NULL) && (strcmp(member->mName, "sTypes") == 0) && (member->mLocationData != NULL))
{
auto stackFrame = GetStackFrame();
DbgAddrType addrType;
mDebugTarget->mTargetBinary->mBfTypesInfoAddr = member->mCompileUnit->mDbgModule->EvaluateLocation(NULL, member->mLocationData, member->mLocationLen, stackFrame, &addrType);
}
}
if (mDebugTarget->mTargetBinary->mBfTypesInfoAddr <= 0)
{
mDebugTarget->mTargetBinary->ParseSymbolData();
auto entry = mDebugTarget->mTargetBinary->mSymbolNameMap.Find("?sTypes@Type@System@bf@@2PEAPEAV123@A");
if (entry)
mDebugTarget->mTargetBinary->mBfTypesInfoAddr = entry->mValue->mAddress;
}
}
}
if (mDebugTarget->mTargetBinary->mBfTypesInfoAddr > 0)
{
DbgTypedValue typedVal;
typedVal.mType = mDebugTarget->mTargetBinary->mBfTypeType;
addr_target addr = mDebugTarget->mTargetBinary->mBfTypesInfoAddr + typeId * sizeof(addr_target);
typedVal.mSrcAddress = mDebugger->ReadMemory<addr_target>(addr);
return typedVal;
}
return DbgTypedValue();
}