diff options
| -rw-r--r-- | llvm/include/llvm/DebugInfo/PDB/Raw/HashTable.h | 2 | ||||
| -rw-r--r-- | llvm/include/llvm/DebugInfo/PDB/Raw/InfoStreamBuilder.h | 8 | ||||
| -rw-r--r-- | llvm/include/llvm/DebugInfo/PDB/Raw/NamedStreamMap.h | 13 | ||||
| -rw-r--r-- | llvm/include/llvm/DebugInfo/PDB/Raw/NamedStreamMapBuilder.h | 45 | ||||
| -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 | ||||
| -rw-r--r-- | llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp | 3 |
11 files changed, 88 insertions, 123 deletions
diff --git a/llvm/include/llvm/DebugInfo/PDB/Raw/HashTable.h b/llvm/include/llvm/DebugInfo/PDB/Raw/HashTable.h index d8035501203..793df32858d 100644 --- a/llvm/include/llvm/DebugInfo/PDB/Raw/HashTable.h +++ b/llvm/include/llvm/DebugInfo/PDB/Raw/HashTable.h @@ -47,6 +47,8 @@ public: uint32_t calculateSerializedLength() const; Error commit(msf::StreamWriter &Writer) const; + void clear(); + uint32_t capacity() const; uint32_t size() const; diff --git a/llvm/include/llvm/DebugInfo/PDB/Raw/InfoStreamBuilder.h b/llvm/include/llvm/DebugInfo/PDB/Raw/InfoStreamBuilder.h index ab6a0c33ff0..199249225c7 100644 --- a/llvm/include/llvm/DebugInfo/PDB/Raw/InfoStreamBuilder.h +++ b/llvm/include/llvm/DebugInfo/PDB/Raw/InfoStreamBuilder.h @@ -14,7 +14,7 @@ #include "llvm/Support/Error.h" #include "llvm/DebugInfo/PDB/PDBTypes.h" -#include "llvm/DebugInfo/PDB/Raw/NamedStreamMapBuilder.h" +#include "llvm/DebugInfo/PDB/Raw/NamedStreamMap.h" #include "llvm/DebugInfo/PDB/Raw/PDBFile.h" #include "llvm/DebugInfo/PDB/Raw/RawConstants.h" @@ -37,9 +37,9 @@ public: void setAge(uint32_t A); void setGuid(PDB_UniqueId G); - NamedStreamMapBuilder &getNamedStreamsBuilder(); + NamedStreamMap &getNamedStreamsBuilder(); - uint32_t calculateSerializedLength() const; + uint32_t finalize(); Error finalizeMsfLayout(); @@ -54,7 +54,7 @@ private: uint32_t Age; PDB_UniqueId Guid; - NamedStreamMapBuilder NamedStreams; + NamedStreamMap NamedStreams; }; } } diff --git a/llvm/include/llvm/DebugInfo/PDB/Raw/NamedStreamMap.h b/llvm/include/llvm/DebugInfo/PDB/Raw/NamedStreamMap.h index 088c53aed84..18b828a4a43 100644 --- a/llvm/include/llvm/DebugInfo/PDB/Raw/NamedStreamMap.h +++ b/llvm/include/llvm/DebugInfo/PDB/Raw/NamedStreamMap.h @@ -12,6 +12,7 @@ #include "llvm/ADT/StringMap.h" #include "llvm/ADT/StringRef.h" +#include "llvm/DebugInfo/PDB/Raw/HashTable.h" #include "llvm/Support/Error.h" #include <cstdint> @@ -23,18 +24,28 @@ class StreamWriter; namespace pdb { class NamedStreamMapBuilder; class NamedStreamMap { + struct FinalizationInfo { + uint32_t StringDataBytes = 0; + uint32_t SerializedLength = 0; + }; friend NamedStreamMapBuilder; public: NamedStreamMap(); Error load(msf::StreamReader &Stream); + Error commit(msf::StreamWriter &Writer) const; + uint32_t finalize(); - bool tryGetValue(StringRef Name, uint32_t &Value) const; + bool get(StringRef Stream, uint32_t &StreamNo) const; + void set(StringRef Stream, uint32_t StreamNo); + void remove(StringRef Stream); iterator_range<StringMapConstIterator<uint32_t>> entries() const; private: + Optional<FinalizationInfo> FinalizedInfo; + HashTable FinalizedHashTable; StringMap<uint32_t> Mapping; }; diff --git a/llvm/include/llvm/DebugInfo/PDB/Raw/NamedStreamMapBuilder.h b/llvm/include/llvm/DebugInfo/PDB/Raw/NamedStreamMapBuilder.h deleted file mode 100644 index b53a60dd426..00000000000 --- a/llvm/include/llvm/DebugInfo/PDB/Raw/NamedStreamMapBuilder.h +++ /dev/null @@ -1,45 +0,0 @@ -//===- NamedStreamMapBuilder.h - 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. -// -//===----------------------------------------------------------------------===// - -#ifndef LLVM_DEBUGINFO_PDB_RAW_PDBNAMEDSTREAMMAPBUILDER_H -#define LLVM_DEBUGINFO_PDB_RAW_PDBNAMEDSTREAMMAPBUILDER_H - -#include "llvm/DebugInfo/PDB/Raw/HashTable.h" -#include "llvm/Support/Error.h" - -#include <cstdint> -#include <memory> -#include <vector> - -namespace llvm { -namespace msf { -class StreamWriter; -} -namespace pdb { - -class NamedStreamMapBuilder { -public: - NamedStreamMapBuilder(); - - void addMapping(StringRef Name, uint32_t Mapping); - - Error commit(msf::StreamWriter &Writer) const; - - uint32_t calculateSerializedLength() const; - -private: - std::vector<StringRef> Strings; - HashTable Map; - uint32_t Offset = 0; -}; - -} // end namespace pdb -} // end namespace llvm - -#endif // LLVM_DEBUGINFO_PDB_RAW_PDBNAMEMAPBUILDER_H 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(); -} diff --git a/llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp b/llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp index cce0a043997..762af6d1e5b 100644 --- a/llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp +++ b/llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp @@ -352,8 +352,7 @@ static void yamlToPdb(StringRef Path) { InfoBuilder.setSignature(YamlObj.PdbStream->Signature); InfoBuilder.setVersion(YamlObj.PdbStream->Version); for (auto &NM : YamlObj.PdbStream->NamedStreams) - InfoBuilder.getNamedStreamsBuilder().addMapping(NM.StreamName, - NM.StreamNumber); + InfoBuilder.getNamedStreamsBuilder().set(NM.StreamName, NM.StreamNumber); } if (YamlObj.DbiStream.hasValue()) { |

