xref: /freebsd-src/contrib/llvm-project/llvm/lib/DebugInfo/PDB/Native/InjectedSourceStream.cpp (revision 5f757f3ff9144b609b3c433dfd370cc6bdc191ad)
10b57cec5SDimitry Andric //===- InjectedSourceStream.cpp - PDB Headerblock Stream Access -----------===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric 
90b57cec5SDimitry Andric #include "llvm/DebugInfo/PDB/Native/InjectedSourceStream.h"
100b57cec5SDimitry Andric 
110b57cec5SDimitry Andric #include "llvm/DebugInfo/MSF/MappedBlockStream.h"
12*81ad6265SDimitry Andric #include "llvm/DebugInfo/PDB/Native/HashTable.h"
130b57cec5SDimitry Andric #include "llvm/DebugInfo/PDB/Native/PDBStringTable.h"
140b57cec5SDimitry Andric #include "llvm/DebugInfo/PDB/Native/RawConstants.h"
150b57cec5SDimitry Andric #include "llvm/DebugInfo/PDB/Native/RawTypes.h"
160b57cec5SDimitry Andric #include "llvm/Support/BinaryStreamReader.h"
170b57cec5SDimitry Andric 
180b57cec5SDimitry Andric using namespace llvm;
190b57cec5SDimitry Andric using namespace llvm::msf;
200b57cec5SDimitry Andric using namespace llvm::support;
210b57cec5SDimitry Andric using namespace llvm::pdb;
220b57cec5SDimitry Andric 
InjectedSourceStream(std::unique_ptr<MappedBlockStream> Stream)230b57cec5SDimitry Andric InjectedSourceStream::InjectedSourceStream(
240b57cec5SDimitry Andric     std::unique_ptr<MappedBlockStream> Stream)
250b57cec5SDimitry Andric     : Stream(std::move(Stream)) {}
260b57cec5SDimitry Andric 
reload(const PDBStringTable & Strings)270b57cec5SDimitry Andric Error InjectedSourceStream::reload(const PDBStringTable &Strings) {
280b57cec5SDimitry Andric   BinaryStreamReader Reader(*Stream);
290b57cec5SDimitry Andric 
300b57cec5SDimitry Andric   if (auto EC = Reader.readObject(Header))
310b57cec5SDimitry Andric     return EC;
320b57cec5SDimitry Andric 
330b57cec5SDimitry Andric   if (Header->Version !=
340b57cec5SDimitry Andric       static_cast<uint32_t>(PdbRaw_SrcHeaderBlockVer::SrcVerOne))
350b57cec5SDimitry Andric     return make_error<RawError>(raw_error_code::corrupt_file,
360b57cec5SDimitry Andric                                 "Invalid headerblock header version");
370b57cec5SDimitry Andric 
380b57cec5SDimitry Andric   if (auto EC = InjectedSourceTable.load(Reader))
390b57cec5SDimitry Andric     return EC;
400b57cec5SDimitry Andric 
410b57cec5SDimitry Andric   for (const auto& Entry : *this) {
420b57cec5SDimitry Andric     if (Entry.second.Size != sizeof(SrcHeaderBlockEntry))
430b57cec5SDimitry Andric       return make_error<RawError>(raw_error_code::corrupt_file,
440b57cec5SDimitry Andric                                   "Invalid headerbock entry size");
450b57cec5SDimitry Andric     if (Entry.second.Version !=
460b57cec5SDimitry Andric         static_cast<uint32_t>(PdbRaw_SrcHeaderBlockVer::SrcVerOne))
470b57cec5SDimitry Andric       return make_error<RawError>(raw_error_code::corrupt_file,
480b57cec5SDimitry Andric                                   "Invalid headerbock entry version");
490b57cec5SDimitry Andric 
500b57cec5SDimitry Andric     // Check that all name references are valid.
510b57cec5SDimitry Andric     auto Name = Strings.getStringForID(Entry.second.FileNI);
520b57cec5SDimitry Andric     if (!Name)
530b57cec5SDimitry Andric       return Name.takeError();
540b57cec5SDimitry Andric     auto ObjName = Strings.getStringForID(Entry.second.ObjNI);
550b57cec5SDimitry Andric     if (!ObjName)
560b57cec5SDimitry Andric       return ObjName.takeError();
570b57cec5SDimitry Andric     auto VName = Strings.getStringForID(Entry.second.VFileNI);
580b57cec5SDimitry Andric     if (!VName)
590b57cec5SDimitry Andric       return VName.takeError();
600b57cec5SDimitry Andric   }
610b57cec5SDimitry Andric 
620b57cec5SDimitry Andric   assert(Reader.bytesRemaining() == 0);
630b57cec5SDimitry Andric   return Error::success();
640b57cec5SDimitry Andric }
65