1317017Sdim//===- NamedStreamMap.h - PDB Named Stream Map ------------------*- C++ -*-===//
2317017Sdim//
3353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4353358Sdim// See https://llvm.org/LICENSE.txt for license information.
5353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6317017Sdim//
7317017Sdim//===----------------------------------------------------------------------===//
8317017Sdim
9320572Sdim#ifndef LLVM_DEBUGINFO_PDB_NATIVE_NAMEDSTREAMMAP_H
10320572Sdim#define LLVM_DEBUGINFO_PDB_NATIVE_NAMEDSTREAMMAP_H
11317017Sdim
12320572Sdim#include "llvm/ADT/Optional.h"
13317017Sdim#include "llvm/ADT/StringMap.h"
14317017Sdim#include "llvm/ADT/StringRef.h"
15320572Sdim#include "llvm/ADT/iterator_range.h"
16317017Sdim#include "llvm/DebugInfo/PDB/Native/HashTable.h"
17317017Sdim#include "llvm/Support/Error.h"
18317017Sdim#include <cstdint>
19317017Sdim
20317017Sdimnamespace llvm {
21320572Sdim
22317017Sdimclass BinaryStreamReader;
23317017Sdimclass BinaryStreamWriter;
24317017Sdim
25317017Sdimnamespace pdb {
26320572Sdim
27341825Sdimclass NamedStreamMap;
28341825Sdim
29341825Sdimstruct NamedStreamMapTraits {
30341825Sdim  NamedStreamMap *NS;
31341825Sdim
32341825Sdim  explicit NamedStreamMapTraits(NamedStreamMap &NS);
33341825Sdim  uint16_t hashLookupKey(StringRef S) const;
34341825Sdim  StringRef storageKeyToLookupKey(uint32_t Offset) const;
35341825Sdim  uint32_t lookupKeyToStorageKey(StringRef S);
36341825Sdim};
37341825Sdim
38317017Sdimclass NamedStreamMap {
39320572Sdim  friend class NamedStreamMapBuilder;
40320572Sdim
41317017Sdimpublic:
42317017Sdim  NamedStreamMap();
43317017Sdim
44317017Sdim  Error load(BinaryStreamReader &Stream);
45317017Sdim  Error commit(BinaryStreamWriter &Writer) const;
46341825Sdim  uint32_t calculateSerializedLength() const;
47317017Sdim
48317017Sdim  uint32_t size() const;
49317017Sdim  bool get(StringRef Stream, uint32_t &StreamNo) const;
50317017Sdim  void set(StringRef Stream, uint32_t StreamNo);
51317017Sdim
52341825Sdim  uint32_t appendStringData(StringRef S);
53341825Sdim  StringRef getString(uint32_t Offset) const;
54341825Sdim  uint32_t hashString(uint32_t Offset) const;
55341825Sdim
56341825Sdim  StringMap<uint32_t> entries() const;
57341825Sdim
58317017Sdimprivate:
59341825Sdim  NamedStreamMapTraits HashTraits;
60341825Sdim  /// Closed hash table from Offset -> StreamNumber, where Offset is the offset
61341825Sdim  /// of the stream name in NamesBuffer.
62353358Sdim  HashTable<support::ulittle32_t> OffsetIndexMap;
63341825Sdim
64341825Sdim  /// Buffer of string data.
65341825Sdim  std::vector<char> NamesBuffer;
66317017Sdim};
67317017Sdim
68317017Sdim} // end namespace pdb
69320572Sdim
70317017Sdim} // end namespace llvm
71317017Sdim
72320572Sdim#endif // LLVM_DEBUGINFO_PDB_NATIVE_NAMEDSTREAMMAP_H
73