From 591e02b565cc6decb13098a61ba79b8f25f16c4a Mon Sep 17 00:00:00 2001 From: baldurk Date: Tue, 9 Jun 2020 12:24:46 +0100 Subject: [PATCH] Handled attached metadata --- .../driver/shaders/dxil/dxil_bytecode.cpp | 36 +++++++++++++++++ renderdoc/driver/shaders/dxil/dxil_bytecode.h | 5 +++ .../driver/shaders/dxil/dxil_disassemble.cpp | 39 ++++++++++++++++--- 3 files changed, 74 insertions(+), 6 deletions(-) diff --git a/renderdoc/driver/shaders/dxil/dxil_bytecode.cpp b/renderdoc/driver/shaders/dxil/dxil_bytecode.cpp index 0b43aef24..d78c3870e 100644 --- a/renderdoc/driver/shaders/dxil/dxil_bytecode.cpp +++ b/renderdoc/driver/shaders/dxil/dxil_bytecode.cpp @@ -943,6 +943,10 @@ Program::Program(const byte *bytes, size_t length) functionDecls.erase(0); auto getValue = [this, &f](uint64_t v) { return GetFunctionValue(f, v); }; + auto getMeta = [this, &f](uint64_t v) { + size_t idx = (size_t)v; + return idx - 1 < m_Metadata.size() ? &m_Metadata[idx] : &f.metadata[idx]; + }; auto getMetaOrNull = [this, &f](uint64_t v) { size_t idx = (size_t)v; return idx == 0 ? NULL : (idx - 1 < m_Metadata.size() ? &m_Metadata[idx - 1] @@ -1096,6 +1100,38 @@ Program::Program(const byte *bytes, size_t length) } } } + else if(IS_KNOWN(funcChild.id, KnownBlocks::METADATA_ATTACHMENT)) + { + for(const LLVMBC::BlockOrRecord &meta : funcChild.children) + { + if(meta.IsBlock()) + { + RDCERR("Unexpected subblock in METADATA_ATTACHMENT"); + continue; + } + + if(!IS_KNOWN(meta.id, MetaDataRecord::ATTACHMENT)) + { + RDCERR("Unexpected record %u in METADATA_ATTACHMENT", meta.id); + continue; + } + + size_t idx = 0; + + rdcarray> attach; + + if(meta.ops.size() % 2 != 0) + idx++; + + for(; idx < meta.ops.size(); idx += 2) + attach.push_back(make_rdcpair(meta.ops[idx], getMeta(meta.ops[idx + 1]))); + + if(meta.ops.size() % 2 == 0) + f.attachedMeta.swap(attach); + else + f.instructions[meta.ops[0]].attachedMeta.swap(attach); + } + } else { RDCERR("Unexpected subblock %u in FUNCTION_BLOCK", funcChild.id); diff --git a/renderdoc/driver/shaders/dxil/dxil_bytecode.h b/renderdoc/driver/shaders/dxil/dxil_bytecode.h index 4f1d290f2..2e89eaad4 100644 --- a/renderdoc/driver/shaders/dxil/dxil_bytecode.h +++ b/renderdoc/driver/shaders/dxil/dxil_bytecode.h @@ -286,6 +286,8 @@ enum class MathFlags : uint32_t BITMASK_OPERATORS(MathFlags); +typedef rdcarray> AttachedMetadata; + struct Instruction { enum @@ -336,6 +338,7 @@ struct Instruction uint32_t debugLoc = ~0U; const Type *type = NULL; rdcarray args; + AttachedMetadata attachedMeta; // function calls const Attributes *paramAttrs = NULL; @@ -360,6 +363,8 @@ struct Function rdcarray blocks; rdcarray values; rdcarray metadata; + + AttachedMetadata attachedMeta; }; class Program diff --git a/renderdoc/driver/shaders/dxil/dxil_disassemble.cpp b/renderdoc/driver/shaders/dxil/dxil_disassemble.cpp index 84145fd96..8de15e9bf 100644 --- a/renderdoc/driver/shaders/dxil/dxil_disassemble.cpp +++ b/renderdoc/driver/shaders/dxil/dxil_disassemble.cpp @@ -593,6 +593,21 @@ void Program::MakeDisassemblyString() DebugLocation &debugLoc = m_DebugLocations[inst.debugLoc]; m_Disassembly += StringFormat::Fmt(", !dbg !%u", GetOrAssignMetaID(debugLoc)); + } + + if(!inst.attachedMeta.empty()) + { + for(size_t m = 0; m < inst.attachedMeta.size(); m++) + { + m_Disassembly += + StringFormat::Fmt(", !%s !%u", m_Kinds[inst.attachedMeta[m].first].c_str(), + GetOrAssignMetaID(inst.attachedMeta[m].second)); + } + } + + if(inst.debugLoc != ~0U) + { + DebugLocation &debugLoc = m_DebugLocations[inst.debugLoc]; if(!debugCall && debugLoc.line > 0) { @@ -602,14 +617,26 @@ void Program::MakeDisassemblyString() if(debugCall) { - if(inst.funcCall->name == "llvm.dbg.value" || inst.funcCall->name == "llvm.dbg.declare") + size_t varIdx = 0, exprIdx = 0; + if(inst.funcCall->name == "llvm.dbg.value") { - RDCASSERT(inst.args[2].type == SymbolType::Metadata); - RDCASSERT(inst.args[3].type == SymbolType::Metadata); + varIdx = 2; + exprIdx = 3; + } + else if(inst.funcCall->name == "llvm.dbg.declare") + { + varIdx = 1; + exprIdx = 2; + } + + if(varIdx > 0) + { + RDCASSERT(inst.args[varIdx].type == SymbolType::Metadata); + RDCASSERT(inst.args[exprIdx].type == SymbolType::Metadata); m_Disassembly += StringFormat::Fmt( - " ; var:%s ", - escapeString(GetDebugVarName(GetFunctionMetadata(func, inst.args[2].idx)->dwarf))); - m_Disassembly += GetFunctionMetadata(func, inst.args[3].idx)->valString(); + " ; var:%s ", escapeString(GetDebugVarName( + GetFunctionMetadata(func, inst.args[varIdx].idx)->dwarf))); + m_Disassembly += GetFunctionMetadata(func, inst.args[exprIdx].idx)->valString(); } }