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 "LinePrinter.h"
13 #include "OutputStyle.h"
14 #include "StreamUtil.h"
15 
16 #include "llvm/ADT/DenseMap.h"
17 #include "llvm/ADT/Optional.h"
18 #include "llvm/ADT/SmallVector.h"
19 #include "llvm/DebugInfo/PDB/Native/RawConstants.h"
20 
21 #include <string>
22 
23 namespace llvm {
24 class BitVector;
25 
26 namespace codeview {
27 class LazyRandomTypeCollection;
28 }
29 
30 namespace object {
31 class COFFObjectFile;
32 }
33 
34 namespace pdb {
35 class GSIHashTable;
36 class InputFile;
37 class TypeReferenceTracker;
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 
52   using KindAndStat = std::pair<uint32_t, Stat>;
53 
updateStatCollection54   void update(uint32_t Kind, uint32_t RecordSize) {
55     Totals.update(RecordSize);
56     auto Iter = Individual.try_emplace(Kind, 1, RecordSize);
57     if (!Iter.second)
58       Iter.first->second.update(RecordSize);
59   }
60   Stat Totals;
61   DenseMap<uint32_t, Stat> Individual;
62 
63   std::vector<KindAndStat> getStatsSortedBySize() const;
64 };
65 
66 class DumpOutputStyle : public OutputStyle {
67 
68 public:
69   DumpOutputStyle(InputFile &File);
70   ~DumpOutputStyle() override;
71 
72   Error dump() override;
73 
74 private:
75   PDBFile &getPdb();
76   object::COFFObjectFile &getObj();
77 
78   void printStreamNotValidForObj();
79   void printStreamNotPresent(StringRef StreamName);
80 
81   Error dumpFileSummary();
82   Error dumpStreamSummary();
83   Error dumpSymbolStats();
84   Error dumpUdtStats();
85   Error dumpTypeStats();
86   Error dumpNamedStreams();
87   Error dumpStringTable();
88   Error dumpStringTableFromPdb();
89   Error dumpStringTableFromObj();
90   Error dumpLines();
91   Error dumpInlineeLines();
92   Error dumpXmi();
93   Error dumpXme();
94   Error dumpFpo();
95   Error dumpOldFpo(PDBFile &File);
96   Error dumpNewFpo(PDBFile &File);
97   Error dumpTpiStream(uint32_t StreamIdx);
98   Error dumpTypesFromObjectFile();
99   Error dumpTypeRefStats();
100   Error dumpModules();
101   Error dumpModuleFiles();
102   Error dumpModuleSymsForPdb();
103   Error dumpModuleSymsForObj();
104   Error dumpGSIRecords();
105   Error dumpGlobals();
106   Error dumpPublics();
107   Error dumpSymbolsFromGSI(const GSIHashTable &Table, bool HashExtras);
108   Error dumpSectionHeaders();
109   Error dumpSectionContribs();
110   Error dumpSectionMap();
111 
112   void dumpSectionHeaders(StringRef Label, DbgHeaderType Type);
113 
114   InputFile &File;
115   std::unique_ptr<TypeReferenceTracker> RefTracker;
116   LinePrinter P;
117   SmallVector<StreamInfo, 32> StreamPurposes;
118 };
119 } // namespace pdb
120 } // namespace llvm
121 
122 #endif
123