From de53aaf13249dcbd6f3d4fd3b28898c77fa074c8 Mon Sep 17 00:00:00 2001 From: Zachary Turner Date: Mon, 19 Mar 2018 19:53:51 +0000 Subject: Support embedding natvis files in PDBs. Natvis is a debug language supported by Visual Studio for specifying custom visualizers. The /NATVIS option is an undocumented link.exe flag which will take a .natvis file and "inject" it into the PDB. This way, you can ship the debug visualizers for a program along with the PDB, which is very useful for postmortem debugging. This is implemented by adding a new "named stream" to the PDB with a special name of /src/files/ and simply copying the contents of the xml into this file. Additionally, we need to emit a single stream named /src/headerblock which contains a hash table of embedded files to records describing them. This patch adds this functionality, including the /NATVIS option to lld-link. Differential Revision: https://reviews.llvm.org/D44328 llvm-svn: 327895 --- .../CodeView/DebugStringTableSubsection.cpp | 25 +++++++++++++++------- 1 file changed, 17 insertions(+), 8 deletions(-) (limited to 'llvm/lib/DebugInfo/CodeView/DebugStringTableSubsection.cpp') diff --git a/llvm/lib/DebugInfo/CodeView/DebugStringTableSubsection.cpp b/llvm/lib/DebugInfo/CodeView/DebugStringTableSubsection.cpp index d723282..c731b68 100644 --- a/llvm/lib/DebugInfo/CodeView/DebugStringTableSubsection.cpp +++ b/llvm/lib/DebugInfo/CodeView/DebugStringTableSubsection.cpp @@ -46,12 +46,15 @@ DebugStringTableSubsection::DebugStringTableSubsection() : DebugSubsection(DebugSubsectionKind::StringTable) {} uint32_t DebugStringTableSubsection::insert(StringRef S) { - auto P = Strings.insert({S, StringSize}); + auto P = StringToId.insert({S, StringSize}); // If a given string didn't exist in the string table, we want to increment - // the string table size. - if (P.second) + // the string table size and insert it into the reverse lookup. + if (P.second) { + IdToString.insert({P.first->getValue(), P.first->getKey()}); StringSize += S.size() + 1; // +1 for '\0' + } + return P.first->second; } @@ -67,7 +70,7 @@ Error DebugStringTableSubsection::commit(BinaryStreamWriter &Writer) const { if (auto EC = Writer.writeCString(StringRef())) return EC; - for (auto &Pair : Strings) { + for (auto &Pair : StringToId) { StringRef S = Pair.getKey(); uint32_t Offset = Begin + Pair.getValue(); Writer.setOffset(Offset); @@ -81,10 +84,16 @@ Error DebugStringTableSubsection::commit(BinaryStreamWriter &Writer) const { return Error::success(); } -uint32_t DebugStringTableSubsection::size() const { return Strings.size(); } +uint32_t DebugStringTableSubsection::size() const { return StringToId.size(); } + +uint32_t DebugStringTableSubsection::getIdForString(StringRef S) const { + auto Iter = StringToId.find(S); + assert(Iter != StringToId.end()); + return Iter->second; +} -uint32_t DebugStringTableSubsection::getStringId(StringRef S) const { - auto Iter = Strings.find(S); - assert(Iter != Strings.end()); +StringRef DebugStringTableSubsection::getStringForId(uint32_t Id) const { + auto Iter = IdToString.find(Id); + assert(Iter != IdToString.end()); return Iter->second; } -- cgit v1.1