diff options
Diffstat (limited to 'llvm/lib/DebugInfo')
-rw-r--r-- | llvm/lib/DebugInfo/PDB/CMakeLists.txt | 1 | ||||
-rw-r--r-- | llvm/lib/DebugInfo/PDB/Raw/HashTable.cpp | 6 | ||||
-rw-r--r-- | llvm/lib/DebugInfo/PDB/Raw/InfoStream.cpp | 2 | ||||
-rw-r--r-- | llvm/lib/DebugInfo/PDB/Raw/InfoStreamBuilder.cpp | 8 | ||||
-rw-r--r-- | llvm/lib/DebugInfo/PDB/Raw/NamedStreamMap.cpp | 63 | ||||
-rw-r--r-- | llvm/lib/DebugInfo/PDB/Raw/NamedStreamMapBuilder.cpp | 60 |
6 files changed, 69 insertions, 71 deletions
diff --git a/llvm/lib/DebugInfo/PDB/CMakeLists.txt b/llvm/lib/DebugInfo/PDB/CMakeLists.txt index 469886d23e8..1a995e6b351 100644 --- a/llvm/lib/DebugInfo/PDB/CMakeLists.txt +++ b/llvm/lib/DebugInfo/PDB/CMakeLists.txt @@ -40,7 +40,6 @@ add_pdb_impl_folder(Raw Raw/ModInfo.cpp Raw/ModStream.cpp Raw/NamedStreamMap.cpp - Raw/NamedStreamMapBuilder.cpp Raw/PDBFile.cpp Raw/PDBFileBuilder.cpp Raw/PublicsStream.cpp diff --git a/llvm/lib/DebugInfo/PDB/Raw/HashTable.cpp b/llvm/lib/DebugInfo/PDB/Raw/HashTable.cpp index b218f3d8f38..aadc13e53a5 100644 --- a/llvm/lib/DebugInfo/PDB/Raw/HashTable.cpp +++ b/llvm/lib/DebugInfo/PDB/Raw/HashTable.cpp @@ -99,6 +99,12 @@ Error HashTable::commit(msf::StreamWriter &Writer) const { return Error::success(); } +void HashTable::clear() { + Buckets.resize(8); + Present.clear(); + Deleted.clear(); +} + uint32_t HashTable::capacity() const { return Buckets.size(); } uint32_t HashTable::size() const { return Present.count(); } diff --git a/llvm/lib/DebugInfo/PDB/Raw/InfoStream.cpp b/llvm/lib/DebugInfo/PDB/Raw/InfoStream.cpp index f19535d1180..9334d2a6a23 100644 --- a/llvm/lib/DebugInfo/PDB/Raw/InfoStream.cpp +++ b/llvm/lib/DebugInfo/PDB/Raw/InfoStream.cpp @@ -56,7 +56,7 @@ Error InfoStream::reload() { uint32_t InfoStream::getNamedStreamIndex(llvm::StringRef Name) const { uint32_t Result; - if (!NamedStreams.tryGetValue(Name, Result)) + if (!NamedStreams.get(Name, Result)) return 0; return Result; } diff --git a/llvm/lib/DebugInfo/PDB/Raw/InfoStreamBuilder.cpp b/llvm/lib/DebugInfo/PDB/Raw/InfoStreamBuilder.cpp index 50539658819..4485c83dc05 100644 --- a/llvm/lib/DebugInfo/PDB/Raw/InfoStreamBuilder.cpp +++ b/llvm/lib/DebugInfo/PDB/Raw/InfoStreamBuilder.cpp @@ -32,16 +32,12 @@ void InfoStreamBuilder::setAge(uint32_t A) { Age = A; } void InfoStreamBuilder::setGuid(PDB_UniqueId G) { Guid = G; } -NamedStreamMapBuilder &InfoStreamBuilder::getNamedStreamsBuilder() { +NamedStreamMap &InfoStreamBuilder::getNamedStreamsBuilder() { return NamedStreams; } -uint32_t InfoStreamBuilder::calculateSerializedLength() const { - return sizeof(InfoStreamHeader) + NamedStreams.calculateSerializedLength(); -} - Error InfoStreamBuilder::finalizeMsfLayout() { - uint32_t Length = calculateSerializedLength(); + uint32_t Length = sizeof(InfoStreamHeader) + NamedStreams.finalize(); if (auto EC = Msf.setStreamSize(StreamPDB, Length)) return EC; return Error::success(); diff --git a/llvm/lib/DebugInfo/PDB/Raw/NamedStreamMap.cpp b/llvm/lib/DebugInfo/PDB/Raw/NamedStreamMap.cpp index 77077bc3738..54d2649ac22 100644 --- a/llvm/lib/DebugInfo/PDB/Raw/NamedStreamMap.cpp +++ b/llvm/lib/DebugInfo/PDB/Raw/NamedStreamMap.cpp @@ -27,6 +27,10 @@ using namespace llvm::pdb; NamedStreamMap::NamedStreamMap() = default; Error NamedStreamMap::load(StreamReader &Stream) { + Mapping.clear(); + FinalizedHashTable.clear(); + FinalizedInfo.reset(); + uint32_t StringBufferSize; if (auto EC = Stream.readInteger(StringBufferSize)) return joinErrors(std::move(EC), @@ -63,16 +67,69 @@ Error NamedStreamMap::load(StreamReader &Stream) { return Error::success(); } +Error NamedStreamMap::commit(msf::StreamWriter &Writer) const { + assert(FinalizedInfo.hasValue()); + + // The first field is the number of bytes of string data. + if (auto EC = Writer.writeInteger( + FinalizedInfo->StringDataBytes)) // Number of bytes of string data + return EC; + + // Now all of the string data itself. + for (const auto &Item : Mapping) { + if (auto EC = Writer.writeZeroString(Item.getKey())) + return EC; + } + + // And finally the Offset Index map. + if (auto EC = FinalizedHashTable.commit(Writer)) + return EC; + + return Error::success(); +} + +uint32_t NamedStreamMap::finalize() { + if (FinalizedInfo.hasValue()) + return FinalizedInfo->SerializedLength; + + // Build the finalized hash table. + FinalizedHashTable.clear(); + FinalizedInfo.emplace(); + for (const auto &Item : Mapping) { + FinalizedHashTable.set(FinalizedInfo->StringDataBytes, Item.getValue()); + FinalizedInfo->StringDataBytes += Item.getKeyLength() + 1; + } + + // Number of bytes of string data. + FinalizedInfo->SerializedLength += sizeof(support::ulittle32_t); + // Followed by that many actual bytes of string data. + FinalizedInfo->SerializedLength += FinalizedInfo->StringDataBytes; + // Followed by the mapping from Offset to Index. + FinalizedInfo->SerializedLength += + FinalizedHashTable.calculateSerializedLength(); + return FinalizedInfo->SerializedLength; +} + iterator_range<StringMapConstIterator<uint32_t>> NamedStreamMap::entries() const { return make_range<StringMapConstIterator<uint32_t>>(Mapping.begin(), Mapping.end()); } -bool NamedStreamMap::tryGetValue(StringRef Name, uint32_t &Value) const { - auto Iter = Mapping.find(Name); +bool NamedStreamMap::get(StringRef Stream, uint32_t &StreamNo) const { + auto Iter = Mapping.find(Stream); if (Iter == Mapping.end()) return false; - Value = Iter->second; + StreamNo = Iter->second; return true; } + +void NamedStreamMap::set(StringRef Stream, uint32_t StreamNo) { + FinalizedInfo.reset(); + Mapping[Stream] = StreamNo; +} + +void NamedStreamMap::remove(StringRef Stream) { + FinalizedInfo.reset(); + Mapping.erase(Stream); +} diff --git a/llvm/lib/DebugInfo/PDB/Raw/NamedStreamMapBuilder.cpp b/llvm/lib/DebugInfo/PDB/Raw/NamedStreamMapBuilder.cpp deleted file mode 100644 index 886d2ffb331..00000000000 --- a/llvm/lib/DebugInfo/PDB/Raw/NamedStreamMapBuilder.cpp +++ /dev/null @@ -1,60 +0,0 @@ -//===- NamedStreamMapBuilder.cpp - PDB Named Stream Map Builder -*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -#include "llvm/DebugInfo/PDB/Raw/NamedStreamMapBuilder.h" -#include "llvm/ADT/STLExtras.h" -#include "llvm/DebugInfo/MSF/StreamWriter.h" -#include "llvm/DebugInfo/PDB/Raw/NamedStreamMap.h" -#include "llvm/Support/Endian.h" -#include "llvm/Support/Error.h" -#include <algorithm> -#include <cstdint> - -using namespace llvm; -using namespace llvm::pdb; - -NamedStreamMapBuilder::NamedStreamMapBuilder() = default; - -void NamedStreamMapBuilder::addMapping(StringRef Name, uint32_t Mapping) { - Strings.push_back(Name); - Map.set(Offset, Mapping); - Offset += Name.size() + 1; -} - -uint32_t NamedStreamMapBuilder::calculateSerializedLength() const { - uint32_t TotalLength = 0; - - // Number of bytes of string data. - TotalLength += sizeof(support::ulittle32_t); - // Followed by that many actual bytes of string data. - TotalLength += Offset; - // Followed by the mapping from Name to Index. - TotalLength += Map.calculateSerializedLength(); - - return TotalLength; -} - -Error NamedStreamMapBuilder::commit(msf::StreamWriter &Writer) const { - // The first field is the number of bytes of string data. We've already been - // keeping a running total of this in `Offset`. - if (auto EC = Writer.writeInteger(Offset)) // Number of bytes of string data - return EC; - - // Now all of the string data itself. - for (auto S : Strings) { - if (auto EC = Writer.writeZeroString(S)) - return EC; - } - - // And finally the Linear Map. - if (auto EC = Map.commit(Writer)) - return EC; - - return Error::success(); -} |