Path: blob/main/contrib/llvm-project/llvm/lib/DebugInfo/PDB/Native/InfoStream.cpp
35293 views
//===- InfoStream.cpp - PDB Info Stream (Stream 1) Access -------*- C++ -*-===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//78#include "llvm/DebugInfo/PDB/Native/InfoStream.h"9#include "llvm/DebugInfo/PDB/Native/RawConstants.h"10#include "llvm/DebugInfo/PDB/Native/RawError.h"11#include "llvm/DebugInfo/PDB/Native/RawTypes.h"12#include "llvm/Support/BinaryStreamReader.h"1314using namespace llvm;15using namespace llvm::codeview;16// using namespace llvm::msf;17using namespace llvm::pdb;1819InfoStream::InfoStream(std::unique_ptr<BinaryStream> Stream)20: Stream(std::move(Stream)), Header(nullptr) {}2122Error InfoStream::reload() {23BinaryStreamReader Reader(*Stream);2425if (auto EC = Reader.readObject(Header))26return joinErrors(27std::move(EC),28make_error<RawError>(raw_error_code::corrupt_file,29"PDB Stream does not contain a header."));3031switch (Header->Version) {32case PdbImplVC70:33case PdbImplVC80:34case PdbImplVC110:35case PdbImplVC140:36break;37default:38return make_error<RawError>(raw_error_code::corrupt_file,39"Unsupported PDB stream version.");40}4142uint32_t Offset = Reader.getOffset();43if (auto EC = NamedStreams.load(Reader))44return EC;45uint32_t NewOffset = Reader.getOffset();46NamedStreamMapByteSize = NewOffset - Offset;4748Reader.setOffset(Offset);49if (auto EC = Reader.readSubstream(SubNamedStreams, NamedStreamMapByteSize))50return EC;5152bool Stop = false;53while (!Stop && !Reader.empty()) {54PdbRaw_FeatureSig Sig;55if (auto EC = Reader.readEnum(Sig))56return EC;57// Since this value comes from a file, it's possible we have some strange58// value which doesn't correspond to any value. We don't want to warn on59// -Wcovered-switch-default in this case, so switch on the integral value60// instead of the enumeration value.61switch (uint32_t(Sig)) {62case uint32_t(PdbRaw_FeatureSig::VC110):63// No other flags for VC110 PDB.64Stop = true;65[[fallthrough]];66case uint32_t(PdbRaw_FeatureSig::VC140):67Features |= PdbFeatureContainsIdStream;68break;69case uint32_t(PdbRaw_FeatureSig::NoTypeMerge):70Features |= PdbFeatureNoTypeMerging;71break;72case uint32_t(PdbRaw_FeatureSig::MinimalDebugInfo):73Features |= PdbFeatureMinimalDebugInfo;74break;75default:76continue;77}78FeatureSignatures.push_back(Sig);79}80return Error::success();81}8283uint32_t InfoStream::getStreamSize() const { return Stream->getLength(); }8485Expected<uint32_t> InfoStream::getNamedStreamIndex(llvm::StringRef Name) const {86uint32_t Result;87if (!NamedStreams.get(Name, Result))88return make_error<RawError>(raw_error_code::no_stream);89return Result;90}9192StringMap<uint32_t> InfoStream::named_streams() const {93return NamedStreams.entries();94}9596bool InfoStream::containsIdStream() const {97return !!(Features & PdbFeatureContainsIdStream);98}99100PdbRaw_ImplVer InfoStream::getVersion() const {101return static_cast<PdbRaw_ImplVer>(uint32_t(Header->Version));102}103104uint32_t InfoStream::getSignature() const {105return uint32_t(Header->Signature);106}107108uint32_t InfoStream::getAge() const { return uint32_t(Header->Age); }109110GUID InfoStream::getGuid() const { return Header->Guid; }111112uint32_t InfoStream::getNamedStreamMapByteSize() const {113return NamedStreamMapByteSize;114}115116PdbRaw_Features InfoStream::getFeatures() const { return Features; }117118ArrayRef<PdbRaw_FeatureSig> InfoStream::getFeatureSignatures() const {119return FeatureSignatures;120}121122const NamedStreamMap &InfoStream::getNamedStreams() const {123return NamedStreams;124}125126BinarySubstreamRef InfoStream::getNamedStreamsBuffer() const {127return SubNamedStreams;128}129130131