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