diff options
| author | Zachary Turner <zturner@google.com> | 2016-07-15 22:17:08 +0000 |
|---|---|---|
| committer | Zachary Turner <zturner@google.com> | 2016-07-15 22:17:08 +0000 |
| commit | 5e534c7fb357a157793e9a47c8a00880bdb18799 (patch) | |
| tree | d0df9f3be4f297dbfb463891e8961c62d9973561 /llvm/lib/DebugInfo/PDB/Raw/NameMap.cpp | |
| parent | faa554b2fd6c327cb9cc0ac9983bd3c178f2276c (diff) | |
| download | bcm5719-llvm-5e534c7fb357a157793e9a47c8a00880bdb18799.tar.gz bcm5719-llvm-5e534c7fb357a157793e9a47c8a00880bdb18799.zip | |
[pdb] Round trip the NameMap data structure to YAML.
llvm-svn: 275628
Diffstat (limited to 'llvm/lib/DebugInfo/PDB/Raw/NameMap.cpp')
| -rw-r--r-- | llvm/lib/DebugInfo/PDB/Raw/NameMap.cpp | 44 |
1 files changed, 40 insertions, 4 deletions
diff --git a/llvm/lib/DebugInfo/PDB/Raw/NameMap.cpp b/llvm/lib/DebugInfo/PDB/Raw/NameMap.cpp index 3638380eb22..b8a4eb79a48 100644 --- a/llvm/lib/DebugInfo/PDB/Raw/NameMap.cpp +++ b/llvm/lib/DebugInfo/PDB/Raw/NameMap.cpp @@ -146,20 +146,56 @@ Error NameMap::load(codeview::StreamReader &Stream) { } Error NameMap::commit(codeview::StreamWriter &Writer) { - if (auto EC = Writer.writeInteger(0U)) // Number of bytes in table + // The first field is the number of bytes of string data. So add + // up the length of all strings plus a null terminator for each + // one. + uint32_t NumBytes = 0; + for (auto B = Mapping.begin(), E = Mapping.end(); B != E; ++B) { + NumBytes += B->getKeyLength() + 1; + } + + if (auto EC = Writer.writeInteger(NumBytes)) // Number of bytes of string data return EC; + // Now all of the string data itself. + for (auto B = Mapping.begin(), E = Mapping.end(); B != E; ++B) { + if (auto EC = Writer.writeZeroString(B->getKey())) + return EC; + } - if (auto EC = Writer.writeInteger(0U)) // Hash Size + if (auto EC = Writer.writeInteger(Mapping.size())) // Hash Size return EC; - if (auto EC = Writer.writeInteger(0U)) // Max Number of Strings + if (auto EC = Writer.writeInteger(Mapping.size())) // Max Number of Strings return EC; - if (auto EC = Writer.writeInteger(0U)) // Num Present Words + if (auto EC = Writer.writeInteger(Mapping.size())) // Num Present Words return EC; + // For each entry in the mapping, write a bit mask which represents a bucket + // to store it in. We don't use this, so the value we write isn't important + // to us, it just has to be there. + for (auto B = Mapping.begin(), E = Mapping.end(); B != E; ++B) { + if (auto EC = Writer.writeInteger(1U)) + return EC; + } + if (auto EC = Writer.writeInteger(0U)) // Num Deleted Words return EC; + + // Mappings of each word. + uint32_t OffsetSoFar = 0; + for (auto B = Mapping.begin(), E = Mapping.end(); B != E; ++B) { + // This is a list of key value pairs where the key is the offset into the + // strings buffer, and the value is a stream number. Write each pair. + if (auto EC = Writer.writeInteger(OffsetSoFar)) + return EC; + + if (auto EC = Writer.writeInteger(B->second)) + return EC; + + OffsetSoFar += B->getKeyLength() + 1; + } + return Error::success(); } |

