diff --git a/renderdoc/driver/shaders/dxil/dxil_bytecode_editor.cpp b/renderdoc/driver/shaders/dxil/dxil_bytecode_editor.cpp index 55e4034c2..9722690b5 100644 --- a/renderdoc/driver/shaders/dxil/dxil_bytecode_editor.cpp +++ b/renderdoc/driver/shaders/dxil/dxil_bytecode_editor.cpp @@ -619,6 +619,39 @@ bytebuf DXIL::ProgramEditor::EncodeProgram() const writer.EndBlock(); } + { + writer.BeginBlock(LLVMBC::KnownBlock::VALUE_SYMTAB_BLOCK); + + rdcarray> entries; + + for(size_t s = 0; s < m_Symbols.size(); s++) + { + bool symtab = false; + switch(m_Symbols[s].type) + { + case SymbolType::GlobalVar: + case SymbolType::Function: + case SymbolType::Alias: symtab = true; break; + default: break; + } + + if(symtab) + entries.push_back({s, &m_Constants[s].str}); + } + + // sort the entries by string in order + std::sort(entries.begin(), entries.end(), + [](const rdcpair &a, + const rdcpair &b) { return *a.second < *b.second; }); + + // we use a special function to record the entry so it can take the string as-is to check it for + // validity + for(const rdcpair &it : entries) + writer.RecordSymTabEntry(it.first, *it.second); + + writer.EndBlock(); + } + writer.EndBlock(); ProgramHeader header; diff --git a/renderdoc/driver/shaders/dxil/llvm_encoder.cpp b/renderdoc/driver/shaders/dxil/llvm_encoder.cpp index b2ba2f30b..03ba2220e 100644 --- a/renderdoc/driver/shaders/dxil/llvm_encoder.cpp +++ b/renderdoc/driver/shaders/dxil/llvm_encoder.cpp @@ -733,6 +733,45 @@ void BitcodeWriter::AutoRecord(uint32_t record, const rdcarray &vals) } } +void BitcodeWriter::RecordSymTabEntry(size_t id, const rdcstr &str, bool basicBlock) +{ + bool c6 = true, c7 = true; + for(size_t i = 0; (c6 || c7) && i < str.size(); i++) + { + if(!isChar6(str[i])) + c6 = false; + if((unsigned char)str[i] >= 128) + c7 = false; + } + + ValueSymtabAbbrev abbrev = ValueSymtabAbbrev::Entry8; + ValueSymtabRecord record = ValueSymtabRecord::ENTRY; + + if(basicBlock) + { + record = ValueSymtabRecord::BBENTRY; + if(c6) + abbrev = ValueSymtabAbbrev::BBEntry6; + } + else + { + if(c6) + abbrev = ValueSymtabAbbrev::Entry6; + else if(c7) + abbrev = ValueSymtabAbbrev::Entry7; + } + + // write the abbrev ID + b.fixed(abbrevSize, GetAbbrevID((uint32_t)abbrev)); + + rdcarray vals; + vals.resize(str.size() + 1); + vals[0] = id; + for(size_t i = 0; i < str.size(); i++) + vals[i + 1] = str[i]; + Abbrev(ValueSymtabAbbrevDefs[(uint32_t)abbrev], (uint32_t)record, vals); +} + void BitcodeWriter::Abbrev(AbbrevParam *abbr, uint32_t record, uint64_t val) { WriteAbbrevParam(abbr[0], record); diff --git a/renderdoc/driver/shaders/dxil/llvm_encoder.h b/renderdoc/driver/shaders/dxil/llvm_encoder.h index fe0fb1489..f1a932cff 100644 --- a/renderdoc/driver/shaders/dxil/llvm_encoder.h +++ b/renderdoc/driver/shaders/dxil/llvm_encoder.h @@ -87,6 +87,8 @@ public: AutoRecord((uint32_t)record, vals); } + void RecordSymTabEntry(size_t id, const rdcstr &str, bool basicBlock = false); + private: void WriteAbbrevDefinition(AbbrevParam *abbrev);