2
0
Эх сурвалжийг харах

Fixed sTypes lookups with LLVM debug info

Brian Fiete 5 жил өмнө
parent
commit
dbbbed4528

+ 35 - 19
IDEHelper/DbgExprEvaluator.cpp

@@ -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();
 }
 

+ 2 - 0
IDEHelper/DbgModule.cpp

@@ -2196,6 +2196,8 @@ DbgModule::DbgModule(DebugTarget* debugTarget) : mDefaultCompileUnit(this)
 	mMayBeOld = false;	
 	mTimeStamp = 0;
 	mExpectedFileSize = 0;
+	mBfTypeType = NULL;
+	mBfTypesInfoAddr = 0;
 	
 	mImageBase = 0;
 	mPreferredImageBase = 0;

+ 5 - 2
IDEHelper/DbgModule.h

@@ -1141,7 +1141,7 @@ public:
 	bool mParsedSymbolData;
 	bool mParsedTypeData;
 	bool mPopulatedStaticVariables;	
-	bool mParsedFrameDescriptors;
+	bool mParsedFrameDescriptors;	
 
 	bool mMayBeOld; // If we had to load debug info from the SymCache or a SymServer then it may be old	
 	bool mDeleting;
@@ -1154,7 +1154,7 @@ public:
 	int mStartSubprogramIdx;
 	int mEndSubprogramIdx;
 	int mStartTypeIdx;
-	int mEndTypeIdx;
+	int mEndTypeIdx;	
 	uintptr mPreferredImageBase;
 	uintptr mImageBase;
 	uint32 mImageSize;	
@@ -1162,6 +1162,9 @@ public:
 	String mVersion;	
 	String* mFailMsgPtr;
 
+	DbgType* mBfTypeType;
+	intptr mBfTypesInfoAddr;
+
 	DbgModuleMemoryCache* mOrigImageData;
 	DbgCompileUnit* mMasterCompileUnit;	
 	StrHashMap<DbgVariable*> mGlobalVarMap; // Dedups entries into mMasterCompileUnit

+ 2 - 1
IDEHelper/WinDebugger.cpp

@@ -1234,7 +1234,8 @@ String WinDebugger::GetDbgAllocInfo()
 				auto type = exprEvaluator.GetBeefTypeById(typeId);
 				typeName.Clear();
 				exprEvaluator.BeefTypeToString(type, typeName);
-
+				if (typeName.IsEmpty())
+					typeName = StrFormat("Type #%d", typeId);
 				result += StrFormat("type\t%d\t%s\t%lld\t%lld\n", typeId, typeName.c_str(), typeData.mCount, typeData.mSize);
 			}
 		}