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