1 //===- InfoStream.cpp - PDB Info Stream (Stream 1) Access -------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #include "llvm/DebugInfo/PDB/Native/InfoStream.h"
11 #include "llvm/ADT/BitVector.h"
12 #include "llvm/ADT/SmallVector.h"
13 #include "llvm/DebugInfo/PDB/Native/RawConstants.h"
14 #include "llvm/DebugInfo/PDB/Native/RawError.h"
15 #include "llvm/DebugInfo/PDB/Native/RawTypes.h"
16 #include "llvm/Support/BinaryStreamReader.h"
19 using namespace llvm::codeview;
20 using namespace llvm::msf;
21 using namespace llvm::pdb;
23 InfoStream::InfoStream(std::unique_ptr<BinaryStream> Stream)
24 : Stream(std::move(Stream)), Header(nullptr) {}
26 Error InfoStream::reload() {
27 BinaryStreamReader Reader(*Stream);
29 if (auto EC = Reader.readObject(Header))
32 make_error<RawError>(raw_error_code::corrupt_file,
33 "PDB Stream does not contain a header."));
35 switch (Header->Version) {
42 return make_error<RawError>(raw_error_code::corrupt_file,
43 "Unsupported PDB stream version.");
46 uint32_t Offset = Reader.getOffset();
47 if (auto EC = NamedStreams.load(Reader))
49 uint32_t NewOffset = Reader.getOffset();
50 NamedStreamMapByteSize = NewOffset - Offset;
52 Reader.setOffset(Offset);
53 if (auto EC = Reader.readSubstream(SubNamedStreams, NamedStreamMapByteSize))
57 while (!Stop && !Reader.empty()) {
58 PdbRaw_FeatureSig Sig;
59 if (auto EC = Reader.readEnum(Sig))
61 // Since this value comes from a file, it's possible we have some strange
62 // value which doesn't correspond to any value. We don't want to warn on
63 // -Wcovered-switch-default in this case, so switch on the integral value
64 // instead of the enumeration value.
65 switch (uint32_t(Sig)) {
66 case uint32_t(PdbRaw_FeatureSig::VC110):
67 // No other flags for VC110 PDB.
70 case uint32_t(PdbRaw_FeatureSig::VC140):
71 Features |= PdbFeatureContainsIdStream;
73 case uint32_t(PdbRaw_FeatureSig::NoTypeMerge):
74 Features |= PdbFeatureNoTypeMerging;
76 case uint32_t(PdbRaw_FeatureSig::MinimalDebugInfo):
77 Features |= PdbFeatureMinimalDebugInfo;
82 FeatureSignatures.push_back(Sig);
84 return Error::success();
87 uint32_t InfoStream::getStreamSize() const { return Stream->getLength(); }
89 Expected<uint32_t> InfoStream::getNamedStreamIndex(llvm::StringRef Name) const {
91 if (!NamedStreams.get(Name, Result))
92 return make_error<RawError>(raw_error_code::no_stream);
96 StringMap<uint32_t> InfoStream::named_streams() const {
97 return NamedStreams.entries();
100 bool InfoStream::containsIdStream() const {
101 return !!(Features & PdbFeatureContainsIdStream);
104 PdbRaw_ImplVer InfoStream::getVersion() const {
105 return static_cast<PdbRaw_ImplVer>(uint32_t(Header->Version));
108 uint32_t InfoStream::getSignature() const {
109 return uint32_t(Header->Signature);
112 uint32_t InfoStream::getAge() const { return uint32_t(Header->Age); }
114 GUID InfoStream::getGuid() const { return Header->Guid; }
116 uint32_t InfoStream::getNamedStreamMapByteSize() const {
117 return NamedStreamMapByteSize;
120 PdbRaw_Features InfoStream::getFeatures() const { return Features; }
122 ArrayRef<PdbRaw_FeatureSig> InfoStream::getFeatureSignatures() const {
123 return FeatureSignatures;
126 const NamedStreamMap &InfoStream::getNamedStreams() const {
130 BinarySubstreamRef InfoStream::getNamedStreamsBuffer() const {
131 return SubNamedStreams;