Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
14 pmbaty 1
//===- DebugStringTableSubsection.h - CodeView String Table -----*- 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_CODEVIEW_DEBUGSTRINGTABLESUBSECTION_H
10
#define LLVM_DEBUGINFO_CODEVIEW_DEBUGSTRINGTABLESUBSECTION_H
11
 
12
#include "llvm/ADT/DenseMap.h"
13
#include "llvm/ADT/StringMap.h"
14
#include "llvm/ADT/StringRef.h"
15
#include "llvm/DebugInfo/CodeView/CodeView.h"
16
#include "llvm/DebugInfo/CodeView/DebugSubsection.h"
17
#include "llvm/Support/BinaryStreamRef.h"
18
#include "llvm/Support/Error.h"
19
#include <cstdint>
20
 
21
namespace llvm {
22
 
23
class BinaryStreamReader;
24
 
25
namespace codeview {
26
 
27
/// Represents a read-only view of a CodeView string table.  This is a very
28
/// simple flat buffer consisting of null-terminated strings, where strings
29
/// are retrieved by their offset in the buffer.  DebugStringTableSubsectionRef
30
/// does not own the underlying storage for the buffer.
31
class DebugStringTableSubsectionRef : public DebugSubsectionRef {
32
public:
33
  DebugStringTableSubsectionRef();
34
 
35
  static bool classof(const DebugSubsectionRef *S) {
36
    return S->kind() == DebugSubsectionKind::StringTable;
37
  }
38
 
39
  Error initialize(BinaryStreamRef Contents);
40
  Error initialize(BinaryStreamReader &Reader);
41
 
42
  Expected<StringRef> getString(uint32_t Offset) const;
43
 
44
  bool valid() const { return Stream.valid(); }
45
 
46
  BinaryStreamRef getBuffer() const { return Stream; }
47
 
48
private:
49
  BinaryStreamRef Stream;
50
};
51
 
52
/// Represents a read-write view of a CodeView string table.
53
/// DebugStringTableSubsection owns the underlying storage for the table, and is
54
/// capable of serializing the string table into a format understood by
55
/// DebugStringTableSubsectionRef.
56
class DebugStringTableSubsection : public DebugSubsection {
57
public:
58
  DebugStringTableSubsection();
59
 
60
  static bool classof(const DebugSubsection *S) {
61
    return S->kind() == DebugSubsectionKind::StringTable;
62
  }
63
 
64
  // If string S does not exist in the string table, insert it.
65
  // Returns the ID for S.
66
  uint32_t insert(StringRef S);
67
 
68
  // Return the ID for string S.  Assumes S exists in the table.
69
  uint32_t getIdForString(StringRef S) const;
70
 
71
  StringRef getStringForId(uint32_t Id) const;
72
 
73
  uint32_t calculateSerializedSize() const override;
74
  Error commit(BinaryStreamWriter &Writer) const override;
75
 
76
  uint32_t size() const;
77
 
78
  StringMap<uint32_t>::const_iterator begin() const {
79
    return StringToId.begin();
80
  }
81
 
82
  StringMap<uint32_t>::const_iterator end() const { return StringToId.end(); }
83
 
84
  std::vector<uint32_t> sortedIds() const;
85
 
86
private:
87
  DenseMap<uint32_t, StringRef> IdToString;
88
  StringMap<uint32_t> StringToId;
89
  uint32_t StringSize = 1;
90
};
91
 
92
} // end namespace codeview
93
 
94
} // end namespace llvm
95
 
96
#endif // LLVM_DEBUGINFO_CODEVIEW_DEBUGSTRINGTABLESUBSECTION_H