aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/DebugInfo/PDB/Raw/NameMap.cpp
diff options
context:
space:
mode:
authorDavid Majnemer <david.majnemer@gmail.com>2016-06-04 22:47:39 +0000
committerDavid Majnemer <david.majnemer@gmail.com>2016-06-04 22:47:39 +0000
commit36b7b08d4f15ff29e3ddef4e9f16c259fd366835 (patch)
treee8d90d9200b2effcb50d735b2f9e0e3b89114f73 /llvm/lib/DebugInfo/PDB/Raw/NameMap.cpp
parentea8a2111690ab56450f7ab3cedcbcdbae17a87aa (diff)
downloadllvm-36b7b08d4f15ff29e3ddef4e9f16c259fd366835.zip
llvm-36b7b08d4f15ff29e3ddef4e9f16c259fd366835.tar.gz
llvm-36b7b08d4f15ff29e3ddef4e9f16c259fd366835.tar.bz2
[DebugInfo, PDB] Use sparse bitfields for the name map
The name map might not be densely packed on disk. Using a sparse map will save memory in such situations. llvm-svn: 271811
Diffstat (limited to 'llvm/lib/DebugInfo/PDB/Raw/NameMap.cpp')
-rw-r--r--llvm/lib/DebugInfo/PDB/Raw/NameMap.cpp33
1 files changed, 12 insertions, 21 deletions
diff --git a/llvm/lib/DebugInfo/PDB/Raw/NameMap.cpp b/llvm/lib/DebugInfo/PDB/Raw/NameMap.cpp
index 62a86da..51ec66a 100644
--- a/llvm/lib/DebugInfo/PDB/Raw/NameMap.cpp
+++ b/llvm/lib/DebugInfo/PDB/Raw/NameMap.cpp
@@ -8,7 +8,7 @@
//===----------------------------------------------------------------------===//
#include "llvm/DebugInfo/PDB/Raw/NameMap.h"
-#include "llvm/ADT/BitVector.h"
+#include "llvm/ADT/SparseBitVector.h"
#include "llvm/DebugInfo/CodeView/StreamReader.h"
#include "llvm/DebugInfo/PDB/Raw/RawError.h"
@@ -68,16 +68,16 @@ Error NameMap::load(codeview::StreamReader &Stream) {
return make_error<RawError>(raw_error_code::corrupt_file,
"Number of present words is too large");
- // Store all the 'present' bits in a vector for later processing.
- SmallVector<uint32_t, 1> PresentWords;
+ SparseBitVector<> Present;
for (uint32_t I = 0; I != NumPresentWords; ++I) {
uint32_t Word;
if (auto EC = Stream.readInteger(Word))
return joinErrors(std::move(EC),
make_error<RawError>(raw_error_code::corrupt_file,
"Expected name map word"));
-
- PresentWords.push_back(Word);
+ for (unsigned Idx = 0; Idx < 32; ++Idx)
+ if (Word & (1U << Idx))
+ Present.set((I * 32) + Idx);
}
// This appears to be a hash table which uses bitfields to determine whether
@@ -93,30 +93,21 @@ Error NameMap::load(codeview::StreamReader &Stream) {
return make_error<RawError>(raw_error_code::corrupt_file,
"Number of deleted words is too large");
- // Store all the 'deleted' bits in a vector for later processing.
- SmallVector<uint32_t, 1> DeletedWords;
+ SparseBitVector<> Deleted;
for (uint32_t I = 0; I != NumDeletedWords; ++I) {
uint32_t Word;
if (auto EC = Stream.readInteger(Word))
return joinErrors(std::move(EC),
make_error<RawError>(raw_error_code::corrupt_file,
- "Expected name map deleted word"));
-
- DeletedWords.push_back(Word);
+ "Expected name map word"));
+ for (unsigned Idx = 0; Idx < 32; ++Idx)
+ if (Word & (1U << Idx))
+ Deleted.set((I * 32) + Idx);
}
- BitVector Present(MaxNumberOfStrings, false);
- if (!PresentWords.empty())
- Present.setBitsInMask(PresentWords.data(), PresentWords.size());
- BitVector Deleted(MaxNumberOfStrings, false);
- if (!DeletedWords.empty())
- Deleted.setBitsInMask(DeletedWords.data(), DeletedWords.size());
-
- for (uint32_t I = 0; I < MaxNumberOfStrings; ++I) {
- if (!Present.test(I))
- continue;
-
+ for (unsigned I : Present) {
// For all present entries, dump out their mapping.
+ (void)I;
// This appears to be an offset relative to the start of the strings.
// It tells us where the null-terminated string begins.