Path: blob/main/contrib/llvm-project/llvm/tools/llvm-pdbutil/StreamUtil.cpp
35259 views
//===- StreamUtil.cpp - PDB stream utilities --------------------*- 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 "StreamUtil.h"910#include "llvm/ADT/DenseMap.h"11#include "llvm/DebugInfo/PDB/Native/DbiModuleDescriptor.h"12#include "llvm/DebugInfo/PDB/Native/DbiModuleList.h"13#include "llvm/DebugInfo/PDB/Native/DbiStream.h"14#include "llvm/DebugInfo/PDB/Native/FormatUtil.h"15#include "llvm/DebugInfo/PDB/Native/InfoStream.h"16#include "llvm/DebugInfo/PDB/Native/PDBFile.h"17#include "llvm/DebugInfo/PDB/Native/TpiStream.h"1819using namespace llvm;20using namespace llvm::pdb;2122std::string StreamInfo::getLongName() const {23if (Purpose == StreamPurpose::NamedStream)24return formatv("Named Stream \"{0}\"", Name).str();25if (Purpose == StreamPurpose::ModuleStream)26return formatv("Module \"{0}\"", Name).str();27return Name;28}2930StreamInfo StreamInfo::createStream(StreamPurpose Purpose, StringRef Name,31uint32_t StreamIndex) {32StreamInfo Result;33Result.Name = std::string(Name);34Result.StreamIndex = StreamIndex;35Result.Purpose = Purpose;36return Result;37}3839StreamInfo StreamInfo::createModuleStream(StringRef Module,40uint32_t StreamIndex, uint32_t Modi) {41StreamInfo Result;42Result.Name = std::string(Module);43Result.StreamIndex = StreamIndex;44Result.ModuleIndex = Modi;45Result.Purpose = StreamPurpose::ModuleStream;46return Result;47}4849static inline StreamInfo stream(StreamPurpose Purpose, StringRef Label,50uint32_t Idx) {51return StreamInfo::createStream(Purpose, Label, Idx);52}5354static inline StreamInfo moduleStream(StringRef Label, uint32_t StreamIdx,55uint32_t Modi) {56return StreamInfo::createModuleStream(Label, StreamIdx, Modi);57}5859struct IndexedModuleDescriptor {60uint32_t Modi;61DbiModuleDescriptor Descriptor;62};6364void llvm::pdb::discoverStreamPurposes(PDBFile &File,65SmallVectorImpl<StreamInfo> &Streams) {66// It's OK if we fail to load some of these streams, we still attempt to print67// what we can.68auto Dbi = File.getPDBDbiStream();69auto Tpi = File.getPDBTpiStream();70auto Ipi = File.getPDBIpiStream();71auto Info = File.getPDBInfoStream();7273uint32_t StreamCount = File.getNumStreams();74DenseMap<uint16_t, IndexedModuleDescriptor> ModStreams;75DenseMap<uint16_t, std::string> NamedStreams;7677if (Dbi) {78const DbiModuleList &Modules = Dbi->modules();79for (uint32_t I = 0; I < Modules.getModuleCount(); ++I) {80IndexedModuleDescriptor IMD;81IMD.Modi = I;82IMD.Descriptor = Modules.getModuleDescriptor(I);83uint16_t SN = IMD.Descriptor.getModuleStreamIndex();84if (SN != kInvalidStreamIndex)85ModStreams[SN] = IMD;86}87}88if (Info) {89for (auto &NSE : Info->named_streams()) {90if (NSE.second != kInvalidStreamIndex)91NamedStreams[NSE.second] = std::string(NSE.first());92}93}9495Streams.resize(StreamCount);96for (uint32_t StreamIdx = 0; StreamIdx < StreamCount; ++StreamIdx) {97if (StreamIdx == OldMSFDirectory)98Streams[StreamIdx] =99stream(StreamPurpose::Other, "Old MSF Directory", StreamIdx);100else if (StreamIdx == StreamPDB)101Streams[StreamIdx] = stream(StreamPurpose::PDB, "PDB Stream", StreamIdx);102else if (StreamIdx == StreamDBI)103Streams[StreamIdx] = stream(StreamPurpose::DBI, "DBI Stream", StreamIdx);104else if (StreamIdx == StreamTPI)105Streams[StreamIdx] = stream(StreamPurpose::TPI, "TPI Stream", StreamIdx);106else if (StreamIdx == StreamIPI)107Streams[StreamIdx] = stream(StreamPurpose::IPI, "IPI Stream", StreamIdx);108else if (Dbi && StreamIdx == Dbi->getGlobalSymbolStreamIndex())109Streams[StreamIdx] =110stream(StreamPurpose::GlobalHash, "Global Symbol Hash", StreamIdx);111else if (Dbi && StreamIdx == Dbi->getPublicSymbolStreamIndex())112Streams[StreamIdx] =113stream(StreamPurpose::PublicHash, "Public Symbol Hash", StreamIdx);114else if (Dbi && StreamIdx == Dbi->getSymRecordStreamIndex())115Streams[StreamIdx] =116stream(StreamPurpose::Symbols, "Symbol Records", StreamIdx);117else if (Tpi && StreamIdx == Tpi->getTypeHashStreamIndex())118Streams[StreamIdx] =119stream(StreamPurpose::TpiHash, "TPI Hash", StreamIdx);120else if (Tpi && StreamIdx == Tpi->getTypeHashStreamAuxIndex())121Streams[StreamIdx] =122stream(StreamPurpose::Other, "TPI Aux Hash", StreamIdx);123else if (Ipi && StreamIdx == Ipi->getTypeHashStreamIndex())124Streams[StreamIdx] =125stream(StreamPurpose::IpiHash, "IPI Hash", StreamIdx);126else if (Ipi && StreamIdx == Ipi->getTypeHashStreamAuxIndex())127Streams[StreamIdx] =128stream(StreamPurpose::Other, "IPI Aux Hash", StreamIdx);129else if (Dbi &&130StreamIdx == Dbi->getDebugStreamIndex(DbgHeaderType::Exception))131Streams[StreamIdx] =132stream(StreamPurpose::Other, "Exception Data", StreamIdx);133else if (Dbi && StreamIdx == Dbi->getDebugStreamIndex(DbgHeaderType::Fixup))134Streams[StreamIdx] =135stream(StreamPurpose::Other, "Fixup Data", StreamIdx);136else if (Dbi && StreamIdx == Dbi->getDebugStreamIndex(DbgHeaderType::FPO))137Streams[StreamIdx] = stream(StreamPurpose::Other, "FPO Data", StreamIdx);138else if (Dbi &&139StreamIdx == Dbi->getDebugStreamIndex(DbgHeaderType::NewFPO))140Streams[StreamIdx] =141stream(StreamPurpose::Other, "New FPO Data", StreamIdx);142else if (Dbi &&143StreamIdx == Dbi->getDebugStreamIndex(DbgHeaderType::OmapFromSrc))144Streams[StreamIdx] =145stream(StreamPurpose::Other, "Omap From Source Data", StreamIdx);146else if (Dbi &&147StreamIdx == Dbi->getDebugStreamIndex(DbgHeaderType::OmapToSrc))148Streams[StreamIdx] =149stream(StreamPurpose::Other, "Omap To Source Data", StreamIdx);150else if (Dbi && StreamIdx == Dbi->getDebugStreamIndex(DbgHeaderType::Pdata))151Streams[StreamIdx] = stream(StreamPurpose::Other, "Pdata", StreamIdx);152else if (Dbi &&153StreamIdx == Dbi->getDebugStreamIndex(DbgHeaderType::SectionHdr))154Streams[StreamIdx] =155stream(StreamPurpose::Other, "Section Header Data", StreamIdx);156else if (Dbi &&157StreamIdx ==158Dbi->getDebugStreamIndex(DbgHeaderType::SectionHdrOrig))159Streams[StreamIdx] = stream(StreamPurpose::Other,160"Section Header Original Data", StreamIdx);161else if (Dbi &&162StreamIdx == Dbi->getDebugStreamIndex(DbgHeaderType::TokenRidMap))163Streams[StreamIdx] =164stream(StreamPurpose::Other, "Token Rid Data", StreamIdx);165else if (Dbi && StreamIdx == Dbi->getDebugStreamIndex(DbgHeaderType::Xdata))166Streams[StreamIdx] = stream(StreamPurpose::Other, "Xdata", StreamIdx);167else {168auto ModIter = ModStreams.find(StreamIdx);169auto NSIter = NamedStreams.find(StreamIdx);170if (ModIter != ModStreams.end()) {171Streams[StreamIdx] =172moduleStream(ModIter->second.Descriptor.getModuleName(), StreamIdx,173ModIter->second.Modi);174} else if (NSIter != NamedStreams.end()) {175Streams[StreamIdx] =176stream(StreamPurpose::NamedStream, NSIter->second, StreamIdx);177} else {178Streams[StreamIdx] = stream(StreamPurpose::Other, "???", StreamIdx);179}180}181}182183// Consume errors from missing streams.184if (!Dbi)185consumeError(Dbi.takeError());186if (!Tpi)187consumeError(Tpi.takeError());188if (!Ipi)189consumeError(Ipi.takeError());190if (!Info)191consumeError(Info.takeError());192}193194195