diff --git a/IDEHelper/COFF.cpp b/IDEHelper/COFF.cpp index 74850370..c7a3df49 100644 --- a/IDEHelper/COFF.cpp +++ b/IDEHelper/COFF.cpp @@ -518,7 +518,17 @@ int COFF::CvGetTagStart(int tagIdx, bool ipi) if (ipi) return mCvIPITagStartMap[tagIdx - mCvMinTag]; else - 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) @@ -1402,7 +1412,7 @@ DbgType* COFF::CvParseType(int tagIdx, bool ipi) dbgType->mIsDeclaration = true; dbgType->mSize = dbgType->mTypeParam->mSize; - dbgType->mAlign = dbgType->mTypeParam->mAlign; + dbgType->mAlign = dbgType->mTypeParam->mAlign; /*if (dbgType->mTypeParam->GetByteCount() == 0) { @@ -1538,6 +1548,14 @@ DbgType* COFF::CvParseType(int tagIdx, bool ipi) } 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); } break; @@ -1791,6 +1809,9 @@ void COFF::ParseTypeData(CvStreamReader& reader, int dataOffset) 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) @@ -5058,7 +5079,7 @@ void COFF::CvParseIPI() //mCvIPIData = sectionData; int recordCount = mCvIPIMaxTag - mCvIPIMinTag; - mCvIPITagStartMap.Resize(recordCount); + mCvIPITagStartMap.Resize(recordCount + 1); //uint8* data = sectionData + dataOffset; int offset = dataOffset; @@ -5130,6 +5151,8 @@ void COFF::CvParseIPI() mCvIPITagStartMap[idx] = offsetStart; } + + mCvIPITagStartMap[recordCount] = offset; } const char* COFF::CvParseSymbol(int offset, CvSymStreamType symStreamType, addr_target& outAddr) diff --git a/IDEHelper/COFF.h b/IDEHelper/COFF.h index 15921a23..0625ccf8 100644 --- a/IDEHelper/COFF.h +++ b/IDEHelper/COFF.h @@ -358,6 +358,7 @@ public: DbgType* CvGetType(int typeId); DbgType* CvGetType(int typeId, CvCompileUnit* compileUnit); int CvGetTagStart(int tagIdx, bool ipi); + int CvGetTagSize(int tagIdx, bool ipi); uint8* CvGetTagData(int tagIdx, bool ipi, int* outDataSize = NULL); void CvParseArgList(DbgSubprogram* subprogram, int tagIdx, bool ipi); DbgSubprogram* CvParseMethod(DbgType* parentType, const char* methodName, int tagIdx, bool ipi, DbgSubprogram* subprogram = NULL); diff --git a/IDEHelper/DbgModule.cpp b/IDEHelper/DbgModule.cpp index e4a4e3a2..9ec1cfd3 100644 --- a/IDEHelper/DbgModule.cpp +++ b/IDEHelper/DbgModule.cpp @@ -1186,7 +1186,7 @@ DbgExtType DbgType::CalcExtType() } DbgLanguage DbgType::GetLanguage() -{ +{ return mLanguage; } @@ -1451,9 +1451,10 @@ DbgType* DbgType::GetPrimaryType() mPrimaryType = this; if (mPriority <= DbgTypePriority_Normal) - { + { 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->PopulateType(); @@ -2761,7 +2762,7 @@ void DbgModule::MapTypes(int startingTypeIdx) { for (auto member : dbgType->mMemberList) if ((member->mIsStatic) && (member->mLocationData != NULL)) - dbgType->mDefinedMembersCount++; + dbgType->mDefinedMembersSize++; } if ((dbgType->mTypeName != NULL) && (strcmp(dbgType->mTypeName, "@") == 0)) @@ -2855,12 +2856,13 @@ void DbgModule::MapTypes(int startingTypeIdx) 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 - prevType->mAlternates.PushFront(dbgType, &mAlloc); + if (prevType->mHasStaticMembers) + prevType->mAlternates.PushFront(dbgType, &mAlloc); } continue; } diff --git a/IDEHelper/DbgModule.h b/IDEHelper/DbgModule.h index ce403997..80ce47f2 100644 --- a/IDEHelper/DbgModule.h +++ b/IDEHelper/DbgModule.h @@ -564,7 +564,7 @@ public: int mDeclFileIdx; int mDeclLine; int mTypeIdx; - uint16 mDefinedMembersCount; // For static members + uint16 mDefinedMembersSize; uint16 mMethodsWithParamsCount; bool mIsIncomplete; // Not fully loaded bool mIsPacked;