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 AndricInjectedSourceStream::InjectedSourceStream( 240b57cec5SDimitry Andric std::unique_ptr<MappedBlockStream> Stream) 250b57cec5SDimitry Andric : Stream(std::move(Stream)) {} 260b57cec5SDimitry Andric reload(const PDBStringTable & Strings)270b57cec5SDimitry AndricError 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