From 391227ea7b7ef6ea0305733b0871b62f1a46678f Mon Sep 17 00:00:00 2001 From: Jake Turner Date: Wed, 23 Sep 2026 12:53:06 +0100 Subject: [PATCH] Add DXIL bitstream parsing support for LEXICAL_BLOCK_FILE --- renderdoc/driver/shaders/dxil/dxil_bytecode.h | 1 + .../driver/shaders/dxil/dxil_debuginfo.cpp | 23 +++++++++++++++++++ .../driver/shaders/dxil/dxil_debuginfo.h | 15 ++++++++++++ 3 files changed, 39 insertions(+) diff --git a/renderdoc/driver/shaders/dxil/dxil_bytecode.h b/renderdoc/driver/shaders/dxil/dxil_bytecode.h index 68007bf13..61a66c02e 100644 --- a/renderdoc/driver/shaders/dxil/dxil_bytecode.h +++ b/renderdoc/driver/shaders/dxil/dxil_bytecode.h @@ -1236,6 +1236,7 @@ struct DIBase LocalVariable, Expression, LexicalBlock, + LexicalBlockFile, Subrange, Namespace, ImportedEntity, diff --git a/renderdoc/driver/shaders/dxil/dxil_debuginfo.cpp b/renderdoc/driver/shaders/dxil/dxil_debuginfo.cpp index 211f2f724..0cc7f046b 100644 --- a/renderdoc/driver/shaders/dxil/dxil_debuginfo.cpp +++ b/renderdoc/driver/shaders/dxil/dxil_debuginfo.cpp @@ -274,6 +274,15 @@ bool Program::ParseDebugMetaRecord(MetadataList &metadata, const LLVMBC::BlockOr meta.dwarf = expr; } + else if(id == LLVMBC::MetaDataRecord::LEXICAL_BLOCK_FILE) + { + meta.isDistinct = (metaRecord.ops[0] & 0x1); + + meta.dwarf = new DILexicalBlockFile(metadata.getOrNULL(metaRecord.ops[1]), + metadata.getOrNULL(metaRecord.ops[2]), metaRecord.ops[3]); + + meta.children = {metadata.getOrNULL(metaRecord.ops[1]), metadata.getOrNULL(metaRecord.ops[2])}; + } else { return false; @@ -732,6 +741,20 @@ rdcstr DILexicalBlock::toString(bool dxcStyleFormatting) const return ret; } +rdcstr DILexicalBlockFile::toString(bool dxcStyleFormatting) const +{ + rdcstr ret = "!DILexicalBlockFile("; + if(scope) + ret += StringFormat::Fmt("scope: %s", scope->refString(dxcStyleFormatting).c_str()); + else + ret += "scope: null"; + if(file) + ret += StringFormat::Fmt(", file: %s", file->refString(dxcStyleFormatting).c_str()); + ret += StringFormat::Fmt(", discriminator: %llu", discriminator); + ret += ")"; + return ret; +} + rdcstr DISubrange::toString(bool dxcStyleFormatting) const { rdcstr ret = "!DISubrange("; diff --git a/renderdoc/driver/shaders/dxil/dxil_debuginfo.h b/renderdoc/driver/shaders/dxil/dxil_debuginfo.h index 3c75e63bd..64ba10d05 100644 --- a/renderdoc/driver/shaders/dxil/dxil_debuginfo.h +++ b/renderdoc/driver/shaders/dxil/dxil_debuginfo.h @@ -710,6 +710,21 @@ struct DILexicalBlock : public DIBase virtual rdcstr toString(bool dxcStyleFormatting) const; }; +struct DILexicalBlockFile : public DIBase +{ + static const DIBase::Type DIType = DIBase::LexicalBlockFile; + DILexicalBlockFile(const Metadata *scope, const Metadata *file, uint64_t discriminator) + : DIBase(DIType), scope(scope), file(file), discriminator(discriminator) + { + } + + const Metadata *scope; + const Metadata *file; + uint64_t discriminator; + + virtual rdcstr toString(bool dxcStyleFormatting) const; +}; + struct DISubrange : public DIBase { static const DIBase::Type DIType = DIBase::Subrange;