Handle forward referenced function members in debuginfo types

This commit is contained in:
baldurk
2025-04-24 16:12:15 +01:00
parent e0b0b24efd
commit 5b5bec6334
3 changed files with 51 additions and 20 deletions
@@ -238,14 +238,14 @@ struct OpExtInstHelper
rdcarray<uint32_t> params;
template <typename T>
T arg(uint32_t idx)
T arg(uint32_t idx) const
{
return T(params[idx]);
}
};
template <>
inline Id OpExtInstHelper::arg<Id>(uint32_t idx)
inline Id OpExtInstHelper::arg<Id>(uint32_t idx) const
{
return Id::fromWord(params[idx]);
}
@@ -434,6 +434,8 @@ private:
virtual void PostParse();
virtual void RegisterOp(Iter it);
void SetDebugTypeMember(const OpShaderDbg &member, TypeData &resultType, size_t memberIndex);
template <typename ShaderVarType, bool allocate>
uint32_t WalkVariable(const Decorations &curDecorations, const DataType &type,
uint64_t offsetOrLocation, ShaderVarType &var, const rdcstr &accessSuffix,
@@ -512,6 +514,8 @@ private:
{
bool valid = false;
rdcarray<std::function<void()>> deferredMembers;
SparseIdMap<TypeData> types;
SparseIdMap<ScopeData> scopes;
SparseIdMap<InlineData> inlined;
@@ -3762,6 +3762,10 @@ void Debugger::PostParse()
{
Processor::PostParse();
for(std::function<void()> &f : m_DebugInfo.deferredMembers)
f();
m_DebugInfo.deferredMembers.clear();
// declare pointerTypes for all declared physical pointer types. This will match the reflection
for(auto it = dataTypes.begin(); it != dataTypes.end(); ++it)
{
@@ -3814,6 +3818,31 @@ void Debugger::PostParse()
memberNames.clear();
}
void Debugger::SetDebugTypeMember(const OpShaderDbg &member, TypeData &resultType, size_t memberIndex)
{
rdcstr memberName;
Id memberType;
uint32_t memberOffset = 0;
switch(member.inst)
{
case ShaderDbg::TypeMember:
memberName = strings[member.arg<Id>(0)];
memberType = member.arg<Id>(1);
memberOffset = EvaluateConstant(member.arg<Id>(5), {}).value.u32v[0];
break;
case ShaderDbg::Function:
memberName = strings[member.arg<Id>(0)];
memberType = member.arg<Id>(1);
break;
case ShaderDbg::TypeInheritance: memberName = "Inheritence"; break;
default: RDCERR("Unhandled DebugTypeComposite entry %u", member.inst);
}
resultType.structMembers[memberIndex] = {memberName, memberType};
resultType.memberOffsets[memberIndex] = memberOffset;
}
void Debugger::RegisterOp(Iter it)
{
Processor::RegisterOp(it);
@@ -4010,30 +4039,28 @@ void Debugger::RegisterOp(Iter it)
// ignore arg 7 size
// ignore arg 8 flags
TypeData &resultType = m_DebugInfo.types[dbg.result];
for(uint32_t i = 9; i < dbg.params.size(); i++)
{
OpShaderDbg member(GetID(dbg.arg<Id>(i)));
resultType.structMembers.push_back({});
resultType.memberOffsets.push_back(0);
size_t memberIndex = resultType.structMembers.size() - 1;
rdcstr memberName;
Id memberType;
uint32_t memberOffset = 0;
switch(member.inst)
Id memberId = dbg.arg<Id>(i);
ConstIter memberIt = GetID(memberId);
if(!memberIt)
{
case ShaderDbg::TypeMember:
memberName = strings[member.arg<Id>(0)];
memberType = member.arg<Id>(1);
memberOffset = EvaluateConstant(member.arg<Id>(5), {}).value.u32v[0];
break;
case ShaderDbg::TypeFunction:
memberName = strings[member.arg<Id>(0)];
memberType = member.arg<Id>(1);
break;
case ShaderDbg::TypeInheritance: memberName = "Inheritence"; break;
default: RDCERR("Unhandled DebugTypeComposite entry %u", member.inst);
m_DebugInfo.deferredMembers.push_back(
[this, resultId = dbg.result, memberIndex, memberId]() {
SetDebugTypeMember(OpShaderDbg(GetID(memberId)), m_DebugInfo.types[resultId],
memberIndex);
});
continue;
}
m_DebugInfo.types[dbg.result].structMembers.push_back({memberName, memberType});
m_DebugInfo.types[dbg.result].memberOffsets.push_back(memberOffset);
SetDebugTypeMember(OpShaderDbg(memberIt), resultType, memberIndex);
}
name = tagString[tag % 3] + name;