1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-08 11:38:21 +02:00

Fixed 'reduced definition' issue

This commit is contained in:
Brian Fiete 2019-12-21 09:35:58 -08:00
parent 9aebffa954
commit 01aea25d7e
4 changed files with 37 additions and 11 deletions

View file

@ -521,6 +521,16 @@ int COFF::CvGetTagStart(int tagIdx, bool ipi)
return mCvTagStartMap[tagIdx - mCvMinTag]; return mCvTagStartMap[tagIdx - mCvMinTag];
} }
int COFF::CvGetTagSize(int tagIdx, bool ipi)
{
if (tagIdx == 0)
return 0;
if (ipi)
return mCvIPITagStartMap[tagIdx - mCvMinTag + 1] - mCvIPITagStartMap[tagIdx - mCvMinTag];
else
return mCvTagStartMap[tagIdx - mCvMinTag + 1] - mCvTagStartMap[tagIdx - mCvMinTag];
}
uint8* COFF::CvGetTagData(int tagIdx, bool ipi, int* outDataSize) uint8* COFF::CvGetTagData(int tagIdx, bool ipi, int* outDataSize)
{ {
if (tagIdx == 0) if (tagIdx == 0)
@ -1538,6 +1548,14 @@ DbgType* COFF::CvParseType(int tagIdx, bool ipi)
} }
dbgType->mIsIncomplete = true; dbgType->mIsIncomplete = true;
if (classInfo.field != 0)
dbgType->mDefinedMembersSize = CvGetTagSize(classInfo.field, ipi);
// This helps differentiate '
// if (classInfo.field != 0)
// dbgType->mDefinedMembersCount++;
//CvParseMembers(dbgType, classInfo.field, sectionData); //CvParseMembers(dbgType, classInfo.field, sectionData);
} }
break; break;
@ -1791,6 +1809,9 @@ void COFF::ParseTypeData(CvStreamReader& reader, int dataOffset)
CvParseType(tagIdx); CvParseType(tagIdx);
} }
} }
if (isTagMapEmpty)
mCvTagStartMap.Add(offset);
} }
void COFF::ParseTypeData(int sectionNum, CvStreamReader& reader, int& sectionSize, int& dataOfs, int& hashStream, int& hashAdjOffset, int& hashAdjSize, int& minVal, int& maxVal) void COFF::ParseTypeData(int sectionNum, CvStreamReader& reader, int& sectionSize, int& dataOfs, int& hashStream, int& hashAdjOffset, int& hashAdjSize, int& minVal, int& maxVal)
@ -5058,7 +5079,7 @@ void COFF::CvParseIPI()
//mCvIPIData = sectionData; //mCvIPIData = sectionData;
int recordCount = mCvIPIMaxTag - mCvIPIMinTag; int recordCount = mCvIPIMaxTag - mCvIPIMinTag;
mCvIPITagStartMap.Resize(recordCount); mCvIPITagStartMap.Resize(recordCount + 1);
//uint8* data = sectionData + dataOffset; //uint8* data = sectionData + dataOffset;
int offset = dataOffset; int offset = dataOffset;
@ -5130,6 +5151,8 @@ void COFF::CvParseIPI()
mCvIPITagStartMap[idx] = offsetStart; mCvIPITagStartMap[idx] = offsetStart;
} }
mCvIPITagStartMap[recordCount] = offset;
} }
const char* COFF::CvParseSymbol(int offset, CvSymStreamType symStreamType, addr_target& outAddr) const char* COFF::CvParseSymbol(int offset, CvSymStreamType symStreamType, addr_target& outAddr)

View file

@ -358,6 +358,7 @@ public:
DbgType* CvGetType(int typeId); DbgType* CvGetType(int typeId);
DbgType* CvGetType(int typeId, CvCompileUnit* compileUnit); DbgType* CvGetType(int typeId, CvCompileUnit* compileUnit);
int CvGetTagStart(int tagIdx, bool ipi); int CvGetTagStart(int tagIdx, bool ipi);
int CvGetTagSize(int tagIdx, bool ipi);
uint8* CvGetTagData(int tagIdx, bool ipi, int* outDataSize = NULL); uint8* CvGetTagData(int tagIdx, bool ipi, int* outDataSize = NULL);
void CvParseArgList(DbgSubprogram* subprogram, int tagIdx, bool ipi); void CvParseArgList(DbgSubprogram* subprogram, int tagIdx, bool ipi);
DbgSubprogram* CvParseMethod(DbgType* parentType, const char* methodName, int tagIdx, bool ipi, DbgSubprogram* subprogram = NULL); DbgSubprogram* CvParseMethod(DbgType* parentType, const char* methodName, int tagIdx, bool ipi, DbgSubprogram* subprogram = NULL);

View file

@ -1453,7 +1453,8 @@ DbgType* DbgType::GetPrimaryType()
if (mPriority <= DbgTypePriority_Normal) if (mPriority <= DbgTypePriority_Normal)
{ {
if ((mCompileUnit != NULL) && if ((mCompileUnit != NULL) &&
((mCompileUnit->mLanguage == DbgLanguage_Beef) || (mTypeCode == DbgType_Namespace) || (mIsDeclaration))) ((mCompileUnit->mLanguage == DbgLanguage_Beef)|| (mLanguage == DbgLanguage_Beef) ||
(mTypeCode == DbgType_Namespace) || (mIsDeclaration)))
{ {
mPrimaryType = mCompileUnit->mDbgModule->GetPrimaryType(this); mPrimaryType = mCompileUnit->mDbgModule->GetPrimaryType(this);
mPrimaryType->PopulateType(); mPrimaryType->PopulateType();
@ -2761,7 +2762,7 @@ void DbgModule::MapTypes(int startingTypeIdx)
{ {
for (auto member : dbgType->mMemberList) for (auto member : dbgType->mMemberList)
if ((member->mIsStatic) && (member->mLocationData != NULL)) if ((member->mIsStatic) && (member->mLocationData != NULL))
dbgType->mDefinedMembersCount++; dbgType->mDefinedMembersSize++;
} }
if ((dbgType->mTypeName != NULL) && (strcmp(dbgType->mTypeName, "@") == 0)) if ((dbgType->mTypeName != NULL) && (strcmp(dbgType->mTypeName, "@") == 0))
@ -2855,11 +2856,12 @@ void DbgModule::MapTypes(int startingTypeIdx)
continue; continue;
} }
if (prevType->mDefinedMembersCount > 0) if (prevType->mDefinedMembersSize > 0)
{ {
if (dbgType->mDefinedMembersCount > 0) if (dbgType->mDefinedMembersSize > 0)
{ {
// We create an 'alternates' list for all types that define at least one static field // We create an 'alternates' list for all types that define at least one static field
if (prevType->mHasStaticMembers)
prevType->mAlternates.PushFront(dbgType, &mAlloc); prevType->mAlternates.PushFront(dbgType, &mAlloc);
} }
continue; continue;

View file

@ -564,7 +564,7 @@ public:
int mDeclFileIdx; int mDeclFileIdx;
int mDeclLine; int mDeclLine;
int mTypeIdx; int mTypeIdx;
uint16 mDefinedMembersCount; // For static members uint16 mDefinedMembersSize;
uint16 mMethodsWithParamsCount; uint16 mMethodsWithParamsCount;
bool mIsIncomplete; // Not fully loaded bool mIsIncomplete; // Not fully loaded
bool mIsPacked; bool mIsPacked;