| //===- InjectedSourceStream.cpp - PDB Headerblock Stream Access -----------===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #include "llvm/DebugInfo/PDB/Native/InjectedSourceStream.h" |
| |
| #include "llvm/DebugInfo/MSF/MappedBlockStream.h" |
| #include "llvm/DebugInfo/PDB/Native/Hash.h" |
| #include "llvm/DebugInfo/PDB/Native/PDBStringTable.h" |
| #include "llvm/DebugInfo/PDB/Native/RawConstants.h" |
| #include "llvm/DebugInfo/PDB/Native/RawTypes.h" |
| #include "llvm/Support/BinaryStreamReader.h" |
| #include "llvm/Support/Endian.h" |
| |
| using namespace llvm; |
| using namespace llvm::msf; |
| using namespace llvm::support; |
| using namespace llvm::pdb; |
| |
| InjectedSourceStream::InjectedSourceStream( |
| std::unique_ptr<MappedBlockStream> Stream) |
| : Stream(std::move(Stream)) {} |
| |
| Error InjectedSourceStream::reload(const PDBStringTable &Strings) { |
| BinaryStreamReader Reader(*Stream); |
| |
| if (auto EC = Reader.readObject(Header)) |
| return EC; |
| |
| if (Header->Version != |
| static_cast<uint32_t>(PdbRaw_SrcHeaderBlockVer::SrcVerOne)) |
| return make_error<RawError>(raw_error_code::corrupt_file, |
| "Invalid headerblock header version"); |
| |
| if (auto EC = InjectedSourceTable.load(Reader)) |
| return EC; |
| |
| for (const auto& Entry : *this) { |
| if (Entry.second.Size != sizeof(SrcHeaderBlockEntry)) |
| return make_error<RawError>(raw_error_code::corrupt_file, |
| "Invalid headerbock entry size"); |
| if (Entry.second.Version != |
| static_cast<uint32_t>(PdbRaw_SrcHeaderBlockVer::SrcVerOne)) |
| return make_error<RawError>(raw_error_code::corrupt_file, |
| "Invalid headerbock entry version"); |
| |
| // Check that all name references are valid. |
| auto Name = Strings.getStringForID(Entry.second.FileNI); |
| if (!Name) |
| return Name.takeError(); |
| auto ObjName = Strings.getStringForID(Entry.second.ObjNI); |
| if (!ObjName) |
| return ObjName.takeError(); |
| auto VName = Strings.getStringForID(Entry.second.VFileNI); |
| if (!VName) |
| return VName.takeError(); |
| } |
| |
| assert(Reader.bytesRemaining() == 0); |
| return Error::success(); |
| } |