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