1 //===- DumpOutputStyle.h -------------------------------------- *- 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 #ifndef LLVM_TOOLS_LLVMPDBDUMP_DUMPOUTPUTSTYLE_H 11 #define LLVM_TOOLS_LLVMPDBDUMP_DUMPOUTPUTSTYLE_H 12 13 #include "LinePrinter.h" 14 #include "OutputStyle.h" 15 #include "StreamUtil.h" 16 17 #include "llvm/ADT/DenseMap.h" 18 #include "llvm/ADT/Optional.h" 19 #include "llvm/ADT/SmallVector.h" 20 #include "llvm/DebugInfo/PDB/Native/RawConstants.h" 21 22 #include <string> 23 24 namespace llvm { 25 class BitVector; 26 27 namespace codeview { 28 class LazyRandomTypeCollection; 29 } 30 31 namespace object { 32 class COFFObjectFile; 33 } 34 35 namespace pdb { 36 class GSIHashTable; 37 class InputFile; 38 39 struct StatCollection { 40 struct Stat { StatStatCollection::Stat41 Stat() {} StatStatCollection::Stat42 Stat(uint32_t Count, uint32_t Size) : Count(Count), Size(Size) {} 43 uint32_t Count = 0; 44 uint32_t Size = 0; 45 updateStatCollection::Stat46 void update(uint32_t RecordSize) { 47 ++Count; 48 Size += RecordSize; 49 } 50 }; 51 updateStatCollection52 void update(uint32_t Kind, uint32_t RecordSize) { 53 Totals.update(RecordSize); 54 auto Iter = Individual.try_emplace(Kind, 1, RecordSize); 55 if (!Iter.second) 56 Iter.first->second.update(RecordSize); 57 } 58 Stat Totals; 59 DenseMap<uint32_t, Stat> Individual; 60 }; 61 62 class DumpOutputStyle : public OutputStyle { 63 64 public: 65 DumpOutputStyle(InputFile &File); 66 67 Error dump() override; 68 69 private: 70 PDBFile &getPdb(); 71 object::COFFObjectFile &getObj(); 72 73 void printStreamNotValidForObj(); 74 void printStreamNotPresent(StringRef StreamName); 75 76 Error dumpFileSummary(); 77 Error dumpStreamSummary(); 78 Error dumpSymbolStats(); 79 Error dumpUdtStats(); 80 Error dumpNamedStreams(); 81 Error dumpStringTable(); 82 Error dumpStringTableFromPdb(); 83 Error dumpStringTableFromObj(); 84 Error dumpLines(); 85 Error dumpInlineeLines(); 86 Error dumpXmi(); 87 Error dumpXme(); 88 Error dumpFpo(); 89 Error dumpOldFpo(PDBFile &File); 90 Error dumpNewFpo(PDBFile &File); 91 Error dumpTpiStream(uint32_t StreamIdx); 92 Error dumpTypesFromObjectFile(); 93 Error dumpModules(); 94 Error dumpModuleFiles(); 95 Error dumpModuleSymsForPdb(); 96 Error dumpModuleSymsForObj(); 97 Error dumpGSIRecords(); 98 Error dumpGlobals(); 99 Error dumpPublics(); 100 Error dumpSymbolsFromGSI(const GSIHashTable &Table, bool HashExtras); 101 Error dumpSectionHeaders(); 102 Error dumpSectionContribs(); 103 Error dumpSectionMap(); 104 105 void dumpSectionHeaders(StringRef Label, DbgHeaderType Type); 106 107 InputFile &File; 108 LinePrinter P; 109 SmallVector<StreamInfo, 32> StreamPurposes; 110 }; 111 } // namespace pdb 112 } // namespace llvm 113 114 #endif 115