DXIL Debug data handling for inherited struct/class

This commit is contained in:
Jake Turner
2025-07-21 17:47:36 +01:00
parent 4ac2861e2b
commit d3a140d484
2 changed files with 53 additions and 25 deletions
+52 -25
View File
@@ -7451,6 +7451,57 @@ ScopedDebugData *Debugger::AddScopedDebugData(const DXIL::Metadata *scopeMD)
return scope;
}
void Debugger::AddStructMembers(const DXIL::DICompositeType *structTypeData, TypeData &structType)
{
if(structTypeData->type != DXIL::DIBase::Type::CompositeType)
{
RDCERR("Invalid dwarf struct type %s", ToStr(structTypeData->type).c_str());
return;
}
if(structTypeData->tag != DXIL::DW_TAG_structure_type &&
structTypeData->tag != DXIL::DW_TAG_class_type)
{
RDCERR("Invalid composite tag %s", ToStr(structTypeData->tag).c_str());
return;
}
const Metadata *elementsMD = structTypeData->elements;
size_t countMembers = elementsMD->children.size();
for(size_t i = 0; i < countMembers; ++i)
{
const Metadata *memberMD = elementsMD->children[i];
const DXIL::DIBase *memberBase = memberMD->dwarf;
// Ignore member functions
if(memberBase->type == DXIL::DIBase::Subprogram)
continue;
RDCASSERTEQUAL(memberBase->type, DXIL::DIBase::DerivedType);
// Ignore anything that isn't DIBase::DerivedType
if(memberBase->type != DXIL::DIBase::DerivedType)
continue;
const DXIL::DIDerivedType *member = memberBase->As<DIDerivedType>();
if(member->tag == DXIL::DW_TAG_inheritance)
{
const Metadata *parentMD = member->base;
const DXIL::DIBase *parentBase = parentMD->dwarf;
RDCASSERTEQUAL(parentBase->type, DXIL::DIBase::Type::CompositeType);
const DICompositeType *parentType = parentBase->As<DICompositeType>();
AddStructMembers(parentType, structType);
continue;
}
// Ignore any member tag that isn't DXIL::DW_TAG_member
if(member->tag != DXIL::DW_TAG_member)
continue;
AddDebugType(member->base);
RDCASSERT(member->name);
rdcstr memberName = member->name ? *member->name : "NULL";
structType.structMembers.push_back({memberName, member->base});
uint32_t offset = (uint32_t)member->offsetInBits / 8;
structType.memberOffsets.push_back(offset);
}
}
const TypeData &Debugger::AddDebugType(const DXIL::Metadata *typeMD)
{
{
@@ -7643,31 +7694,7 @@ const TypeData &Debugger::AddDebugType(const DXIL::Metadata *typeMD)
RDCASSERT(!isVector && !isMatrix, isVector, isMatrix, typeData.name);
typeData.type = VarType::Struct;
const Metadata *elementsMD = compositeType->elements;
size_t countMembers = elementsMD->children.size();
for(size_t i = 0; i < countMembers; ++i)
{
const Metadata *memberMD = elementsMD->children[i];
const DXIL::DIBase *memberBase = memberMD->dwarf;
// Ignore member functions
if(memberBase->type == DXIL::DIBase::Subprogram)
continue;
RDCASSERTEQUAL(memberBase->type, DXIL::DIBase::DerivedType);
// Ignore anything that isn't DIBase::DerivedType
if(memberBase->type != DXIL::DIBase::DerivedType)
continue;
const DXIL::DIDerivedType *member = memberBase->As<DIDerivedType>();
// Ignore any member tag that isn't DXIL::DW_TAG_member
if(member->tag != DXIL::DW_TAG_member)
continue;
AddDebugType(member->base);
RDCASSERT(member->name);
rdcstr memberName = member->name ? *member->name : "NULL";
typeData.structMembers.push_back({memberName, member->base});
uint32_t offset = (uint32_t)member->offsetInBits / 8;
typeData.memberOffsets.push_back(offset);
}
AddStructMembers(compositeType, typeData);
}
break;
}
@@ -612,6 +612,7 @@ private:
ScopedDebugData *AddScopedDebugData(const DXIL::Metadata *scopeMD);
ScopedDebugData *FindScopedDebugData(const DXIL::Metadata *md) const;
const TypeData &AddDebugType(const DXIL::Metadata *typeMD);
void AddStructMembers(const DXIL::DICompositeType *structTypeData, TypeData &structType);
void AddLocalVariable(const DXIL::SourceMappingInfo &srcMapping, uint32_t instructionIndex);
void ParseDebugData();