From 144e8057c1391a787fa08eef9e8a41b40925e7cb Mon Sep 17 00:00:00 2001 From: baldurk Date: Mon, 1 Jun 2020 14:43:32 +0100 Subject: [PATCH] Improve LLVM record dumping a bit --- .../driver/shaders/dxil/dxil_bytecode.cpp | 26 +++++++++++++++---- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/renderdoc/driver/shaders/dxil/dxil_bytecode.cpp b/renderdoc/driver/shaders/dxil/dxil_bytecode.cpp index 8851e8ce2..1007106d4 100644 --- a/renderdoc/driver/shaders/dxil/dxil_bytecode.cpp +++ b/renderdoc/driver/shaders/dxil/dxil_bytecode.cpp @@ -225,7 +225,6 @@ enum class TypeRecord : uint32_t STRUCT_NAME = 19, STRUCT_NAMED = 20, FUNCTION = 21, - TOKEN = 22, }; static rdcstr getName(uint32_t parentBlock, const LLVMBC::BlockOrRecord &block) @@ -439,7 +438,6 @@ static rdcstr getName(uint32_t parentBlock, const LLVMBC::BlockOrRecord &block) STRINGISE_RECORD(STRUCT_NAME); STRINGISE_RECORD(STRUCT_NAMED); STRINGISE_RECORD(FUNCTION); - STRINGISE_RECORD(TOKEN); default: break; } break; @@ -498,11 +496,14 @@ static rdcstr escapeString(rdcstr str) return str; } -static void dumpRecord(uint32_t parentBlock, const LLVMBC::BlockOrRecord &record, int indent) +static void dumpRecord(size_t idx, uint32_t parentBlock, const LLVMBC::BlockOrRecord &record, + int indent) { rdcstr line; line.fill(indent, ' '); + line += StringFormat::Fmt("[%u] = ", idx); + line += "<" + getName(parentBlock, record); if(KnownBlocks(parentBlock) == KnownBlocks::METADATA_BLOCK && @@ -514,6 +515,19 @@ static void dumpRecord(uint32_t parentBlock, const LLVMBC::BlockOrRecord &record } else { + bool allASCII = true; + for(size_t i = 0; i < record.ops.size(); i++) + { + if(record.ops[i] < 0x20 || record.ops[i] > 0x7f) + { + allASCII = false; + break; + } + } + + if(allASCII && record.ops.size() > 3) + line += " record string = '" + escapeString(record.getString()) + "'"; + for(size_t i = 0; i < record.ops.size(); i++) line += StringFormat::Fmt(" op%u=%llu", (uint32_t)i, record.ops[i]); } @@ -541,12 +555,14 @@ static void dumpBlock(const LLVMBC::BlockOrRecord &block, int indent) line += StringFormat::Fmt("<%s NumWords=%u>", getName(0, block).c_str(), block.blockDwordLength); RDCLOG("%s", line.c_str()); - for(const LLVMBC::BlockOrRecord &child : block.children) + for(size_t i = 0; i < block.children.size(); i++) { + const LLVMBC::BlockOrRecord &child = block.children[i]; + if(child.IsBlock()) dumpBlock(child, indent + 2); else - dumpRecord(block.id, child, indent + 2); + dumpRecord(i, block.id, child, indent + 2); } line.fill(indent, ' ');