summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/include/llvm/DebugInfo/PDB/Raw/HashTable.h2
-rw-r--r--llvm/include/llvm/DebugInfo/PDB/Raw/InfoStreamBuilder.h8
-rw-r--r--llvm/include/llvm/DebugInfo/PDB/Raw/NamedStreamMap.h13
-rw-r--r--llvm/include/llvm/DebugInfo/PDB/Raw/NamedStreamMapBuilder.h45
-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
-rw-r--r--llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp3
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()) {
OpenPOWER on IntegriCloud