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