1d100b5ddSNico Weber //===- InjectedSourceStream.cpp - PDB Headerblock Stream Access -----------===// 2d100b5ddSNico Weber // 3d100b5ddSNico Weber // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4d100b5ddSNico Weber // See https://llvm.org/LICENSE.txt for license information. 5d100b5ddSNico Weber // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6d100b5ddSNico Weber // 7d100b5ddSNico Weber //===----------------------------------------------------------------------===// 8d100b5ddSNico Weber 9d100b5ddSNico Weber #include "llvm/DebugInfo/PDB/Native/InjectedSourceStream.h" 10d100b5ddSNico Weber 11d100b5ddSNico Weber #include "llvm/DebugInfo/MSF/MappedBlockStream.h" 12*ed98c1b3Sserge-sans-paille #include "llvm/DebugInfo/PDB/Native/HashTable.h" 13d100b5ddSNico Weber #include "llvm/DebugInfo/PDB/Native/PDBStringTable.h" 14d100b5ddSNico Weber #include "llvm/DebugInfo/PDB/Native/RawConstants.h" 15d100b5ddSNico Weber #include "llvm/DebugInfo/PDB/Native/RawTypes.h" 16d100b5ddSNico Weber #include "llvm/Support/BinaryStreamReader.h" 17d100b5ddSNico Weber 18d100b5ddSNico Weber using namespace llvm; 19d100b5ddSNico Weber using namespace llvm::msf; 20d100b5ddSNico Weber using namespace llvm::support; 21d100b5ddSNico Weber using namespace llvm::pdb; 22d100b5ddSNico Weber InjectedSourceStream(std::unique_ptr<MappedBlockStream> Stream)23d100b5ddSNico WeberInjectedSourceStream::InjectedSourceStream( 24d100b5ddSNico Weber std::unique_ptr<MappedBlockStream> Stream) 25d100b5ddSNico Weber : Stream(std::move(Stream)) {} 26d100b5ddSNico Weber reload(const PDBStringTable & Strings)27d100b5ddSNico WeberError InjectedSourceStream::reload(const PDBStringTable &Strings) { 28d100b5ddSNico Weber BinaryStreamReader Reader(*Stream); 29d100b5ddSNico Weber 30d100b5ddSNico Weber if (auto EC = Reader.readObject(Header)) 31d100b5ddSNico Weber return EC; 32d100b5ddSNico Weber 33d100b5ddSNico Weber if (Header->Version != 34d100b5ddSNico Weber static_cast<uint32_t>(PdbRaw_SrcHeaderBlockVer::SrcVerOne)) 35d100b5ddSNico Weber return make_error<RawError>(raw_error_code::corrupt_file, 36d100b5ddSNico Weber "Invalid headerblock header version"); 37d100b5ddSNico Weber 38d100b5ddSNico Weber if (auto EC = InjectedSourceTable.load(Reader)) 39d100b5ddSNico Weber return EC; 40d100b5ddSNico Weber 41d100b5ddSNico Weber for (const auto& Entry : *this) { 42d100b5ddSNico Weber if (Entry.second.Size != sizeof(SrcHeaderBlockEntry)) 43d100b5ddSNico Weber return make_error<RawError>(raw_error_code::corrupt_file, 44d100b5ddSNico Weber "Invalid headerbock entry size"); 45d100b5ddSNico Weber if (Entry.second.Version != 46d100b5ddSNico Weber static_cast<uint32_t>(PdbRaw_SrcHeaderBlockVer::SrcVerOne)) 47d100b5ddSNico Weber return make_error<RawError>(raw_error_code::corrupt_file, 48d100b5ddSNico Weber "Invalid headerbock entry version"); 49d100b5ddSNico Weber 50d100b5ddSNico Weber // Check that all name references are valid. 51d100b5ddSNico Weber auto Name = Strings.getStringForID(Entry.second.FileNI); 52d100b5ddSNico Weber if (!Name) 53d100b5ddSNico Weber return Name.takeError(); 54d100b5ddSNico Weber auto ObjName = Strings.getStringForID(Entry.second.ObjNI); 55d100b5ddSNico Weber if (!ObjName) 56d100b5ddSNico Weber return ObjName.takeError(); 57d100b5ddSNico Weber auto VName = Strings.getStringForID(Entry.second.VFileNI); 58d100b5ddSNico Weber if (!VName) 59d100b5ddSNico Weber return VName.takeError(); 60d100b5ddSNico Weber } 61d100b5ddSNico Weber 62d100b5ddSNico Weber assert(Reader.bytesRemaining() == 0); 63d100b5ddSNico Weber return Error::success(); 64d100b5ddSNico Weber } 65