From df0246ab68f81d3d9800e5ec11b9a51f07582575 Mon Sep 17 00:00:00 2001 From: baldurk Date: Wed, 16 May 2018 12:50:41 +0100 Subject: [PATCH] Remap SPDB line-numbers after sorting filenames --- renderdoc/driver/shaders/dxbc/dxbc_spdb.cpp | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/renderdoc/driver/shaders/dxbc/dxbc_spdb.cpp b/renderdoc/driver/shaders/dxbc/dxbc_spdb.cpp index 526bf864e..cc827e65b 100644 --- a/renderdoc/driver/shaders/dxbc/dxbc_spdb.cpp +++ b/renderdoc/driver/shaders/dxbc/dxbc_spdb.cpp @@ -998,6 +998,12 @@ SPDBChunk::SPDBChunk(void *chunk) delete[] pages; + // save the filenames in their original order + std::vector filenames; + filenames.reserve(Files.size()); + for(size_t i = 0; i < Files.size(); i++) + filenames.push_back(Files[i].first); + // Sort files according to the order they come in the Names array, this seems to be more reliable // about placing the main file first. std::sort(Files.begin(), Files.end(), [&Names](const std::pair &a, @@ -1024,6 +1030,19 @@ SPDBChunk::SPDBChunk(void *chunk) return aIdx < bIdx; }); + // create a map from filename -> index + std::map remapping; + for(size_t i = 0; i < Files.size(); i++) + remapping[Files[i].first] = (int32_t)i; + + // remap the line info by looking up the original intended filename, then looking up the new index + for(auto it = m_LineNumbers.begin(); it != m_LineNumbers.end(); ++it) + { + if(it->second.fileIndex == -1) + continue; + it->second.first = remapping[filenames[it->second.first]]; + } + m_HasDebugInfo = true; }