1//===- DumpOutputStyle.h -------------------------------------- *- C++ --*-===// 2// 3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4// See https://llvm.org/LICENSE.txt for license information. 5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6// 7//===----------------------------------------------------------------------===// 8 9#ifndef LLVM_TOOLS_LLVMPDBDUMP_DUMPOUTPUTSTYLE_H 10#define LLVM_TOOLS_LLVMPDBDUMP_DUMPOUTPUTSTYLE_H 11 12#include "OutputStyle.h" 13#include "StreamUtil.h" 14 15#include "llvm/ADT/DenseMap.h" 16#include "llvm/ADT/SmallVector.h" 17#include "llvm/DebugInfo/PDB/Native/LinePrinter.h" 18#include "llvm/DebugInfo/PDB/Native/RawConstants.h" 19 20namespace llvm { 21namespace object { 22class COFFObjectFile; 23} 24 25namespace pdb { 26class GSIHashTable; 27class InputFile; 28class TypeReferenceTracker; 29 30struct StatCollection { 31 struct Stat { 32 Stat() {} 33 Stat(uint32_t Count, uint32_t Size) : Count(Count), Size(Size) {} 34 uint32_t Count = 0; 35 uint32_t Size = 0; 36 37 void update(uint32_t RecordSize) { 38 ++Count; 39 Size += RecordSize; 40 } 41 }; 42 43 using KindAndStat = std::pair<uint32_t, Stat>; 44 45 void update(uint32_t Kind, uint32_t RecordSize) { 46 Totals.update(RecordSize); 47 auto Iter = Individual.try_emplace(Kind, 1, RecordSize); 48 if (!Iter.second) 49 Iter.first->second.update(RecordSize); 50 } 51 Stat Totals; 52 DenseMap<uint32_t, Stat> Individual; 53 54 std::vector<KindAndStat> getStatsSortedBySize() const; 55}; 56 57class DumpOutputStyle : public OutputStyle { 58 59public: 60 DumpOutputStyle(InputFile &File); 61 ~DumpOutputStyle() override; 62 63 Error dump() override; 64 65private: 66 PDBFile &getPdb(); 67 object::COFFObjectFile &getObj(); 68 69 void printStreamNotValidForObj(); 70 void printStreamNotPresent(StringRef StreamName); 71 72 Error dumpFileSummary(); 73 Error dumpStreamSummary(); 74 Error dumpSymbolStats(); 75 Error dumpUdtStats(); 76 Error dumpTypeStats(); 77 Error dumpNamedStreams(); 78 Error dumpStringTable(); 79 Error dumpStringTableFromPdb(); 80 Error dumpStringTableFromObj(); 81 Error dumpLines(); 82 Error dumpInlineeLines(); 83 Error dumpXmi(); 84 Error dumpXme(); 85 Error dumpFpo(); 86 Error dumpOldFpo(PDBFile &File); 87 Error dumpNewFpo(PDBFile &File); 88 Error dumpTpiStream(uint32_t StreamIdx); 89 Error dumpTypesFromObjectFile(); 90 Error dumpTypeRefStats(); 91 Error dumpModules(); 92 Error dumpModuleFiles(); 93 Error dumpModuleSymsForPdb(); 94 Error dumpModuleSymsForObj(); 95 Error dumpGSIRecords(); 96 Error dumpGlobals(); 97 Error dumpPublics(); 98 Error dumpSymbolsFromGSI(const GSIHashTable &Table, bool HashExtras); 99 Error dumpSectionHeaders(); 100 Error dumpSectionContribs(); 101 Error dumpSectionMap(); 102 103 void dumpSectionHeaders(StringRef Label, DbgHeaderType Type); 104 105 InputFile &File; 106 std::unique_ptr<TypeReferenceTracker> RefTracker; 107 LinePrinter P; 108 SmallVector<StreamInfo, 32> StreamPurposes; 109}; 110} // namespace pdb 111} // namespace llvm 112 113#endif 114