annotate lib/DebugInfo/PDB/Native/NamedStreamMap.cpp @ 148:63bd29f05246

merged
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Wed, 14 Aug 2019 19:46:37 +0900
parents c2174574ed3a
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
121
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
1 //===- NamedStreamMap.cpp - PDB Named Stream Map --------------------------===//
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
2 //
147
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 121
diff changeset
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 121
diff changeset
4 // See https://llvm.org/LICENSE.txt for license information.
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 121
diff changeset
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
121
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
6 //
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
7 //===----------------------------------------------------------------------===//
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
8
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
9 #include "llvm/DebugInfo/PDB/Native/NamedStreamMap.h"
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
10 #include "llvm/ADT/StringMap.h"
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
11 #include "llvm/ADT/StringRef.h"
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
12 #include "llvm/ADT/iterator_range.h"
147
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 121
diff changeset
13 #include "llvm/DebugInfo/PDB/Native/Hash.h"
121
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
14 #include "llvm/DebugInfo/PDB/Native/HashTable.h"
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
15 #include "llvm/DebugInfo/PDB/Native/RawError.h"
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
16 #include "llvm/Support/BinaryStreamReader.h"
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
17 #include "llvm/Support/BinaryStreamRef.h"
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
18 #include "llvm/Support/BinaryStreamWriter.h"
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
19 #include "llvm/Support/Endian.h"
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
20 #include "llvm/Support/Error.h"
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
21 #include <algorithm>
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
22 #include <cassert>
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
23 #include <cstdint>
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
24 #include <tuple>
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
25
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
26 using namespace llvm;
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
27 using namespace llvm::pdb;
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
28
147
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 121
diff changeset
29 NamedStreamMapTraits::NamedStreamMapTraits(NamedStreamMap &NS) : NS(&NS) {}
121
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
30
147
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 121
diff changeset
31 uint16_t NamedStreamMapTraits::hashLookupKey(StringRef S) const {
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 121
diff changeset
32 // In the reference implementation, this uses
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 121
diff changeset
33 // HASH Hasher<ULONG*, USHORT*>::hashPbCb(PB pb, size_t cb, ULONG ulMod).
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 121
diff changeset
34 // Here, the type HASH is a typedef of unsigned short.
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 121
diff changeset
35 // ** It is not a bug that we truncate the result of hashStringV1, in fact
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 121
diff changeset
36 // it is a bug if we do not! **
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 121
diff changeset
37 // See NMTNI::hash() in the reference implementation.
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 121
diff changeset
38 return static_cast<uint16_t>(hashStringV1(S));
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 121
diff changeset
39 }
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 121
diff changeset
40
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 121
diff changeset
41 StringRef NamedStreamMapTraits::storageKeyToLookupKey(uint32_t Offset) const {
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 121
diff changeset
42 return NS->getString(Offset);
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 121
diff changeset
43 }
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 121
diff changeset
44
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 121
diff changeset
45 uint32_t NamedStreamMapTraits::lookupKeyToStorageKey(StringRef S) {
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 121
diff changeset
46 return NS->appendStringData(S);
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 121
diff changeset
47 }
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 121
diff changeset
48
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 121
diff changeset
49 NamedStreamMap::NamedStreamMap() : HashTraits(*this), OffsetIndexMap(1) {}
121
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
50
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
51 Error NamedStreamMap::load(BinaryStreamReader &Stream) {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
52 uint32_t StringBufferSize;
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
53 if (auto EC = Stream.readInteger(StringBufferSize))
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
54 return joinErrors(std::move(EC),
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
55 make_error<RawError>(raw_error_code::corrupt_file,
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
56 "Expected string buffer size"));
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
57
147
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 121
diff changeset
58 StringRef Buffer;
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 121
diff changeset
59 if (auto EC = Stream.readFixedString(Buffer, StringBufferSize))
121
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
60 return EC;
147
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 121
diff changeset
61 NamesBuffer.assign(Buffer.begin(), Buffer.end());
121
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
62
147
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 121
diff changeset
63 return OffsetIndexMap.load(Stream);
121
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
64 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
65
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
66 Error NamedStreamMap::commit(BinaryStreamWriter &Writer) const {
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
67 // The first field is the number of bytes of string data.
147
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 121
diff changeset
68 if (auto EC = Writer.writeInteger<uint32_t>(NamesBuffer.size()))
121
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
69 return EC;
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
70
147
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 121
diff changeset
71 // Then the actual string data.
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 121
diff changeset
72 StringRef Data(NamesBuffer.data(), NamesBuffer.size());
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 121
diff changeset
73 if (auto EC = Writer.writeFixedString(Data))
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 121
diff changeset
74 return EC;
121
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
75
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
76 // And finally the Offset Index map.
147
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 121
diff changeset
77 if (auto EC = OffsetIndexMap.commit(Writer))
121
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
78 return EC;
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
79
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
80 return Error::success();
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
81 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
82
147
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 121
diff changeset
83 uint32_t NamedStreamMap::calculateSerializedLength() const {
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 121
diff changeset
84 return sizeof(uint32_t) // String data size
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 121
diff changeset
85 + NamesBuffer.size() // String data
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 121
diff changeset
86 + OffsetIndexMap.calculateSerializedLength(); // Offset Index Map
121
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
87 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
88
147
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 121
diff changeset
89 uint32_t NamedStreamMap::size() const { return OffsetIndexMap.size(); }
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 121
diff changeset
90
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 121
diff changeset
91 StringRef NamedStreamMap::getString(uint32_t Offset) const {
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 121
diff changeset
92 assert(NamesBuffer.size() > Offset);
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 121
diff changeset
93 return StringRef(NamesBuffer.data() + Offset);
121
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
94 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
95
147
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 121
diff changeset
96 uint32_t NamedStreamMap::hashString(uint32_t Offset) const {
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 121
diff changeset
97 return hashStringV1(getString(Offset));
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 121
diff changeset
98 }
121
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
99
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
100 bool NamedStreamMap::get(StringRef Stream, uint32_t &StreamNo) const {
147
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 121
diff changeset
101 auto Iter = OffsetIndexMap.find_as(Stream, HashTraits);
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 121
diff changeset
102 if (Iter == OffsetIndexMap.end())
121
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
103 return false;
147
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 121
diff changeset
104 StreamNo = (*Iter).second;
121
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
105 return true;
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
106 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
107
147
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 121
diff changeset
108 StringMap<uint32_t> NamedStreamMap::entries() const {
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 121
diff changeset
109 StringMap<uint32_t> Result;
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 121
diff changeset
110 for (const auto &Entry : OffsetIndexMap) {
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 121
diff changeset
111 StringRef Stream(NamesBuffer.data() + Entry.first);
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 121
diff changeset
112 Result.try_emplace(Stream, Entry.second);
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 121
diff changeset
113 }
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 121
diff changeset
114 return Result;
121
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
115 }
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
116
147
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 121
diff changeset
117 uint32_t NamedStreamMap::appendStringData(StringRef S) {
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 121
diff changeset
118 uint32_t Offset = NamesBuffer.size();
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 121
diff changeset
119 NamesBuffer.insert(NamesBuffer.end(), S.begin(), S.end());
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 121
diff changeset
120 NamesBuffer.push_back('\0');
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 121
diff changeset
121 return Offset;
121
803732b1fca8 LLVM 5.0
kono
parents:
diff changeset
122 }
147
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 121
diff changeset
123
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 121
diff changeset
124 void NamedStreamMap::set(StringRef Stream, uint32_t StreamNo) {
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 121
diff changeset
125 OffsetIndexMap.set_as(Stream, support::ulittle32_t(StreamNo), HashTraits);
c2174574ed3a LLVM 10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 121
diff changeset
126 }