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 20 namespace llvm { 21 namespace object { 22 class COFFObjectFile; 23 } 24 25 namespace pdb { 26 class GSIHashTable; 27 class InputFile; 28 class TypeReferenceTracker; 29 30 struct 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 57 class DumpOutputStyle : public OutputStyle { 58 59 public: 60 DumpOutputStyle(InputFile &File); 61 ~DumpOutputStyle() override; 62 63 Error dump() override; 64 65 private: 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