blob: e5778170ef884f833fb2a51964b2fb642dc26975 [file] [log] [blame]
Zachary Turner6ac232c2017-03-13 23:28:25 +00001//===- StreamUtil.cpp - PDB stream utilities --------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "StreamUtil.h"
Zachary Turner8120ebf2017-07-05 21:54:58 +000011#include "FormatUtil.h"
Zachary Turner6ac232c2017-03-13 23:28:25 +000012
13#include "llvm/ADT/DenseMap.h"
14#include "llvm/ADT/DenseMapInfo.h"
Zachary Turner67c56012017-04-27 16:11:19 +000015#include "llvm/DebugInfo/PDB/Native/DbiModuleDescriptor.h"
Zachary Turner1eb9a022017-05-04 23:53:29 +000016#include "llvm/DebugInfo/PDB/Native/DbiModuleList.h"
Zachary Turner6ac232c2017-03-13 23:28:25 +000017#include "llvm/DebugInfo/PDB/Native/DbiStream.h"
18#include "llvm/DebugInfo/PDB/Native/InfoStream.h"
Zachary Turner6ac232c2017-03-13 23:28:25 +000019#include "llvm/DebugInfo/PDB/Native/PDBFile.h"
20#include "llvm/DebugInfo/PDB/Native/TpiStream.h"
21
Zachary Turner8120ebf2017-07-05 21:54:58 +000022using namespace llvm;
23using namespace llvm::pdb;
24
Zachary Turnerba3836b2017-07-10 17:32:47 +000025void llvm::pdb::discoverStreamPurposes(PDBFile &File,
26 SmallVectorImpl<std::string> &Purposes,
27 uint32_t MaxLen) {
28
Zachary Turner6ac232c2017-03-13 23:28:25 +000029 // It's OK if we fail to load some of these streams, we still attempt to print
30 // what we can.
31 auto Dbi = File.getPDBDbiStream();
32 auto Tpi = File.getPDBTpiStream();
33 auto Ipi = File.getPDBIpiStream();
34 auto Info = File.getPDBInfoStream();
35
36 uint32_t StreamCount = File.getNumStreams();
Zachary Turner1eb9a022017-05-04 23:53:29 +000037 DenseMap<uint16_t, DbiModuleDescriptor> ModStreams;
Zachary Turner6ac232c2017-03-13 23:28:25 +000038 DenseMap<uint16_t, std::string> NamedStreams;
39
40 if (Dbi) {
Zachary Turner1eb9a022017-05-04 23:53:29 +000041 const DbiModuleList &Modules = Dbi->modules();
42 for (uint32_t I = 0; I < Modules.getModuleCount(); ++I) {
43 DbiModuleDescriptor Descriptor = Modules.getModuleDescriptor(I);
44 uint16_t SN = Descriptor.getModuleStreamIndex();
Zachary Turner6ac232c2017-03-13 23:28:25 +000045 if (SN != kInvalidStreamIndex)
Zachary Turner1eb9a022017-05-04 23:53:29 +000046 ModStreams[SN] = Descriptor;
Zachary Turner6ac232c2017-03-13 23:28:25 +000047 }
48 }
49 if (Info) {
50 for (auto &NSE : Info->named_streams()) {
51 if (NSE.second != kInvalidStreamIndex)
52 NamedStreams[NSE.second] = NSE.first();
53 }
54 }
55
56 Purposes.resize(StreamCount);
57 for (uint16_t StreamIdx = 0; StreamIdx < StreamCount; ++StreamIdx) {
Zachary Turnerba3836b2017-07-10 17:32:47 +000058 std::string Value;
Zachary Turner6ac232c2017-03-13 23:28:25 +000059 if (StreamIdx == OldMSFDirectory)
Zachary Turnerba3836b2017-07-10 17:32:47 +000060 Value = truncateStringBack("Old MSF Directory", MaxLen);
Zachary Turner6ac232c2017-03-13 23:28:25 +000061 else if (StreamIdx == StreamPDB)
Zachary Turnerba3836b2017-07-10 17:32:47 +000062 Value = truncateStringBack("PDB Stream", MaxLen);
Zachary Turner6ac232c2017-03-13 23:28:25 +000063 else if (StreamIdx == StreamDBI)
Zachary Turnerba3836b2017-07-10 17:32:47 +000064 Value = truncateStringBack("DBI Stream", MaxLen);
Zachary Turner6ac232c2017-03-13 23:28:25 +000065 else if (StreamIdx == StreamTPI)
Zachary Turnerba3836b2017-07-10 17:32:47 +000066 Value = truncateStringBack("TPI Stream", MaxLen);
Zachary Turner6ac232c2017-03-13 23:28:25 +000067 else if (StreamIdx == StreamIPI)
Zachary Turnerba3836b2017-07-10 17:32:47 +000068 Value = truncateStringBack("IPI Stream", MaxLen);
Zachary Turner6ac232c2017-03-13 23:28:25 +000069 else if (Dbi && StreamIdx == Dbi->getGlobalSymbolStreamIndex())
Zachary Turnerba3836b2017-07-10 17:32:47 +000070 Value = truncateStringBack("Global Symbol Hash", MaxLen);
Zachary Turner6ac232c2017-03-13 23:28:25 +000071 else if (Dbi && StreamIdx == Dbi->getPublicSymbolStreamIndex())
Zachary Turnerba3836b2017-07-10 17:32:47 +000072 Value = truncateStringBack("Public Symbol Hash", MaxLen);
Zachary Turner6ac232c2017-03-13 23:28:25 +000073 else if (Dbi && StreamIdx == Dbi->getSymRecordStreamIndex())
Zachary Turnerba3836b2017-07-10 17:32:47 +000074 Value = truncateStringBack("Public Symbol Records", MaxLen);
Zachary Turner6ac232c2017-03-13 23:28:25 +000075 else if (Tpi && StreamIdx == Tpi->getTypeHashStreamIndex())
Zachary Turnerba3836b2017-07-10 17:32:47 +000076 Value = truncateStringBack("TPI Hash", MaxLen);
Zachary Turner6ac232c2017-03-13 23:28:25 +000077 else if (Tpi && StreamIdx == Tpi->getTypeHashStreamAuxIndex())
Zachary Turnerba3836b2017-07-10 17:32:47 +000078 Value = truncateStringBack("TPI Aux Hash", MaxLen);
Zachary Turner6ac232c2017-03-13 23:28:25 +000079 else if (Ipi && StreamIdx == Ipi->getTypeHashStreamIndex())
Zachary Turnerba3836b2017-07-10 17:32:47 +000080 Value = truncateStringBack("IPI Hash", MaxLen);
Zachary Turner6ac232c2017-03-13 23:28:25 +000081 else if (Ipi && StreamIdx == Ipi->getTypeHashStreamAuxIndex())
Zachary Turnerba3836b2017-07-10 17:32:47 +000082 Value = truncateStringBack("IPI Aux Hash", MaxLen);
Zachary Turner6ac232c2017-03-13 23:28:25 +000083 else if (Dbi &&
84 StreamIdx == Dbi->getDebugStreamIndex(DbgHeaderType::Exception))
Zachary Turnerba3836b2017-07-10 17:32:47 +000085 Value = truncateStringBack("Exception Data", MaxLen);
Zachary Turner6ac232c2017-03-13 23:28:25 +000086 else if (Dbi && StreamIdx == Dbi->getDebugStreamIndex(DbgHeaderType::Fixup))
Zachary Turnerba3836b2017-07-10 17:32:47 +000087 Value = truncateStringBack("Fixup Data", MaxLen);
Zachary Turner6ac232c2017-03-13 23:28:25 +000088 else if (Dbi && StreamIdx == Dbi->getDebugStreamIndex(DbgHeaderType::FPO))
Zachary Turnerba3836b2017-07-10 17:32:47 +000089 Value = truncateStringBack("FPO Data", MaxLen);
Zachary Turner6ac232c2017-03-13 23:28:25 +000090 else if (Dbi &&
91 StreamIdx == Dbi->getDebugStreamIndex(DbgHeaderType::NewFPO))
Zachary Turnerba3836b2017-07-10 17:32:47 +000092 Value = truncateStringBack("New FPO Data", MaxLen);
Zachary Turner6ac232c2017-03-13 23:28:25 +000093 else if (Dbi &&
94 StreamIdx == Dbi->getDebugStreamIndex(DbgHeaderType::OmapFromSrc))
Zachary Turnerba3836b2017-07-10 17:32:47 +000095 Value = truncateStringBack("Omap From Source Data", MaxLen);
Zachary Turner6ac232c2017-03-13 23:28:25 +000096 else if (Dbi &&
97 StreamIdx == Dbi->getDebugStreamIndex(DbgHeaderType::OmapToSrc))
Zachary Turnerba3836b2017-07-10 17:32:47 +000098 Value = truncateStringBack("Omap To Source Data", MaxLen);
Zachary Turner6ac232c2017-03-13 23:28:25 +000099 else if (Dbi && StreamIdx == Dbi->getDebugStreamIndex(DbgHeaderType::Pdata))
Zachary Turnerba3836b2017-07-10 17:32:47 +0000100 Value = truncateStringBack("Pdata", MaxLen);
Zachary Turner6ac232c2017-03-13 23:28:25 +0000101 else if (Dbi &&
102 StreamIdx == Dbi->getDebugStreamIndex(DbgHeaderType::SectionHdr))
Zachary Turnerba3836b2017-07-10 17:32:47 +0000103 Value = truncateStringBack("Section Header Data", MaxLen);
Zachary Turner6ac232c2017-03-13 23:28:25 +0000104 else if (Dbi &&
105 StreamIdx ==
106 Dbi->getDebugStreamIndex(DbgHeaderType::SectionHdrOrig))
Zachary Turnerba3836b2017-07-10 17:32:47 +0000107 Value = truncateStringBack("Section Header Original Data", MaxLen);
Zachary Turner6ac232c2017-03-13 23:28:25 +0000108 else if (Dbi &&
109 StreamIdx == Dbi->getDebugStreamIndex(DbgHeaderType::TokenRidMap))
Zachary Turnerba3836b2017-07-10 17:32:47 +0000110 Value = truncateStringBack("Token Rid Data", MaxLen);
Zachary Turner6ac232c2017-03-13 23:28:25 +0000111 else if (Dbi && StreamIdx == Dbi->getDebugStreamIndex(DbgHeaderType::Xdata))
Zachary Turnerba3836b2017-07-10 17:32:47 +0000112 Value = truncateStringBack("Xdata", MaxLen);
Zachary Turner6ac232c2017-03-13 23:28:25 +0000113 else {
114 auto ModIter = ModStreams.find(StreamIdx);
115 auto NSIter = NamedStreams.find(StreamIdx);
116 if (ModIter != ModStreams.end()) {
Zachary Turnerba3836b2017-07-10 17:32:47 +0000117 Value = truncateQuotedNameFront(
118 "Module", ModIter->second.getModuleName(), MaxLen);
Zachary Turner6ac232c2017-03-13 23:28:25 +0000119 } else if (NSIter != NamedStreams.end()) {
Zachary Turnerba3836b2017-07-10 17:32:47 +0000120 Value = truncateQuotedNameBack("Named Stream", NSIter->second, MaxLen);
Zachary Turner6ac232c2017-03-13 23:28:25 +0000121 } else {
Zachary Turnerba3836b2017-07-10 17:32:47 +0000122 Value = "???";
Zachary Turner6ac232c2017-03-13 23:28:25 +0000123 }
124 }
125 Purposes[StreamIdx] = Value;
126 }
127
128 // Consume errors from missing streams.
129 if (!Dbi)
130 consumeError(Dbi.takeError());
131 if (!Tpi)
132 consumeError(Tpi.takeError());
133 if (!Ipi)
134 consumeError(Ipi.takeError());
135 if (!Info)
136 consumeError(Info.takeError());
137}