diff options
| author | Devtools Arcadia <[email protected]> | 2022-02-07 18:08:42 +0300 | 
|---|---|---|
| committer | Devtools Arcadia <[email protected]> | 2022-02-07 18:08:42 +0300 | 
| commit | 1110808a9d39d4b808aef724c861a2e1a38d2a69 (patch) | |
| tree | e26c9fed0de5d9873cce7e00bc214573dc2195b7 /contrib/libs/llvm12/lib/DebugInfo/PDB/Native/InjectedSourceStream.cpp | |
intermediate changes
ref:cde9a383711a11544ce7e107a78147fb96cc4029
Diffstat (limited to 'contrib/libs/llvm12/lib/DebugInfo/PDB/Native/InjectedSourceStream.cpp')
| -rw-r--r-- | contrib/libs/llvm12/lib/DebugInfo/PDB/Native/InjectedSourceStream.cpp | 65 | 
1 files changed, 65 insertions, 0 deletions
diff --git a/contrib/libs/llvm12/lib/DebugInfo/PDB/Native/InjectedSourceStream.cpp b/contrib/libs/llvm12/lib/DebugInfo/PDB/Native/InjectedSourceStream.cpp new file mode 100644 index 00000000000..3f4101db7b9 --- /dev/null +++ b/contrib/libs/llvm12/lib/DebugInfo/PDB/Native/InjectedSourceStream.cpp @@ -0,0 +1,65 @@ +//===- 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(); +}  | 
