1//===- NamedStreamMap.h - PDB Named Stream Map ------------------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#ifndef LLVM_DEBUGINFO_PDB_NATIVE_NAMEDSTREAMMAP_H
10#define LLVM_DEBUGINFO_PDB_NATIVE_NAMEDSTREAMMAP_H
11
12#include "llvm/ADT/StringMap.h"
13#include "llvm/ADT/StringRef.h"
14#include "llvm/DebugInfo/PDB/Native/HashTable.h"
15#include "llvm/Support/Error.h"
16#include <cstdint>
17
18namespace llvm {
19
20class BinaryStreamReader;
21class BinaryStreamWriter;
22
23namespace pdb {
24
25class NamedStreamMap;
26
27struct NamedStreamMapTraits {
28 NamedStreamMap *NS;
29
30 explicit NamedStreamMapTraits(NamedStreamMap &NS);
31 uint16_t hashLookupKey(StringRef S) const;
32 StringRef storageKeyToLookupKey(uint32_t Offset) const;
33 uint32_t lookupKeyToStorageKey(StringRef S);
34};
35
36class NamedStreamMap {
37 friend class NamedStreamMapBuilder;
38
39public:
40 NamedStreamMap();
41
42 Error load(BinaryStreamReader &Stream);
43 Error commit(BinaryStreamWriter &Writer) const;
44 uint32_t calculateSerializedLength() const;
45
46 uint32_t size() const;
47 bool get(StringRef Stream, uint32_t &StreamNo) const;
48 void set(StringRef Stream, uint32_t StreamNo);
49
50 uint32_t appendStringData(StringRef S);
51 StringRef getString(uint32_t Offset) const;
52 uint32_t hashString(uint32_t Offset) const;
53
54 StringMap<uint32_t> entries() const;
55
56private:
57 NamedStreamMapTraits HashTraits;
58 /// Closed hash table from Offset -> StreamNumber, where Offset is the offset
59 /// of the stream name in NamesBuffer.
60 HashTable<support::ulittle32_t> OffsetIndexMap;
61
62 /// Buffer of string data.
63 std::vector<char> NamesBuffer;
64};
65
66} // end namespace pdb
67
68} // end namespace llvm
69
70#endif // LLVM_DEBUGINFO_PDB_NATIVE_NAMEDSTREAMMAP_H
71