1*9880d681SAndroid Build Coastguard Worker //===- ModStream.cpp - PDB Module Info Stream Access ----------------------===//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker
10*9880d681SAndroid Build Coastguard Worker #include "llvm/DebugInfo/PDB/Raw/ModStream.h"
11*9880d681SAndroid Build Coastguard Worker
12*9880d681SAndroid Build Coastguard Worker #include "llvm/DebugInfo/CodeView/StreamReader.h"
13*9880d681SAndroid Build Coastguard Worker #include "llvm/DebugInfo/PDB/Raw/IndexedStreamData.h"
14*9880d681SAndroid Build Coastguard Worker #include "llvm/DebugInfo/PDB/Raw/ModInfo.h"
15*9880d681SAndroid Build Coastguard Worker #include "llvm/DebugInfo/PDB/Raw/PDBFile.h"
16*9880d681SAndroid Build Coastguard Worker #include "llvm/DebugInfo/PDB/Raw/RawError.h"
17*9880d681SAndroid Build Coastguard Worker #include "llvm/DebugInfo/PDB/Raw/RawTypes.h"
18*9880d681SAndroid Build Coastguard Worker
19*9880d681SAndroid Build Coastguard Worker using namespace llvm;
20*9880d681SAndroid Build Coastguard Worker using namespace llvm::pdb;
21*9880d681SAndroid Build Coastguard Worker
ModStream(const ModInfo & Module,std::unique_ptr<MappedBlockStream> Stream)22*9880d681SAndroid Build Coastguard Worker ModStream::ModStream(const ModInfo &Module,
23*9880d681SAndroid Build Coastguard Worker std::unique_ptr<MappedBlockStream> Stream)
24*9880d681SAndroid Build Coastguard Worker : Mod(Module), Stream(std::move(Stream)) {}
25*9880d681SAndroid Build Coastguard Worker
~ModStream()26*9880d681SAndroid Build Coastguard Worker ModStream::~ModStream() {}
27*9880d681SAndroid Build Coastguard Worker
reload()28*9880d681SAndroid Build Coastguard Worker Error ModStream::reload() {
29*9880d681SAndroid Build Coastguard Worker codeview::StreamReader Reader(*Stream);
30*9880d681SAndroid Build Coastguard Worker
31*9880d681SAndroid Build Coastguard Worker uint32_t SymbolSize = Mod.getSymbolDebugInfoByteSize();
32*9880d681SAndroid Build Coastguard Worker uint32_t C11Size = Mod.getLineInfoByteSize();
33*9880d681SAndroid Build Coastguard Worker uint32_t C13Size = Mod.getC13LineInfoByteSize();
34*9880d681SAndroid Build Coastguard Worker
35*9880d681SAndroid Build Coastguard Worker if (C11Size > 0 && C13Size > 0)
36*9880d681SAndroid Build Coastguard Worker return llvm::make_error<RawError>(raw_error_code::corrupt_file,
37*9880d681SAndroid Build Coastguard Worker "Module has both C11 and C13 line info");
38*9880d681SAndroid Build Coastguard Worker
39*9880d681SAndroid Build Coastguard Worker codeview::StreamRef S;
40*9880d681SAndroid Build Coastguard Worker
41*9880d681SAndroid Build Coastguard Worker uint32_t SymbolSubstreamSig = 0;
42*9880d681SAndroid Build Coastguard Worker if (auto EC = Reader.readInteger(SymbolSubstreamSig))
43*9880d681SAndroid Build Coastguard Worker return EC;
44*9880d681SAndroid Build Coastguard Worker if (auto EC = Reader.readArray(SymbolsSubstream, SymbolSize - 4))
45*9880d681SAndroid Build Coastguard Worker return EC;
46*9880d681SAndroid Build Coastguard Worker
47*9880d681SAndroid Build Coastguard Worker if (auto EC = Reader.readStreamRef(LinesSubstream, C11Size))
48*9880d681SAndroid Build Coastguard Worker return EC;
49*9880d681SAndroid Build Coastguard Worker if (auto EC = Reader.readStreamRef(C13LinesSubstream, C13Size))
50*9880d681SAndroid Build Coastguard Worker return EC;
51*9880d681SAndroid Build Coastguard Worker
52*9880d681SAndroid Build Coastguard Worker codeview::StreamReader LineReader(C13LinesSubstream);
53*9880d681SAndroid Build Coastguard Worker if (auto EC = LineReader.readArray(LineInfo, LineReader.bytesRemaining()))
54*9880d681SAndroid Build Coastguard Worker return EC;
55*9880d681SAndroid Build Coastguard Worker
56*9880d681SAndroid Build Coastguard Worker uint32_t GlobalRefsSize;
57*9880d681SAndroid Build Coastguard Worker if (auto EC = Reader.readInteger(GlobalRefsSize))
58*9880d681SAndroid Build Coastguard Worker return EC;
59*9880d681SAndroid Build Coastguard Worker if (auto EC = Reader.readStreamRef(GlobalRefsSubstream, GlobalRefsSize))
60*9880d681SAndroid Build Coastguard Worker return EC;
61*9880d681SAndroid Build Coastguard Worker if (Reader.bytesRemaining() > 0)
62*9880d681SAndroid Build Coastguard Worker return llvm::make_error<RawError>(raw_error_code::corrupt_file,
63*9880d681SAndroid Build Coastguard Worker "Unexpected bytes in module stream.");
64*9880d681SAndroid Build Coastguard Worker
65*9880d681SAndroid Build Coastguard Worker return Error::success();
66*9880d681SAndroid Build Coastguard Worker }
67*9880d681SAndroid Build Coastguard Worker
68*9880d681SAndroid Build Coastguard Worker iterator_range<codeview::CVSymbolArray::Iterator>
symbols(bool * HadError) const69*9880d681SAndroid Build Coastguard Worker ModStream::symbols(bool *HadError) const {
70*9880d681SAndroid Build Coastguard Worker // It's OK if the stream is empty.
71*9880d681SAndroid Build Coastguard Worker if (SymbolsSubstream.getUnderlyingStream().getLength() == 0)
72*9880d681SAndroid Build Coastguard Worker return llvm::make_range(SymbolsSubstream.end(), SymbolsSubstream.end());
73*9880d681SAndroid Build Coastguard Worker return llvm::make_range(SymbolsSubstream.begin(HadError),
74*9880d681SAndroid Build Coastguard Worker SymbolsSubstream.end());
75*9880d681SAndroid Build Coastguard Worker }
76*9880d681SAndroid Build Coastguard Worker
77*9880d681SAndroid Build Coastguard Worker iterator_range<codeview::ModuleSubstreamArray::Iterator>
lines(bool * HadError) const78*9880d681SAndroid Build Coastguard Worker ModStream::lines(bool *HadError) const {
79*9880d681SAndroid Build Coastguard Worker return llvm::make_range(LineInfo.begin(HadError), LineInfo.end());
80*9880d681SAndroid Build Coastguard Worker }
81*9880d681SAndroid Build Coastguard Worker
commit()82*9880d681SAndroid Build Coastguard Worker Error ModStream::commit() { return Error::success(); }
83