xref: /llvm-project/llvm/lib/DebugInfo/PDB/Native/InfoStream.cpp (revision 05a75e40da0f83639111687799eaab2c07c00ef0)
1 //===- InfoStream.cpp - PDB Info Stream (Stream 1) Access -------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 #include "llvm/DebugInfo/PDB/Native/InfoStream.h"
11 #include "llvm/ADT/BitVector.h"
12 #include "llvm/ADT/SmallVector.h"
13 #include "llvm/DebugInfo/MSF/BinaryStreamReader.h"
14 #include "llvm/DebugInfo/MSF/BinaryStreamWriter.h"
15 #include "llvm/DebugInfo/PDB/Native/PDBFile.h"
16 #include "llvm/DebugInfo/PDB/Native/RawConstants.h"
17 #include "llvm/DebugInfo/PDB/Native/RawError.h"
18 #include "llvm/DebugInfo/PDB/Native/RawTypes.h"
19 
20 using namespace llvm;
21 using namespace llvm::codeview;
22 using namespace llvm::msf;
23 using namespace llvm::pdb;
24 
25 InfoStream::InfoStream(std::unique_ptr<MappedBlockStream> Stream)
26     : Stream(std::move(Stream)) {}
27 
28 Error InfoStream::reload() {
29   StreamReader Reader(*Stream);
30 
31   const InfoStreamHeader *H;
32   if (auto EC = Reader.readObject(H))
33     return joinErrors(
34         std::move(EC),
35         make_error<RawError>(raw_error_code::corrupt_file,
36                              "PDB Stream does not contain a header."));
37 
38   switch (H->Version) {
39   case PdbImplVC70:
40   case PdbImplVC80:
41   case PdbImplVC110:
42   case PdbImplVC140:
43     break;
44   default:
45     return make_error<RawError>(raw_error_code::corrupt_file,
46                                 "Unsupported PDB stream version.");
47   }
48 
49   Version = H->Version;
50   Signature = H->Signature;
51   Age = H->Age;
52   Guid = H->Guid;
53 
54   return NamedStreams.load(Reader);
55 }
56 
57 uint32_t InfoStream::getNamedStreamIndex(llvm::StringRef Name) const {
58   uint32_t Result;
59   if (!NamedStreams.get(Name, Result))
60     return 0;
61   return Result;
62 }
63 
64 iterator_range<StringMapConstIterator<uint32_t>>
65 InfoStream::named_streams() const {
66   return NamedStreams.entries();
67 }
68 
69 PdbRaw_ImplVer InfoStream::getVersion() const {
70   return static_cast<PdbRaw_ImplVer>(Version);
71 }
72 
73 uint32_t InfoStream::getSignature() const { return Signature; }
74 
75 uint32_t InfoStream::getAge() const { return Age; }
76 
77 PDB_UniqueId InfoStream::getGuid() const { return Guid; }
78 
79 const NamedStreamMap &InfoStream::getNamedStreams() const {
80   return NamedStreams;
81 }
82