//===- 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/HashTable.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();
}
