xref: /freebsd/contrib/llvm-project/llvm/tools/llvm-pdbutil/llvm-pdbutil.h (revision 0b57cec536236d46e3dba9bd041533462f33dbb7)
1*0b57cec5SDimitry Andric //===- llvm-pdbutil.h ----------------------------------------- *- C++ --*-===//
2*0b57cec5SDimitry Andric //
3*0b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*0b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5*0b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*0b57cec5SDimitry Andric //
7*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
8*0b57cec5SDimitry Andric 
9*0b57cec5SDimitry Andric #ifndef LLVM_TOOLS_LLVMPDBDUMP_LLVMPDBDUMP_H
10*0b57cec5SDimitry Andric #define LLVM_TOOLS_LLVMPDBDUMP_LLVMPDBDUMP_H
11*0b57cec5SDimitry Andric 
12*0b57cec5SDimitry Andric #include "llvm/ADT/DenseMap.h"
13*0b57cec5SDimitry Andric #include "llvm/ADT/Optional.h"
14*0b57cec5SDimitry Andric #include "llvm/ADT/PointerUnion.h"
15*0b57cec5SDimitry Andric #include "llvm/Support/CommandLine.h"
16*0b57cec5SDimitry Andric #include "llvm/Support/raw_ostream.h"
17*0b57cec5SDimitry Andric 
18*0b57cec5SDimitry Andric #include <memory>
19*0b57cec5SDimitry Andric #include <stdint.h>
20*0b57cec5SDimitry Andric 
21*0b57cec5SDimitry Andric namespace llvm {
22*0b57cec5SDimitry Andric namespace object {
23*0b57cec5SDimitry Andric class COFFObjectFile;
24*0b57cec5SDimitry Andric }
25*0b57cec5SDimitry Andric namespace pdb {
26*0b57cec5SDimitry Andric class PDBSymbolData;
27*0b57cec5SDimitry Andric class PDBSymbolFunc;
28*0b57cec5SDimitry Andric class PDBFile;
29*0b57cec5SDimitry Andric uint32_t getTypeLength(const PDBSymbolData &Symbol);
30*0b57cec5SDimitry Andric }
31*0b57cec5SDimitry Andric typedef llvm::PointerUnion<object::COFFObjectFile *, pdb::PDBFile *>
32*0b57cec5SDimitry Andric     PdbOrCoffObj;
33*0b57cec5SDimitry Andric }
34*0b57cec5SDimitry Andric 
35*0b57cec5SDimitry Andric namespace opts {
36*0b57cec5SDimitry Andric 
37*0b57cec5SDimitry Andric enum class DumpLevel { None, Basic, Verbose };
38*0b57cec5SDimitry Andric 
39*0b57cec5SDimitry Andric enum class ModuleSubsection {
40*0b57cec5SDimitry Andric   Unknown,
41*0b57cec5SDimitry Andric   Lines,
42*0b57cec5SDimitry Andric   FileChecksums,
43*0b57cec5SDimitry Andric   InlineeLines,
44*0b57cec5SDimitry Andric   CrossScopeImports,
45*0b57cec5SDimitry Andric   CrossScopeExports,
46*0b57cec5SDimitry Andric   StringTable,
47*0b57cec5SDimitry Andric   Symbols,
48*0b57cec5SDimitry Andric   FrameData,
49*0b57cec5SDimitry Andric   CoffSymbolRVAs,
50*0b57cec5SDimitry Andric   All
51*0b57cec5SDimitry Andric };
52*0b57cec5SDimitry Andric 
53*0b57cec5SDimitry Andric namespace pretty {
54*0b57cec5SDimitry Andric 
55*0b57cec5SDimitry Andric enum class ClassDefinitionFormat { None, Layout, All };
56*0b57cec5SDimitry Andric enum class ClassSortMode {
57*0b57cec5SDimitry Andric   None,
58*0b57cec5SDimitry Andric   Name,
59*0b57cec5SDimitry Andric   Size,
60*0b57cec5SDimitry Andric   Padding,
61*0b57cec5SDimitry Andric   PaddingPct,
62*0b57cec5SDimitry Andric   PaddingImmediate,
63*0b57cec5SDimitry Andric   PaddingPctImmediate
64*0b57cec5SDimitry Andric };
65*0b57cec5SDimitry Andric 
66*0b57cec5SDimitry Andric enum class SymbolSortMode { None, Name, Size };
67*0b57cec5SDimitry Andric 
68*0b57cec5SDimitry Andric enum class SymLevel { Functions, Data, Thunks, All };
69*0b57cec5SDimitry Andric 
70*0b57cec5SDimitry Andric bool shouldDumpSymLevel(SymLevel Level);
71*0b57cec5SDimitry Andric bool compareFunctionSymbols(
72*0b57cec5SDimitry Andric     const std::unique_ptr<llvm::pdb::PDBSymbolFunc> &F1,
73*0b57cec5SDimitry Andric     const std::unique_ptr<llvm::pdb::PDBSymbolFunc> &F2);
74*0b57cec5SDimitry Andric bool compareDataSymbols(const std::unique_ptr<llvm::pdb::PDBSymbolData> &F1,
75*0b57cec5SDimitry Andric                         const std::unique_ptr<llvm::pdb::PDBSymbolData> &F2);
76*0b57cec5SDimitry Andric 
77*0b57cec5SDimitry Andric extern llvm::cl::list<std::string> WithName;
78*0b57cec5SDimitry Andric 
79*0b57cec5SDimitry Andric extern llvm::cl::opt<bool> Compilands;
80*0b57cec5SDimitry Andric extern llvm::cl::opt<bool> Symbols;
81*0b57cec5SDimitry Andric extern llvm::cl::opt<bool> Globals;
82*0b57cec5SDimitry Andric extern llvm::cl::opt<bool> Classes;
83*0b57cec5SDimitry Andric extern llvm::cl::opt<bool> Enums;
84*0b57cec5SDimitry Andric extern llvm::cl::opt<bool> Funcsigs;
85*0b57cec5SDimitry Andric extern llvm::cl::opt<bool> Arrays;
86*0b57cec5SDimitry Andric extern llvm::cl::opt<bool> Typedefs;
87*0b57cec5SDimitry Andric extern llvm::cl::opt<bool> Pointers;
88*0b57cec5SDimitry Andric extern llvm::cl::opt<bool> VTShapes;
89*0b57cec5SDimitry Andric extern llvm::cl::opt<bool> All;
90*0b57cec5SDimitry Andric extern llvm::cl::opt<bool> ExcludeCompilerGenerated;
91*0b57cec5SDimitry Andric 
92*0b57cec5SDimitry Andric extern llvm::cl::opt<bool> NoEnumDefs;
93*0b57cec5SDimitry Andric extern llvm::cl::list<std::string> ExcludeTypes;
94*0b57cec5SDimitry Andric extern llvm::cl::list<std::string> ExcludeSymbols;
95*0b57cec5SDimitry Andric extern llvm::cl::list<std::string> ExcludeCompilands;
96*0b57cec5SDimitry Andric extern llvm::cl::list<std::string> IncludeTypes;
97*0b57cec5SDimitry Andric extern llvm::cl::list<std::string> IncludeSymbols;
98*0b57cec5SDimitry Andric extern llvm::cl::list<std::string> IncludeCompilands;
99*0b57cec5SDimitry Andric extern llvm::cl::opt<SymbolSortMode> SymbolOrder;
100*0b57cec5SDimitry Andric extern llvm::cl::opt<ClassSortMode> ClassOrder;
101*0b57cec5SDimitry Andric extern llvm::cl::opt<uint32_t> SizeThreshold;
102*0b57cec5SDimitry Andric extern llvm::cl::opt<uint32_t> PaddingThreshold;
103*0b57cec5SDimitry Andric extern llvm::cl::opt<uint32_t> ImmediatePaddingThreshold;
104*0b57cec5SDimitry Andric extern llvm::cl::opt<ClassDefinitionFormat> ClassFormat;
105*0b57cec5SDimitry Andric extern llvm::cl::opt<uint32_t> ClassRecursionDepth;
106*0b57cec5SDimitry Andric }
107*0b57cec5SDimitry Andric 
108*0b57cec5SDimitry Andric namespace bytes {
109*0b57cec5SDimitry Andric struct NumberRange {
110*0b57cec5SDimitry Andric   uint64_t Min;
111*0b57cec5SDimitry Andric   llvm::Optional<uint64_t> Max;
112*0b57cec5SDimitry Andric };
113*0b57cec5SDimitry Andric 
114*0b57cec5SDimitry Andric extern llvm::Optional<NumberRange> DumpBlockRange;
115*0b57cec5SDimitry Andric extern llvm::Optional<NumberRange> DumpByteRange;
116*0b57cec5SDimitry Andric extern llvm::cl::list<std::string> DumpStreamData;
117*0b57cec5SDimitry Andric extern llvm::cl::opt<bool> NameMap;
118*0b57cec5SDimitry Andric extern llvm::cl::opt<bool> Fpm;
119*0b57cec5SDimitry Andric 
120*0b57cec5SDimitry Andric extern llvm::cl::opt<bool> SectionContributions;
121*0b57cec5SDimitry Andric extern llvm::cl::opt<bool> SectionMap;
122*0b57cec5SDimitry Andric extern llvm::cl::opt<bool> ModuleInfos;
123*0b57cec5SDimitry Andric extern llvm::cl::opt<bool> FileInfo;
124*0b57cec5SDimitry Andric extern llvm::cl::opt<bool> TypeServerMap;
125*0b57cec5SDimitry Andric extern llvm::cl::opt<bool> ECData;
126*0b57cec5SDimitry Andric 
127*0b57cec5SDimitry Andric extern llvm::cl::list<uint32_t> TypeIndex;
128*0b57cec5SDimitry Andric extern llvm::cl::list<uint32_t> IdIndex;
129*0b57cec5SDimitry Andric 
130*0b57cec5SDimitry Andric extern llvm::cl::opt<uint32_t> ModuleIndex;
131*0b57cec5SDimitry Andric extern llvm::cl::opt<bool> ModuleSyms;
132*0b57cec5SDimitry Andric extern llvm::cl::opt<bool> ModuleC11;
133*0b57cec5SDimitry Andric extern llvm::cl::opt<bool> ModuleC13;
134*0b57cec5SDimitry Andric extern llvm::cl::opt<bool> SplitChunks;
135*0b57cec5SDimitry Andric } // namespace bytes
136*0b57cec5SDimitry Andric 
137*0b57cec5SDimitry Andric namespace dump {
138*0b57cec5SDimitry Andric 
139*0b57cec5SDimitry Andric extern llvm::cl::opt<bool> DumpSummary;
140*0b57cec5SDimitry Andric extern llvm::cl::opt<bool> DumpFpm;
141*0b57cec5SDimitry Andric extern llvm::cl::opt<bool> DumpStreams;
142*0b57cec5SDimitry Andric extern llvm::cl::opt<bool> DumpSymbolStats;
143*0b57cec5SDimitry Andric extern llvm::cl::opt<bool> DumpTypeStats;
144*0b57cec5SDimitry Andric extern llvm::cl::opt<bool> DumpUdtStats;
145*0b57cec5SDimitry Andric extern llvm::cl::opt<bool> DumpStreamBlocks;
146*0b57cec5SDimitry Andric 
147*0b57cec5SDimitry Andric extern llvm::cl::opt<bool> DumpLines;
148*0b57cec5SDimitry Andric extern llvm::cl::opt<bool> DumpInlineeLines;
149*0b57cec5SDimitry Andric extern llvm::cl::opt<bool> DumpXmi;
150*0b57cec5SDimitry Andric extern llvm::cl::opt<bool> DumpXme;
151*0b57cec5SDimitry Andric extern llvm::cl::opt<bool> DumpNamedStreams;
152*0b57cec5SDimitry Andric extern llvm::cl::opt<bool> DumpStringTable;
153*0b57cec5SDimitry Andric extern llvm::cl::opt<bool> DumpStringTableDetails;
154*0b57cec5SDimitry Andric extern llvm::cl::opt<bool> DumpTypes;
155*0b57cec5SDimitry Andric extern llvm::cl::opt<bool> DumpTypeData;
156*0b57cec5SDimitry Andric extern llvm::cl::opt<bool> DumpTypeExtras;
157*0b57cec5SDimitry Andric extern llvm::cl::list<uint32_t> DumpTypeIndex;
158*0b57cec5SDimitry Andric extern llvm::cl::opt<bool> DumpTypeDependents;
159*0b57cec5SDimitry Andric extern llvm::cl::opt<bool> DumpTypeRefStats;
160*0b57cec5SDimitry Andric extern llvm::cl::opt<bool> DumpSectionHeaders;
161*0b57cec5SDimitry Andric 
162*0b57cec5SDimitry Andric extern llvm::cl::opt<bool> DumpIds;
163*0b57cec5SDimitry Andric extern llvm::cl::opt<bool> DumpIdData;
164*0b57cec5SDimitry Andric extern llvm::cl::opt<bool> DumpIdExtras;
165*0b57cec5SDimitry Andric extern llvm::cl::list<uint32_t> DumpIdIndex;
166*0b57cec5SDimitry Andric extern llvm::cl::opt<uint32_t> DumpModi;
167*0b57cec5SDimitry Andric extern llvm::cl::opt<bool> JustMyCode;
168*0b57cec5SDimitry Andric extern llvm::cl::opt<bool> DontResolveForwardRefs;
169*0b57cec5SDimitry Andric extern llvm::cl::opt<bool> DumpSymbols;
170*0b57cec5SDimitry Andric extern llvm::cl::opt<bool> DumpSymRecordBytes;
171*0b57cec5SDimitry Andric extern llvm::cl::opt<bool> DumpGSIRecords;
172*0b57cec5SDimitry Andric extern llvm::cl::opt<bool> DumpGlobals;
173*0b57cec5SDimitry Andric extern llvm::cl::list<std::string> DumpGlobalNames;
174*0b57cec5SDimitry Andric extern llvm::cl::opt<bool> DumpGlobalExtras;
175*0b57cec5SDimitry Andric extern llvm::cl::opt<bool> DumpPublics;
176*0b57cec5SDimitry Andric extern llvm::cl::opt<bool> DumpPublicExtras;
177*0b57cec5SDimitry Andric extern llvm::cl::opt<bool> DumpSectionContribs;
178*0b57cec5SDimitry Andric extern llvm::cl::opt<bool> DumpSectionMap;
179*0b57cec5SDimitry Andric extern llvm::cl::opt<bool> DumpModules;
180*0b57cec5SDimitry Andric extern llvm::cl::opt<bool> DumpModuleFiles;
181*0b57cec5SDimitry Andric extern llvm::cl::opt<bool> DumpFpo;
182*0b57cec5SDimitry Andric extern llvm::cl::opt<bool> RawAll;
183*0b57cec5SDimitry Andric }
184*0b57cec5SDimitry Andric 
185*0b57cec5SDimitry Andric namespace pdb2yaml {
186*0b57cec5SDimitry Andric extern llvm::cl::opt<bool> All;
187*0b57cec5SDimitry Andric extern llvm::cl::opt<bool> NoFileHeaders;
188*0b57cec5SDimitry Andric extern llvm::cl::opt<bool> Minimal;
189*0b57cec5SDimitry Andric extern llvm::cl::opt<bool> StreamMetadata;
190*0b57cec5SDimitry Andric extern llvm::cl::opt<bool> StreamDirectory;
191*0b57cec5SDimitry Andric extern llvm::cl::opt<bool> StringTable;
192*0b57cec5SDimitry Andric extern llvm::cl::opt<bool> PdbStream;
193*0b57cec5SDimitry Andric extern llvm::cl::opt<bool> DbiStream;
194*0b57cec5SDimitry Andric extern llvm::cl::opt<bool> TpiStream;
195*0b57cec5SDimitry Andric extern llvm::cl::opt<bool> IpiStream;
196*0b57cec5SDimitry Andric extern llvm::cl::opt<bool> PublicsStream;
197*0b57cec5SDimitry Andric extern llvm::cl::list<std::string> InputFilename;
198*0b57cec5SDimitry Andric extern llvm::cl::opt<bool> DumpModules;
199*0b57cec5SDimitry Andric extern llvm::cl::opt<bool> DumpModuleFiles;
200*0b57cec5SDimitry Andric extern llvm::cl::list<ModuleSubsection> DumpModuleSubsections;
201*0b57cec5SDimitry Andric extern llvm::cl::opt<bool> DumpModuleSyms;
202*0b57cec5SDimitry Andric } // namespace pdb2yaml
203*0b57cec5SDimitry Andric 
204*0b57cec5SDimitry Andric namespace explain {
205*0b57cec5SDimitry Andric enum class InputFileType { PDBFile, PDBStream, DBIStream, Names, ModuleStream };
206*0b57cec5SDimitry Andric 
207*0b57cec5SDimitry Andric extern llvm::cl::list<std::string> InputFilename;
208*0b57cec5SDimitry Andric extern llvm::cl::list<uint64_t> Offsets;
209*0b57cec5SDimitry Andric extern llvm::cl::opt<InputFileType> InputType;
210*0b57cec5SDimitry Andric } // namespace explain
211*0b57cec5SDimitry Andric 
212*0b57cec5SDimitry Andric namespace exportstream {
213*0b57cec5SDimitry Andric extern llvm::cl::opt<std::string> OutputFile;
214*0b57cec5SDimitry Andric extern llvm::cl::opt<std::string> Stream;
215*0b57cec5SDimitry Andric extern llvm::cl::opt<bool> ForceName;
216*0b57cec5SDimitry Andric } // namespace exportstream
217*0b57cec5SDimitry Andric }
218*0b57cec5SDimitry Andric 
219*0b57cec5SDimitry Andric #endif
220