summaryrefslogtreecommitdiffstats
path: root/llvm/lib/DebugInfo/PDB
diff options
context:
space:
mode:
authorZachary Turner <zturner@google.com>2017-01-20 22:41:40 +0000
committerZachary Turner <zturner@google.com>2017-01-20 22:41:40 +0000
commit60667ca0b2b95ee25dace3f8627feda5a904cd8f (patch)
tree7ae0305c1b0d65822ea70a49204ed35020c79092 /llvm/lib/DebugInfo/PDB
parentf04d6e8d52719d64dddd95e86577d61ad1f4f074 (diff)
downloadbcm5719-llvm-60667ca0b2b95ee25dace3f8627feda5a904cd8f.tar.gz
bcm5719-llvm-60667ca0b2b95ee25dace3f8627feda5a904cd8f.zip
[pdb] Merge NamedStreamMapBuilder and NamedStreamMap.
While the builder pattern has proven useful for certain other larger types, in this case it was hampering the ability to use the data structure, as for runtime access we need a map that we can efficiently read from and write to. So the two are merged into a single data structure that can efficiently be read to, written from, deserialized from bytes, and serialized to bytes. llvm-svn: 292664
Diffstat (limited to 'llvm/lib/DebugInfo/PDB')
-rw-r--r--llvm/lib/DebugInfo/PDB/CMakeLists.txt1
-rw-r--r--llvm/lib/DebugInfo/PDB/Raw/HashTable.cpp6
-rw-r--r--llvm/lib/DebugInfo/PDB/Raw/InfoStream.cpp2
-rw-r--r--llvm/lib/DebugInfo/PDB/Raw/InfoStreamBuilder.cpp8
-rw-r--r--llvm/lib/DebugInfo/PDB/Raw/NamedStreamMap.cpp63
-rw-r--r--llvm/lib/DebugInfo/PDB/Raw/NamedStreamMapBuilder.cpp60
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();
-}
OpenPOWER on IntegriCloud