1319780Sdim//===- llvm-pdbutil.h ----------------------------------------- *- C++ --*-===//
2319780Sdim//
3353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4353358Sdim// See https://llvm.org/LICENSE.txt for license information.
5353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6319780Sdim//
7319780Sdim//===----------------------------------------------------------------------===//
8319780Sdim
9319780Sdim#ifndef LLVM_TOOLS_LLVMPDBDUMP_LLVMPDBDUMP_H
10319780Sdim#define LLVM_TOOLS_LLVMPDBDUMP_LLVMPDBDUMP_H
11319780Sdim
12327952Sdim#include "llvm/ADT/DenseMap.h"
13319780Sdim#include "llvm/ADT/Optional.h"
14327952Sdim#include "llvm/ADT/PointerUnion.h"
15319780Sdim#include "llvm/Support/CommandLine.h"
16319780Sdim#include "llvm/Support/raw_ostream.h"
17319780Sdim
18319780Sdim#include <memory>
19319780Sdim#include <stdint.h>
20319780Sdim
21319780Sdimnamespace llvm {
22327952Sdimnamespace object {
23327952Sdimclass COFFObjectFile;
24327952Sdim}
25319780Sdimnamespace pdb {
26319780Sdimclass PDBSymbolData;
27319780Sdimclass PDBSymbolFunc;
28327952Sdimclass PDBFile;
29319780Sdimuint32_t getTypeLength(const PDBSymbolData &Symbol);
30319780Sdim}
31327952Sdimtypedef llvm::PointerUnion<object::COFFObjectFile *, pdb::PDBFile *>
32327952Sdim    PdbOrCoffObj;
33319780Sdim}
34319780Sdim
35319780Sdimnamespace opts {
36319780Sdim
37320041Sdimenum class DumpLevel { None, Basic, Verbose };
38320041Sdim
39319780Sdimenum class ModuleSubsection {
40319780Sdim  Unknown,
41319780Sdim  Lines,
42319780Sdim  FileChecksums,
43319780Sdim  InlineeLines,
44319780Sdim  CrossScopeImports,
45319780Sdim  CrossScopeExports,
46319780Sdim  StringTable,
47319780Sdim  Symbols,
48319780Sdim  FrameData,
49319780Sdim  CoffSymbolRVAs,
50319780Sdim  All
51319780Sdim};
52319780Sdim
53319780Sdimnamespace pretty {
54319780Sdim
55319780Sdimenum class ClassDefinitionFormat { None, Layout, All };
56319780Sdimenum class ClassSortMode {
57319780Sdim  None,
58319780Sdim  Name,
59319780Sdim  Size,
60319780Sdim  Padding,
61319780Sdim  PaddingPct,
62319780Sdim  PaddingImmediate,
63319780Sdim  PaddingPctImmediate
64319780Sdim};
65319780Sdim
66319780Sdimenum class SymbolSortMode { None, Name, Size };
67319780Sdim
68319780Sdimenum class SymLevel { Functions, Data, Thunks, All };
69319780Sdim
70319780Sdimbool shouldDumpSymLevel(SymLevel Level);
71319780Sdimbool compareFunctionSymbols(
72319780Sdim    const std::unique_ptr<llvm::pdb::PDBSymbolFunc> &F1,
73319780Sdim    const std::unique_ptr<llvm::pdb::PDBSymbolFunc> &F2);
74319780Sdimbool compareDataSymbols(const std::unique_ptr<llvm::pdb::PDBSymbolData> &F1,
75319780Sdim                        const std::unique_ptr<llvm::pdb::PDBSymbolData> &F2);
76319780Sdim
77341825Sdimextern llvm::cl::list<std::string> WithName;
78341825Sdim
79319780Sdimextern llvm::cl::opt<bool> Compilands;
80319780Sdimextern llvm::cl::opt<bool> Symbols;
81319780Sdimextern llvm::cl::opt<bool> Globals;
82319780Sdimextern llvm::cl::opt<bool> Classes;
83319780Sdimextern llvm::cl::opt<bool> Enums;
84344779Sdimextern llvm::cl::opt<bool> Funcsigs;
85344779Sdimextern llvm::cl::opt<bool> Arrays;
86319780Sdimextern llvm::cl::opt<bool> Typedefs;
87344779Sdimextern llvm::cl::opt<bool> Pointers;
88344779Sdimextern llvm::cl::opt<bool> VTShapes;
89319780Sdimextern llvm::cl::opt<bool> All;
90319780Sdimextern llvm::cl::opt<bool> ExcludeCompilerGenerated;
91319780Sdim
92319780Sdimextern llvm::cl::opt<bool> NoEnumDefs;
93319780Sdimextern llvm::cl::list<std::string> ExcludeTypes;
94319780Sdimextern llvm::cl::list<std::string> ExcludeSymbols;
95319780Sdimextern llvm::cl::list<std::string> ExcludeCompilands;
96319780Sdimextern llvm::cl::list<std::string> IncludeTypes;
97319780Sdimextern llvm::cl::list<std::string> IncludeSymbols;
98319780Sdimextern llvm::cl::list<std::string> IncludeCompilands;
99319780Sdimextern llvm::cl::opt<SymbolSortMode> SymbolOrder;
100319780Sdimextern llvm::cl::opt<ClassSortMode> ClassOrder;
101319780Sdimextern llvm::cl::opt<uint32_t> SizeThreshold;
102319780Sdimextern llvm::cl::opt<uint32_t> PaddingThreshold;
103319780Sdimextern llvm::cl::opt<uint32_t> ImmediatePaddingThreshold;
104319780Sdimextern llvm::cl::opt<ClassDefinitionFormat> ClassFormat;
105319780Sdimextern llvm::cl::opt<uint32_t> ClassRecursionDepth;
106319780Sdim}
107319780Sdim
108320397Sdimnamespace bytes {
109320397Sdimstruct NumberRange {
110320397Sdim  uint64_t Min;
111320397Sdim  llvm::Optional<uint64_t> Max;
112319780Sdim};
113319780Sdim
114320397Sdimextern llvm::Optional<NumberRange> DumpBlockRange;
115320397Sdimextern llvm::Optional<NumberRange> DumpByteRange;
116320397Sdimextern llvm::cl::list<std::string> DumpStreamData;
117320397Sdimextern llvm::cl::opt<bool> NameMap;
118327952Sdimextern llvm::cl::opt<bool> Fpm;
119320397Sdim
120320397Sdimextern llvm::cl::opt<bool> SectionContributions;
121320397Sdimextern llvm::cl::opt<bool> SectionMap;
122320397Sdimextern llvm::cl::opt<bool> ModuleInfos;
123320397Sdimextern llvm::cl::opt<bool> FileInfo;
124320397Sdimextern llvm::cl::opt<bool> TypeServerMap;
125320397Sdimextern llvm::cl::opt<bool> ECData;
126320397Sdim
127320397Sdimextern llvm::cl::list<uint32_t> TypeIndex;
128320397Sdimextern llvm::cl::list<uint32_t> IdIndex;
129320397Sdim
130320397Sdimextern llvm::cl::opt<uint32_t> ModuleIndex;
131320397Sdimextern llvm::cl::opt<bool> ModuleSyms;
132320397Sdimextern llvm::cl::opt<bool> ModuleC11;
133320397Sdimextern llvm::cl::opt<bool> ModuleC13;
134320397Sdimextern llvm::cl::opt<bool> SplitChunks;
135320397Sdim} // namespace bytes
136320397Sdim
137320397Sdimnamespace dump {
138320397Sdim
139320041Sdimextern llvm::cl::opt<bool> DumpSummary;
140327952Sdimextern llvm::cl::opt<bool> DumpFpm;
141320041Sdimextern llvm::cl::opt<bool> DumpStreams;
142327952Sdimextern llvm::cl::opt<bool> DumpSymbolStats;
143353358Sdimextern llvm::cl::opt<bool> DumpTypeStats;
144327952Sdimextern llvm::cl::opt<bool> DumpUdtStats;
145320397Sdimextern llvm::cl::opt<bool> DumpStreamBlocks;
146319780Sdim
147320041Sdimextern llvm::cl::opt<bool> DumpLines;
148320041Sdimextern llvm::cl::opt<bool> DumpInlineeLines;
149320041Sdimextern llvm::cl::opt<bool> DumpXmi;
150320041Sdimextern llvm::cl::opt<bool> DumpXme;
151341825Sdimextern llvm::cl::opt<bool> DumpNamedStreams;
152320041Sdimextern llvm::cl::opt<bool> DumpStringTable;
153341825Sdimextern llvm::cl::opt<bool> DumpStringTableDetails;
154320041Sdimextern llvm::cl::opt<bool> DumpTypes;
155320041Sdimextern llvm::cl::opt<bool> DumpTypeData;
156320041Sdimextern llvm::cl::opt<bool> DumpTypeExtras;
157320397Sdimextern llvm::cl::list<uint32_t> DumpTypeIndex;
158320572Sdimextern llvm::cl::opt<bool> DumpTypeDependents;
159353358Sdimextern llvm::cl::opt<bool> DumpTypeRefStats;
160327952Sdimextern llvm::cl::opt<bool> DumpSectionHeaders;
161320397Sdim
162320041Sdimextern llvm::cl::opt<bool> DumpIds;
163320041Sdimextern llvm::cl::opt<bool> DumpIdData;
164320041Sdimextern llvm::cl::opt<bool> DumpIdExtras;
165320397Sdimextern llvm::cl::list<uint32_t> DumpIdIndex;
166327952Sdimextern llvm::cl::opt<uint32_t> DumpModi;
167327952Sdimextern llvm::cl::opt<bool> JustMyCode;
168344779Sdimextern llvm::cl::opt<bool> DontResolveForwardRefs;
169320041Sdimextern llvm::cl::opt<bool> DumpSymbols;
170320041Sdimextern llvm::cl::opt<bool> DumpSymRecordBytes;
171341825Sdimextern llvm::cl::opt<bool> DumpGSIRecords;
172327952Sdimextern llvm::cl::opt<bool> DumpGlobals;
173344779Sdimextern llvm::cl::list<std::string> DumpGlobalNames;
174327952Sdimextern llvm::cl::opt<bool> DumpGlobalExtras;
175319780Sdimextern llvm::cl::opt<bool> DumpPublics;
176327952Sdimextern llvm::cl::opt<bool> DumpPublicExtras;
177319780Sdimextern llvm::cl::opt<bool> DumpSectionContribs;
178319780Sdimextern llvm::cl::opt<bool> DumpSectionMap;
179320041Sdimextern llvm::cl::opt<bool> DumpModules;
180320041Sdimextern llvm::cl::opt<bool> DumpModuleFiles;
181344779Sdimextern llvm::cl::opt<bool> DumpFpo;
182320041Sdimextern llvm::cl::opt<bool> RawAll;
183319780Sdim}
184319780Sdim
185319780Sdimnamespace pdb2yaml {
186319780Sdimextern llvm::cl::opt<bool> All;
187319780Sdimextern llvm::cl::opt<bool> NoFileHeaders;
188319780Sdimextern llvm::cl::opt<bool> Minimal;
189319780Sdimextern llvm::cl::opt<bool> StreamMetadata;
190319780Sdimextern llvm::cl::opt<bool> StreamDirectory;
191319780Sdimextern llvm::cl::opt<bool> StringTable;
192319780Sdimextern llvm::cl::opt<bool> PdbStream;
193319780Sdimextern llvm::cl::opt<bool> DbiStream;
194319780Sdimextern llvm::cl::opt<bool> TpiStream;
195319780Sdimextern llvm::cl::opt<bool> IpiStream;
196344779Sdimextern llvm::cl::opt<bool> PublicsStream;
197319780Sdimextern llvm::cl::list<std::string> InputFilename;
198319780Sdimextern llvm::cl::opt<bool> DumpModules;
199319780Sdimextern llvm::cl::opt<bool> DumpModuleFiles;
200319780Sdimextern llvm::cl::list<ModuleSubsection> DumpModuleSubsections;
201319780Sdimextern llvm::cl::opt<bool> DumpModuleSyms;
202320041Sdim} // namespace pdb2yaml
203320970Sdim
204341825Sdimnamespace explain {
205341825Sdimenum class InputFileType { PDBFile, PDBStream, DBIStream, Names, ModuleStream };
206341825Sdim
207341825Sdimextern llvm::cl::list<std::string> InputFilename;
208341825Sdimextern llvm::cl::list<uint64_t> Offsets;
209341825Sdimextern llvm::cl::opt<InputFileType> InputType;
210341825Sdim} // namespace explain
211341825Sdim
212341825Sdimnamespace exportstream {
213341825Sdimextern llvm::cl::opt<std::string> OutputFile;
214341825Sdimextern llvm::cl::opt<std::string> Stream;
215341825Sdimextern llvm::cl::opt<bool> ForceName;
216341825Sdim} // namespace exportstream
217319780Sdim}
218319780Sdim
219319780Sdim#endif
220