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

Debug expr fixes

This commit is contained in:
Brian Fiete 2019-12-24 10:32:20 -08:00
parent 69d16f87f6
commit 4087bf8e2a
4 changed files with 27 additions and 6 deletions

View file

@ -850,7 +850,7 @@ void COFF::CvParseMembers(DbgType* parentType, int tagIdx, bool ipi)
// if (!parentType->mBaseTypes.IsEmpty()) // if (!parentType->mBaseTypes.IsEmpty())
// parentType->mTypeParam = baseTypeEntry->mBaseType; // parentType->mTypeParam = baseTypeEntry->mBaseType;
// } // }
parentType->mBaseTypes.PushBack(baseTypeEntry); parentType->mBaseTypes.PushBack(baseTypeEntry);
parentType->mAlign = std::max(parentType->mAlign, baseTypeEntry->mBaseType->GetAlign()); parentType->mAlign = std::max(parentType->mAlign, baseTypeEntry->mBaseType->GetAlign());
@ -1529,7 +1529,7 @@ DbgType* COFF::CvParseType(int tagIdx, bool ipi)
baseType = CvGetType(classInfo.derived); baseType = CvGetType(classInfo.derived);
BP_ALLOC_T(DbgBaseTypeEntry); BP_ALLOC_T(DbgBaseTypeEntry);
DbgBaseTypeEntry* baseTypeEntry = mAlloc.Alloc<DbgBaseTypeEntry>(); DbgBaseTypeEntry* baseTypeEntry = mAlloc.Alloc<DbgBaseTypeEntry>();
baseTypeEntry->mBaseType = baseType; baseTypeEntry->mBaseType = baseType;
dbgType->mBaseTypes.PushBack(baseTypeEntry); dbgType->mBaseTypes.PushBack(baseTypeEntry);
} }

View file

@ -4705,6 +4705,13 @@ void DbgExprEvaluator::Visit(BfIndexerExpression* indexerExpr)
} }
} }
if ((collection.mType->IsBfObjectPtr()) || (collection.mType->IsStruct()))
{
// This should have been handled by some other cases
mResult = DbgTypedValue();
Fail(StrFormat("Unable to index type '%s'", TypeToString(collection.mType).c_str()), indexerExpr->mOpenBracket);
}
auto memberType = collection.mType->mTypeParam; auto memberType = collection.mType->mTypeParam;
auto result = ReadTypedValue(memberType, target + indexArgument.GetInt64() * memberType->GetStride(), DbgAddrType_Target); auto result = ReadTypedValue(memberType, target + indexArgument.GetInt64() * memberType->GetStride(), DbgAddrType_Target);
if (mResult.mIsReadOnly) if (mResult.mIsReadOnly)

View file

@ -1057,10 +1057,23 @@ bool DbgType::IsValueType()
bool DbgType::IsTypedPrimitive() bool DbgType::IsTypedPrimitive()
{ {
PopulateType();
if (mTypeCode != DbgType_Struct) if (mTypeCode != DbgType_Struct)
return false; return false;
return mTypeParam != NULL; if (mTypeParam != NULL)
return true;
auto baseType = GetBaseType();
if (baseType == NULL)
return false;
if (!baseType->IsTypedPrimitive())
return false;
mTypeParam = baseType->mTypeParam;
return true;
} }
bool DbgType::IsBoolean() bool DbgType::IsBoolean()
@ -2140,9 +2153,9 @@ DbgModule::DbgModule(DebugTarget* debugTarget) : mDefaultCompileUnit(this)
CREATE_PRIMITIVE(DbgType_RawText, "@RawText", "@RawText", "@RawText", bool); CREATE_PRIMITIVE(DbgType_RawText, "@RawText", "@RawText", "@RawText", bool);
CREATE_PRIMITIVE(DbgType_RegGroup, "@RegGroup", "@RegGroup", "@RegGroup", void*); CREATE_PRIMITIVE(DbgType_RegGroup, "@RegGroup", "@RegGroup", "@RegGroup", void*);
CREATE_PRIMITIVE_C(DbgType_i8, "int16_t", int16_t); CREATE_PRIMITIVE_C(DbgType_i16, "int16_t", int16_t);
CREATE_PRIMITIVE_C(DbgType_i8, "int32_t", int32_t); CREATE_PRIMITIVE_C(DbgType_i32, "int32_t", int32_t);
CREATE_PRIMITIVE_C(DbgType_i64, "__int64", int64); CREATE_PRIMITIVE_C(DbgType_i64, "__int64", int64);
CREATE_PRIMITIVE_C(DbgType_u64, "unsigned __int64", uint64); CREATE_PRIMITIVE_C(DbgType_u64, "unsigned __int64", uint64);

View file

@ -28,6 +28,7 @@ COptimizationLevel = "O2"
ConfigSelections = {TestsB = {Config = "Test"}} ConfigSelections = {TestsB = {Config = "Test"}}
[Configs.Test.Win32] [Configs.Test.Win32]
IntermediateType = "ObjectAndIRCode"
ConfigSelections = {TestsB = {Config = "Test"}} ConfigSelections = {TestsB = {Config = "Test"}}
[Configs.TestFail.Win64] [Configs.TestFail.Win64]