File: DbiStream.h

package info (click to toggle)
llvm-toolchain-3.9 1%3A3.9.1-9
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 441,144 kB
  • ctags: 428,836
  • sloc: cpp: 2,546,577; ansic: 538,318; asm: 119,677; objc: 103,316; python: 102,148; sh: 27,847; pascal: 5,626; ml: 5,510; perl: 5,293; lisp: 4,801; makefile: 2,177; xml: 686; cs: 362; php: 212; csh: 117
file content (149 lines) | stat: -rw-r--r-- 5,156 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
//===- DbiStream.h - PDB Dbi Stream (Stream 3) Access -----------*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

#ifndef LLVM_DEBUGINFO_PDB_RAW_PDBDBISTREAM_H
#define LLVM_DEBUGINFO_PDB_RAW_PDBDBISTREAM_H

#include "llvm/DebugInfo/CodeView/ModuleSubstream.h"
#include "llvm/DebugInfo/CodeView/StreamArray.h"
#include "llvm/DebugInfo/CodeView/StreamRef.h"
#include "llvm/DebugInfo/PDB/PDBTypes.h"
#include "llvm/DebugInfo/PDB/Raw/MappedBlockStream.h"
#include "llvm/DebugInfo/PDB/Raw/ModInfo.h"
#include "llvm/DebugInfo/PDB/Raw/NameHashTable.h"
#include "llvm/DebugInfo/PDB/Raw/RawConstants.h"
#include "llvm/DebugInfo/PDB/Raw/RawTypes.h"
#include "llvm/Support/Endian.h"
#include "llvm/Support/Error.h"

namespace llvm {
namespace object {
struct FpoData;
struct coff_section;
}

namespace pdb {
class DbiStreamBuilder;
class PDBFile;
class ISectionContribVisitor;

class DbiStream {
  friend class DbiStreamBuilder;

  struct HeaderInfo {
    support::little32_t VersionSignature;
    support::ulittle32_t VersionHeader;
    support::ulittle32_t Age;                     // Should match InfoStream.
    support::ulittle16_t GlobalSymbolStreamIndex; // Global symbol stream #
    support::ulittle16_t BuildNumber;             // See DbiBuildNo structure.
    support::ulittle16_t PublicSymbolStreamIndex; // Public symbols stream #
    support::ulittle16_t PdbDllVersion;           // version of mspdbNNN.dll
    support::ulittle16_t SymRecordStreamIndex;    // Symbol records stream #
    support::ulittle16_t PdbDllRbld;              // rbld number of mspdbNNN.dll
    support::little32_t ModiSubstreamSize;        // Size of module info stream
    support::little32_t SecContrSubstreamSize;    // Size of sec. contrib stream
    support::little32_t SectionMapSize;           // Size of sec. map substream
    support::little32_t FileInfoSize;             // Size of file info substream
    support::little32_t TypeServerSize;           // Size of type server map
    support::ulittle32_t MFCTypeServerIndex;      // Index of MFC Type Server
    support::little32_t OptionalDbgHdrSize;       // Size of DbgHeader info
    support::little32_t ECSubstreamSize; // Size of EC stream (what is EC?)
    support::ulittle16_t Flags;          // See DbiFlags enum.
    support::ulittle16_t MachineType;    // See PDB_MachineType enum.

    support::ulittle32_t Reserved; // Pad to 64 bytes
  };

public:
  DbiStream(PDBFile &File, std::unique_ptr<MappedBlockStream> Stream);
  ~DbiStream();
  Error reload();

  PdbRaw_DbiVer getDbiVersion() const;
  uint32_t getAge() const;
  uint16_t getPublicSymbolStreamIndex() const;
  uint16_t getGlobalSymbolStreamIndex() const;

  uint16_t getFlags() const;
  bool isIncrementallyLinked() const;
  bool hasCTypes() const;
  bool isStripped() const;

  uint16_t getBuildNumber() const;
  uint16_t getBuildMajorVersion() const;
  uint16_t getBuildMinorVersion() const;

  uint16_t getPdbDllRbld() const;
  uint32_t getPdbDllVersion() const;

  uint32_t getSymRecordStreamIndex() const;

  PDB_Machine getMachineType() const;

  enum { InvalidStreamIndex = 0xffff };

  /// If the given stream type is present, returns its stream index. If it is
  /// not present, returns InvalidStreamIndex.
  uint32_t getDebugStreamIndex(DbgHeaderType Type) const;

  ArrayRef<ModuleInfoEx> modules() const;

  Expected<StringRef> getFileNameForIndex(uint32_t Index) const;

  codeview::FixedStreamArray<object::coff_section> getSectionHeaders();

  codeview::FixedStreamArray<object::FpoData> getFpoRecords();

  codeview::FixedStreamArray<SecMapEntry> getSectionMap() const;
  void visitSectionContributions(ISectionContribVisitor &Visitor) const;

  Error commit();

private:
  Error initializeSectionContributionData();
  Error initializeSectionHeadersData();
  Error initializeSectionMapData();
  Error initializeFileInfo();
  Error initializeFpoRecords();

  PDBFile &Pdb;
  std::unique_ptr<MappedBlockStream> Stream;

  std::vector<ModuleInfoEx> ModuleInfos;
  NameHashTable ECNames;

  codeview::StreamRef ModInfoSubstream;
  codeview::StreamRef SecContrSubstream;
  codeview::StreamRef SecMapSubstream;
  codeview::StreamRef FileInfoSubstream;
  codeview::StreamRef TypeServerMapSubstream;
  codeview::StreamRef ECSubstream;

  codeview::StreamRef NamesBuffer;

  codeview::FixedStreamArray<support::ulittle16_t> DbgStreams;

  PdbRaw_DbiSecContribVer SectionContribVersion;
  codeview::FixedStreamArray<SectionContrib> SectionContribs;
  codeview::FixedStreamArray<SectionContrib2> SectionContribs2;
  codeview::FixedStreamArray<SecMapEntry> SectionMap;
  codeview::FixedStreamArray<support::little32_t> FileNameOffsets;

  std::unique_ptr<MappedBlockStream> SectionHeaderStream;
  codeview::FixedStreamArray<object::coff_section> SectionHeaders;

  std::unique_ptr<MappedBlockStream> FpoStream;
  codeview::FixedStreamArray<object::FpoData> FpoRecords;

  const HeaderInfo *Header;
};
}
}

#endif