diff --git a/renderdoc/driver/shaders/dxil/dxil_bytecode.cpp b/renderdoc/driver/shaders/dxil/dxil_bytecode.cpp index 71fba4ed8..319e10e9d 100644 --- a/renderdoc/driver/shaders/dxil/dxil_bytecode.cpp +++ b/renderdoc/driver/shaders/dxil/dxil_bytecode.cpp @@ -229,311 +229,6 @@ enum class TypeRecord : uint32_t #define IS_KNOWN(val, KnownID) (decltype(KnownID)(val) == KnownID) -static rdcstr getName(uint32_t parentBlock, const LLVMBC::BlockOrRecord &block) -{ - const char *name = NULL; - - if(block.IsBlock()) - { - // GetBlockName in BitcodeAnalyzer.cpp - switch(KnownBlocks(block.id)) - { - case KnownBlocks::BLOCKINFO: name = "BLOCKINFO"; break; - case KnownBlocks::MODULE_BLOCK: name = "MODULE_BLOCK"; break; - case KnownBlocks::PARAMATTR_BLOCK: name = "PARAMATTR_BLOCK"; break; - case KnownBlocks::PARAMATTR_GROUP_BLOCK: name = "PARAMATTR_GROUP_BLOCK"; break; - case KnownBlocks::CONSTANTS_BLOCK: name = "CONSTANTS_BLOCK"; break; - case KnownBlocks::FUNCTION_BLOCK: name = "FUNCTION_BLOCK"; break; - case KnownBlocks::TYPE_SYMTAB_BLOCK: name = "TYPE_SYMTAB_BLOCK"; break; - case KnownBlocks::VALUE_SYMTAB_BLOCK: name = "VALUE_SYMTAB_BLOCK"; break; - case KnownBlocks::METADATA_BLOCK: name = "METADATA_BLOCK"; break; - case KnownBlocks::METADATA_ATTACHMENT: name = "METADATA_ATTACHMENT"; break; - case KnownBlocks::TYPE_BLOCK: name = "TYPE_BLOCK"; break; - default: break; - } - } - else - { -#define STRINGISE_RECORD(a) \ - case decltype(code)::a: name = #a; break; - - // GetCodeName in BitcodeAnalyzer.cpp - switch(KnownBlocks(parentBlock)) - { - case KnownBlocks::BLOCKINFO: - case KnownBlocks::TYPE_SYMTAB_BLOCK: - case KnownBlocks::METADATA_ATTACHMENT: break; - case KnownBlocks::MODULE_BLOCK: - { - ModuleRecord code = ModuleRecord(block.id); - switch(code) - { - STRINGISE_RECORD(VERSION); - STRINGISE_RECORD(TRIPLE); - STRINGISE_RECORD(DATALAYOUT); - STRINGISE_RECORD(GLOBALVAR); - STRINGISE_RECORD(FUNCTION); - STRINGISE_RECORD(ALIAS); - default: break; - } - break; - } - case KnownBlocks::PARAMATTR_BLOCK: - case KnownBlocks::PARAMATTR_GROUP_BLOCK: return StringFormat::Fmt("ENTRY%u", block.id); break; - case KnownBlocks::CONSTANTS_BLOCK: - { - ConstantsRecord code = ConstantsRecord(block.id); - switch(code) - { - STRINGISE_RECORD(SETTYPE); - STRINGISE_RECORD(UNDEF); - STRINGISE_RECORD(INTEGER); - STRINGISE_RECORD(FLOAT); - STRINGISE_RECORD(AGGREGATE); - STRINGISE_RECORD(STRING); - STRINGISE_RECORD(DATA); - case ConstantsRecord::CONST_NULL: name = "NULL"; break; - default: break; - } - break; - } - case KnownBlocks::FUNCTION_BLOCK: - { - FunctionRecord code = FunctionRecord(block.id); - switch(code) - { - STRINGISE_RECORD(DECLAREBLOCKS); - STRINGISE_RECORD(INST_BINOP); - STRINGISE_RECORD(INST_CAST); - STRINGISE_RECORD(INST_GEP_OLD); - STRINGISE_RECORD(INST_SELECT); - STRINGISE_RECORD(INST_EXTRACTELT); - STRINGISE_RECORD(INST_INSERTELT); - STRINGISE_RECORD(INST_SHUFFLEVEC); - STRINGISE_RECORD(INST_CMP); - STRINGISE_RECORD(INST_RET); - STRINGISE_RECORD(INST_BR); - STRINGISE_RECORD(INST_SWITCH); - STRINGISE_RECORD(INST_INVOKE); - STRINGISE_RECORD(INST_UNREACHABLE); - STRINGISE_RECORD(INST_PHI); - STRINGISE_RECORD(INST_ALLOCA); - STRINGISE_RECORD(INST_LOAD); - STRINGISE_RECORD(INST_VAARG); - STRINGISE_RECORD(INST_STORE_OLD); - STRINGISE_RECORD(INST_EXTRACTVAL); - STRINGISE_RECORD(INST_INSERTVAL); - STRINGISE_RECORD(INST_CMP2); - STRINGISE_RECORD(INST_VSELECT); - STRINGISE_RECORD(INST_INBOUNDS_GEP_OLD); - STRINGISE_RECORD(INST_INDIRECTBR); - STRINGISE_RECORD(DEBUG_LOC_AGAIN); - STRINGISE_RECORD(INST_CALL); - STRINGISE_RECORD(DEBUG_LOC); - STRINGISE_RECORD(INST_FENCE); - STRINGISE_RECORD(INST_CMPXCHG_OLD); - STRINGISE_RECORD(INST_ATOMICRMW); - STRINGISE_RECORD(INST_RESUME); - STRINGISE_RECORD(INST_LANDINGPAD_OLD); - STRINGISE_RECORD(INST_LOADATOMIC); - STRINGISE_RECORD(INST_STOREATOMIC_OLD); - STRINGISE_RECORD(INST_GEP); - STRINGISE_RECORD(INST_STORE); - STRINGISE_RECORD(INST_STOREATOMIC); - STRINGISE_RECORD(INST_CMPXCHG); - STRINGISE_RECORD(INST_LANDINGPAD); - STRINGISE_RECORD(INST_CLEANUPRET); - STRINGISE_RECORD(INST_CATCHRET); - STRINGISE_RECORD(INST_CATCHPAD); - STRINGISE_RECORD(INST_CLEANUPPAD); - STRINGISE_RECORD(INST_CATCHSWITCH); - STRINGISE_RECORD(OPERAND_BUNDLE); - STRINGISE_RECORD(INST_UNOP); - STRINGISE_RECORD(INST_CALLBR); - default: break; - } - break; - } - case KnownBlocks::VALUE_SYMTAB_BLOCK: - { - ValueSymtabRecord code = ValueSymtabRecord(block.id); - switch(code) - { - STRINGISE_RECORD(ENTRY); - STRINGISE_RECORD(BBENTRY); - STRINGISE_RECORD(FNENTRY); - STRINGISE_RECORD(COMBINED_ENTRY); - default: break; - } - break; - } - case KnownBlocks::METADATA_BLOCK: - { - MetaDataRecord code = MetaDataRecord(block.id); - switch(code) - { - STRINGISE_RECORD(STRING_OLD); - STRINGISE_RECORD(VALUE); - STRINGISE_RECORD(NODE); - STRINGISE_RECORD(NAME); - STRINGISE_RECORD(DISTINCT_NODE); - STRINGISE_RECORD(KIND); - STRINGISE_RECORD(LOCATION); - STRINGISE_RECORD(OLD_NODE); - STRINGISE_RECORD(OLD_FN_NODE); - STRINGISE_RECORD(NAMED_NODE); - STRINGISE_RECORD(ATTACHMENT); - STRINGISE_RECORD(GENERIC_DEBUG); - STRINGISE_RECORD(SUBRANGE); - STRINGISE_RECORD(ENUMERATOR); - STRINGISE_RECORD(BASIC_TYPE); - STRINGISE_RECORD(FILE); - STRINGISE_RECORD(DERIVED_TYPE); - STRINGISE_RECORD(COMPOSITE_TYPE); - STRINGISE_RECORD(SUBROUTINE_TYPE); - STRINGISE_RECORD(COMPILE_UNIT); - STRINGISE_RECORD(SUBPROGRAM); - STRINGISE_RECORD(LEXICAL_BLOCK); - STRINGISE_RECORD(LEXICAL_BLOCK_FILE); - STRINGISE_RECORD(NAMESPACE); - STRINGISE_RECORD(TEMPLATE_TYPE); - STRINGISE_RECORD(TEMPLATE_VALUE); - STRINGISE_RECORD(GLOBAL_VAR); - STRINGISE_RECORD(LOCAL_VAR); - STRINGISE_RECORD(EXPRESSION); - STRINGISE_RECORD(OBJC_PROPERTY); - STRINGISE_RECORD(IMPORTED_ENTITY); - STRINGISE_RECORD(MODULE); - STRINGISE_RECORD(MACRO); - STRINGISE_RECORD(MACRO_FILE); - STRINGISE_RECORD(STRINGS); - STRINGISE_RECORD(GLOBAL_DECL_ATTACHMENT); - STRINGISE_RECORD(GLOBAL_VAR_EXPR); - STRINGISE_RECORD(INDEX_OFFSET); - STRINGISE_RECORD(INDEX); - STRINGISE_RECORD(LABEL); - STRINGISE_RECORD(COMMON_BLOCK); - default: break; - } - break; - } - case KnownBlocks::TYPE_BLOCK: - { - TypeRecord code = TypeRecord(block.id); - switch(code) - { - STRINGISE_RECORD(NUMENTRY); - STRINGISE_RECORD(VOID); - STRINGISE_RECORD(FLOAT); - STRINGISE_RECORD(DOUBLE); - STRINGISE_RECORD(LABEL); - STRINGISE_RECORD(OPAQUE); - STRINGISE_RECORD(INTEGER); - STRINGISE_RECORD(POINTER); - STRINGISE_RECORD(FUNCTION_OLD); - STRINGISE_RECORD(HALF); - STRINGISE_RECORD(ARRAY); - STRINGISE_RECORD(VECTOR); - STRINGISE_RECORD(METADATA); - STRINGISE_RECORD(STRUCT_ANON); - STRINGISE_RECORD(STRUCT_NAME); - STRINGISE_RECORD(STRUCT_NAMED); - STRINGISE_RECORD(FUNCTION); - default: break; - } - break; - } - } - } - - // fallback - if(name) - { - return name; - } - else - { - if(block.IsBlock()) - return StringFormat::Fmt("BLOCK%u", block.id); - else - return StringFormat::Fmt("RECORD%u", block.id); - } -} - -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 && - (MetaDataRecord(record.id) == MetaDataRecord::STRING_OLD || - MetaDataRecord(record.id) == MetaDataRecord::NAME || - MetaDataRecord(record.id) == MetaDataRecord::KIND)) - { - line += " record string = " + escapeString(record.getString()); - } - 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]); - } - - if(record.blob) - line += StringFormat::Fmt(" with blob of %u bytes", (uint32_t)record.blobLength); - - line += "/>"; - - RDCLOG("%s", line.c_str()); -} - -static void dumpBlock(const LLVMBC::BlockOrRecord &block, int indent) -{ - rdcstr line; - line.fill(indent, ' '); - - if(block.children.empty() || KnownBlocks(block.id) == KnownBlocks::BLOCKINFO) - { - line += StringFormat::Fmt("<%s/>", getName(0, block).c_str()); - RDCLOG("%s", line.c_str()); - return; - } - - line += StringFormat::Fmt("<%s NumWords=%u>", getName(0, block).c_str(), block.blockDwordLength); - RDCLOG("%s", line.c_str()); - - 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(i, block.id, child, indent + 2); - } - - line.fill(indent, ' '); - line += StringFormat::Fmt("", getName(0, block).c_str()); - RDCLOG("%s", line.c_str()); -} - void ParseConstant(const LLVMBC::BlockOrRecord &constant, const Type *&curType, std::function getType, std::function getValue, @@ -1139,7 +834,7 @@ Program::Program(const byte *bytes, size_t length) continue; } - if(symtab.id != 1) + if(!IS_KNOWN(symtab.id, ValueSymtabRecord::ENTRY)) { RDCERR("Unexpected symbol table record ID %u", symtab.id); continue; @@ -1604,7 +1299,6 @@ Program::Program(const byte *bytes, size_t length) } } - (void)&dumpBlock; RDCASSERT(functionDecls.empty()); }