diff --git a/IDEHelper/COFF.cpp b/IDEHelper/COFF.cpp index c7a3df49..b9b29892 100644 --- a/IDEHelper/COFF.cpp +++ b/IDEHelper/COFF.cpp @@ -1462,11 +1462,7 @@ DbgType* COFF::CvParseType(int tagIdx, bool ipi) int dataSize = (int)CvParseConstant(data); const char* name = _ParseString(); - - if (strstr(name, "Derived") != NULL) - { - NOP; - } + // if ((strstr(name, "`") != NULL) || (strstr(name, "::__l") != NULL)) // { @@ -1474,11 +1470,23 @@ DbgType* COFF::CvParseType(int tagIdx, bool ipi) // } // Remove "enum " from type names + + bool isPartialDef = false; + for (int i = 0; true; i++) { char c = name[i]; if (c == 0) + { + if ((i >= 4) && (strcmp(&name[i - 5], "$part") == 0)) + { + if (!strMadeCopy) + name = DbgDupString(name, "CvParseType.LF_CLASS"); + ((char*)name)[i - 5] = '\0'; + isPartialDef = true; + } break; + } if ((c == ' ') && (i >= 5)) { if ((name[i - 4] == 'e') && @@ -1503,6 +1511,8 @@ DbgType* COFF::CvParseType(int tagIdx, bool ipi) dbgType = CvCreateType(); dbgType->mCompileUnit = mMasterCompileUnit; dbgType->mIsDeclaration = classInfo.property.fwdref; + if (isPartialDef) + dbgType->mIsDeclaration = true; dbgType->mName = name; dbgType->mTypeName = name; //SplitName(dbgType->mName, dbgType->mTypeName, dbgType->mTemplateParams); @@ -1511,6 +1521,8 @@ DbgType* COFF::CvParseType(int tagIdx, bool ipi) else dbgType->mTypeCode = DbgType_Struct; + + DbgType* baseType = NULL; if (classInfo.derived != 0) { @@ -1549,13 +1561,9 @@ 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++; - +// if (classInfo.field != 0) +// dbgType->mDefinedMembersSize = CvGetTagSize(classInfo.field, ipi); + //CvParseMembers(dbgType, classInfo.field, sectionData); } break; diff --git a/IDEHelper/Compiler/BfIRBuilder.cpp b/IDEHelper/Compiler/BfIRBuilder.cpp index 633669da..b6ee184b 100644 --- a/IDEHelper/Compiler/BfIRBuilder.cpp +++ b/IDEHelper/Compiler/BfIRBuilder.cpp @@ -1889,8 +1889,16 @@ void BfIRBuilder::CreateTypeDeclaration(BfType* type, bool forceDbgDefine) bool wantsDIForwardDecl = (type->GetModule() != mModule) && (!type->IsFunction()); // Forward declarations of valuetypes don't work in LLVM backend for Win32..... //TODO: Why was this commented out? - if ((!mIsBeefBackend) && (type->IsValueType())) - wantsDIForwardDecl = false; + + bool wantsDIPartialDef = false; + if (wantsDIForwardDecl) + { + if ((!mIsBeefBackend) && (type->IsValueType())) + { + wantsDIPartialDef = true; + wantsDIForwardDecl = false; + } + } if (mModule->mExtensionCount != 0) wantsDIForwardDecl = true; if (forceDbgDefine) @@ -2171,7 +2179,10 @@ void BfIRBuilder::CreateTypeDeclaration(BfType* type, bool forceDbgDefine) } } else - { + { + if (wantsDIPartialDef) + typeName += "$part"; + // Will fill in later (during definition phase) int flags = 0; diForwardDecl = DbgCreateReplaceableCompositeType(llvm::dwarf::DW_TAG_structure_type, diff --git a/IDEHelper/DbgModule.cpp b/IDEHelper/DbgModule.cpp index f073aff5..1cb94890 100644 --- a/IDEHelper/DbgModule.cpp +++ b/IDEHelper/DbgModule.cpp @@ -2856,22 +2856,22 @@ void DbgModule::MapTypes(int startingTypeIdx) continue; } -// if (prevType->mDefinedMembersSize > 0) -// { -// if (dbgType->mDefinedMembersSize > 0) -// { -// // We create an 'alternates' list for all types that define at least one static field -// if (prevType->mHasStaticMembers) -// prevType->mAlternates.PushFront(dbgType, &mAlloc); -// } -// continue; -// } - - if (prevType->mDefinedMembersSize > dbgType->mDefinedMembersSize) + if (prevType->mDefinedMembersSize > 0) { + if (dbgType->mDefinedMembersSize > 0) + { + // We create an 'alternates' list for all types that define at least one static field + if (prevType->mHasStaticMembers) + prevType->mAlternates.PushFront(dbgType, &mAlloc); + } continue; } +// if (prevType->mDefinedMembersSize > dbgType->mDefinedMembersSize) +// { +// continue; +// } + if (prevType->mMethodsWithParamsCount > dbgType->mMethodsWithParamsCount) { // This handles a special case where methods without line data like .HasFlags doesn't show containing