summaryrefslogtreecommitdiffstats
path: root/llvm/tools/llvm-pdbdump
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/tools/llvm-pdbdump')
-rw-r--r--llvm/tools/llvm-pdbdump/Analyze.cpp152
-rw-r--r--llvm/tools/llvm-pdbdump/Analyze.h30
-rw-r--r--llvm/tools/llvm-pdbdump/CMakeLists.txt34
-rw-r--r--llvm/tools/llvm-pdbdump/CompactTypeDumpVisitor.cpp59
-rw-r--r--llvm/tools/llvm-pdbdump/CompactTypeDumpVisitor.h49
-rw-r--r--llvm/tools/llvm-pdbdump/Diff.cpp537
-rw-r--r--llvm/tools/llvm-pdbdump/Diff.h45
-rw-r--r--llvm/tools/llvm-pdbdump/LLVMBuild.txt23
-rw-r--r--llvm/tools/llvm-pdbdump/LLVMOutputStyle.cpp1177
-rw-r--r--llvm/tools/llvm-pdbdump/LLVMOutputStyle.h70
-rw-r--r--llvm/tools/llvm-pdbdump/LinePrinter.cpp145
-rw-r--r--llvm/tools/llvm-pdbdump/LinePrinter.h102
-rw-r--r--llvm/tools/llvm-pdbdump/OutputStyle.h28
-rw-r--r--llvm/tools/llvm-pdbdump/PdbYaml.cpp227
-rw-r--r--llvm/tools/llvm-pdbdump/PdbYaml.h125
-rw-r--r--llvm/tools/llvm-pdbdump/PrettyBuiltinDumper.cpp94
-rw-r--r--llvm/tools/llvm-pdbdump/PrettyBuiltinDumper.h35
-rw-r--r--llvm/tools/llvm-pdbdump/PrettyClassDefinitionDumper.cpp108
-rw-r--r--llvm/tools/llvm-pdbdump/PrettyClassDefinitionDumper.h47
-rw-r--r--llvm/tools/llvm-pdbdump/PrettyClassLayoutGraphicalDumper.cpp216
-rw-r--r--llvm/tools/llvm-pdbdump/PrettyClassLayoutGraphicalDumper.h58
-rw-r--r--llvm/tools/llvm-pdbdump/PrettyCompilandDumper.cpp207
-rw-r--r--llvm/tools/llvm-pdbdump/PrettyCompilandDumper.h44
-rw-r--r--llvm/tools/llvm-pdbdump/PrettyEnumDumper.cpp53
-rw-r--r--llvm/tools/llvm-pdbdump/PrettyEnumDumper.h31
-rw-r--r--llvm/tools/llvm-pdbdump/PrettyExternalSymbolDumper.cpp41
-rw-r--r--llvm/tools/llvm-pdbdump/PrettyExternalSymbolDumper.h34
-rw-r--r--llvm/tools/llvm-pdbdump/PrettyFunctionDumper.cpp259
-rw-r--r--llvm/tools/llvm-pdbdump/PrettyFunctionDumper.h43
-rw-r--r--llvm/tools/llvm-pdbdump/PrettyTypeDumper.cpp255
-rw-r--r--llvm/tools/llvm-pdbdump/PrettyTypeDumper.h36
-rw-r--r--llvm/tools/llvm-pdbdump/PrettyTypedefDumper.cpp77
-rw-r--r--llvm/tools/llvm-pdbdump/PrettyTypedefDumper.h39
-rw-r--r--llvm/tools/llvm-pdbdump/PrettyVariableDumper.cpp220
-rw-r--r--llvm/tools/llvm-pdbdump/PrettyVariableDumper.h50
-rw-r--r--llvm/tools/llvm-pdbdump/StreamUtil.cpp139
-rw-r--r--llvm/tools/llvm-pdbdump/StreamUtil.h25
-rw-r--r--llvm/tools/llvm-pdbdump/YAMLOutputStyle.cpp317
-rw-r--r--llvm/tools/llvm-pdbdump/YAMLOutputStyle.h49
-rw-r--r--llvm/tools/llvm-pdbdump/fuzzer/CMakeLists.txt15
-rw-r--r--llvm/tools/llvm-pdbdump/fuzzer/llvm-pdbdump-fuzzer.cpp105
-rw-r--r--llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp1023
-rw-r--r--llvm/tools/llvm-pdbdump/llvm-pdbdump.h156
43 files changed, 0 insertions, 6579 deletions
diff --git a/llvm/tools/llvm-pdbdump/Analyze.cpp b/llvm/tools/llvm-pdbdump/Analyze.cpp
deleted file mode 100644
index b503cdcbf1e..00000000000
--- a/llvm/tools/llvm-pdbdump/Analyze.cpp
+++ /dev/null
@@ -1,152 +0,0 @@
-//===- Analyze.cpp - PDB analysis functions ---------------------*- C++ -*-===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#include "Analyze.h"
-
-#include "llvm/ADT/DenseSet.h"
-#include "llvm/ADT/STLExtras.h"
-#include "llvm/DebugInfo/CodeView/CVTypeVisitor.h"
-#include "llvm/DebugInfo/CodeView/TypeDatabase.h"
-#include "llvm/DebugInfo/CodeView/TypeDatabaseVisitor.h"
-#include "llvm/DebugInfo/CodeView/TypeRecord.h"
-#include "llvm/DebugInfo/CodeView/TypeVisitorCallbackPipeline.h"
-#include "llvm/DebugInfo/CodeView/TypeVisitorCallbacks.h"
-#include "llvm/DebugInfo/PDB/Native/PDBFile.h"
-#include "llvm/DebugInfo/PDB/Native/RawError.h"
-#include "llvm/DebugInfo/PDB/Native/TpiStream.h"
-
-#include "llvm/Support/FormatVariadic.h"
-#include "llvm/Support/raw_ostream.h"
-
-#include <list>
-
-using namespace llvm;
-using namespace llvm::codeview;
-using namespace llvm::pdb;
-
-static StringRef getLeafTypeName(TypeLeafKind LT) {
- switch (LT) {
-#define TYPE_RECORD(ename, value, name) \
- case ename: \
- return #name;
-#include "llvm/DebugInfo/CodeView/CodeViewTypes.def"
- default:
- break;
- }
- return "UnknownLeaf";
-}
-
-namespace {
-struct HashLookupVisitor : public TypeVisitorCallbacks {
- struct Entry {
- TypeIndex TI;
- CVType Record;
- };
-
- explicit HashLookupVisitor(TpiStream &Tpi) : Tpi(Tpi) {}
-
- Error visitTypeBegin(CVType &Record) override {
- uint32_t H = Tpi.getHashValues()[I];
- Record.Hash = H;
- TypeIndex TI(I + TypeIndex::FirstNonSimpleIndex);
- Lookup[H].push_back(Entry{TI, Record});
- ++I;
- return Error::success();
- }
-
- uint32_t I = 0;
- DenseMap<uint32_t, std::list<Entry>> Lookup;
- TpiStream &Tpi;
-};
-}
-
-AnalysisStyle::AnalysisStyle(PDBFile &File) : File(File) {}
-
-Error AnalysisStyle::dump() {
- auto Tpi = File.getPDBTpiStream();
- if (!Tpi)
- return Tpi.takeError();
-
- TypeDatabase TypeDB(Tpi->getNumTypeRecords());
- TypeDatabaseVisitor DBV(TypeDB);
- TypeVisitorCallbackPipeline Pipeline;
- HashLookupVisitor Hasher(*Tpi);
- // Add them to the database
- Pipeline.addCallbackToPipeline(DBV);
- // Store their hash values
- Pipeline.addCallbackToPipeline(Hasher);
-
- if (auto EC = codeview::visitTypeStream(Tpi->typeArray(), Pipeline))
- return EC;
-
- auto &Adjusters = Tpi->getHashAdjusters();
- DenseSet<uint32_t> AdjusterSet;
- for (const auto &Adj : Adjusters) {
- assert(AdjusterSet.find(Adj.second) == AdjusterSet.end());
- AdjusterSet.insert(Adj.second);
- }
-
- uint32_t Count = 0;
- outs() << "Searching for hash collisions\n";
- for (const auto &H : Hasher.Lookup) {
- if (H.second.size() <= 1)
- continue;
- ++Count;
- outs() << formatv("Hash: {0}, Count: {1} records\n", H.first,
- H.second.size());
- for (const auto &R : H.second) {
- auto Iter = AdjusterSet.find(R.TI.getIndex());
- StringRef Prefix;
- if (Iter != AdjusterSet.end()) {
- Prefix = "[HEAD]";
- AdjusterSet.erase(Iter);
- }
- StringRef LeafName = getLeafTypeName(R.Record.Type);
- uint32_t TI = R.TI.getIndex();
- StringRef TypeName = TypeDB.getTypeName(R.TI);
- outs() << formatv("{0,-6} {1} ({2:x}) {3}\n", Prefix, LeafName, TI,
- TypeName);
- }
- }
-
- outs() << "\n";
- outs() << "Dumping hash adjustment chains\n";
- for (const auto &A : Tpi->getHashAdjusters()) {
- TypeIndex TI(A.second);
- StringRef TypeName = TypeDB.getTypeName(TI);
- const CVType &HeadRecord = TypeDB.getTypeRecord(TI);
- assert(HeadRecord.Hash.hasValue());
-
- auto CollisionsIter = Hasher.Lookup.find(*HeadRecord.Hash);
- if (CollisionsIter == Hasher.Lookup.end())
- continue;
-
- const auto &Collisions = CollisionsIter->second;
- outs() << TypeName << "\n";
- outs() << formatv(" [HEAD] {0:x} {1} {2}\n", A.second,
- getLeafTypeName(HeadRecord.Type), TypeName);
- for (const auto &Chain : Collisions) {
- if (Chain.TI == TI)
- continue;
- const CVType &TailRecord = TypeDB.getTypeRecord(Chain.TI);
- outs() << formatv(" {0:x} {1} {2}\n", Chain.TI.getIndex(),
- getLeafTypeName(TailRecord.Type),
- TypeDB.getTypeName(Chain.TI));
- }
- }
- outs() << formatv("There are {0} orphaned hash adjusters\n",
- AdjusterSet.size());
- for (const auto &Adj : AdjusterSet) {
- outs() << formatv(" {0}\n", Adj);
- }
-
- uint32_t DistinctHashValues = Hasher.Lookup.size();
- outs() << formatv("{0}/{1} hash collisions", Count, DistinctHashValues);
- return Error::success();
-}
diff --git a/llvm/tools/llvm-pdbdump/Analyze.h b/llvm/tools/llvm-pdbdump/Analyze.h
deleted file mode 100644
index 7230ae45b0c..00000000000
--- a/llvm/tools/llvm-pdbdump/Analyze.h
+++ /dev/null
@@ -1,30 +0,0 @@
-//===- Analyze.h - PDB analysis functions -----------------------*- C++ -*-===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef LLVM_TOOLS_LLVMPDBDUMP_ANALYSIS_H
-#define LLVM_TOOLS_LLVMPDBDUMP_ANALYSIS_H
-
-#include "OutputStyle.h"
-
-namespace llvm {
-namespace pdb {
-class PDBFile;
-class AnalysisStyle : public OutputStyle {
-public:
- explicit AnalysisStyle(PDBFile &File);
-
- Error dump() override;
-
-private:
- PDBFile &File;
-};
-}
-}
-
-#endif
diff --git a/llvm/tools/llvm-pdbdump/CMakeLists.txt b/llvm/tools/llvm-pdbdump/CMakeLists.txt
deleted file mode 100644
index 020331e6550..00000000000
--- a/llvm/tools/llvm-pdbdump/CMakeLists.txt
+++ /dev/null
@@ -1,34 +0,0 @@
-set(LLVM_LINK_COMPONENTS
- DebugInfoCodeView
- DebugInfoMSF
- DebugInfoPDB
- Object
- ObjectYAML
- Support
- )
-
-add_llvm_tool(llvm-pdbdump
- Analyze.cpp
- CompactTypeDumpVisitor.cpp
- Diff.cpp
- llvm-pdbdump.cpp
- LinePrinter.cpp
- LLVMOutputStyle.cpp
- PdbYaml.cpp
- PrettyBuiltinDumper.cpp
- PrettyClassDefinitionDumper.cpp
- PrettyClassLayoutGraphicalDumper.cpp
- PrettyCompilandDumper.cpp
- PrettyEnumDumper.cpp
- PrettyExternalSymbolDumper.cpp
- PrettyFunctionDumper.cpp
- PrettyTypeDumper.cpp
- PrettyTypedefDumper.cpp
- PrettyVariableDumper.cpp
- StreamUtil.cpp
- YAMLOutputStyle.cpp
- )
-
-if(LLVM_USE_SANITIZE_COVERAGE)
- add_subdirectory(fuzzer)
-endif()
diff --git a/llvm/tools/llvm-pdbdump/CompactTypeDumpVisitor.cpp b/llvm/tools/llvm-pdbdump/CompactTypeDumpVisitor.cpp
deleted file mode 100644
index 6dd54e0dbec..00000000000
--- a/llvm/tools/llvm-pdbdump/CompactTypeDumpVisitor.cpp
+++ /dev/null
@@ -1,59 +0,0 @@
-//===-- CompactTypeDumpVisitor.cpp - CodeView type info dumper --*- C++ -*-===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#include "CompactTypeDumpVisitor.h"
-#include "llvm/DebugInfo/CodeView/TypeDatabase.h"
-#include "llvm/Support/FormatVariadic.h"
-#include "llvm/Support/ScopedPrinter.h"
-
-using namespace llvm;
-using namespace llvm::codeview;
-using namespace llvm::pdb;
-
-static const EnumEntry<TypeLeafKind> LeafTypeNames[] = {
-#define CV_TYPE(enum, val) {#enum, enum},
-#include "llvm/DebugInfo/CodeView/CodeViewTypes.def"
-};
-
-static StringRef getLeafName(TypeLeafKind K) {
- for (const auto &E : LeafTypeNames) {
- if (E.Value == K)
- return E.Name;
- }
- return StringRef();
-}
-
-CompactTypeDumpVisitor::CompactTypeDumpVisitor(TypeCollection &Types,
- ScopedPrinter *W)
- : CompactTypeDumpVisitor(Types, TypeIndex(TypeIndex::FirstNonSimpleIndex),
- W) {}
-
-CompactTypeDumpVisitor::CompactTypeDumpVisitor(TypeCollection &Types,
- TypeIndex FirstTI,
- ScopedPrinter *W)
- : W(W), TI(FirstTI), Offset(0), Types(Types) {}
-
-Error CompactTypeDumpVisitor::visitTypeBegin(CVType &Record) {
- return Error::success();
-}
-
-Error CompactTypeDumpVisitor::visitTypeEnd(CVType &Record) {
- uint32_t I = TI.getIndex();
- StringRef Leaf = getLeafName(Record.Type);
- StringRef Name = Types.getTypeName(TI);
- W->printString(
- llvm::formatv("Index: {0:x} ({1:N} bytes, offset {2:N}) {3} \"{4}\"", I,
- Record.length(), Offset, Leaf, Name)
- .str());
-
- Offset += Record.length();
- TI.setIndex(TI.getIndex() + 1);
-
- return Error::success();
-}
diff --git a/llvm/tools/llvm-pdbdump/CompactTypeDumpVisitor.h b/llvm/tools/llvm-pdbdump/CompactTypeDumpVisitor.h
deleted file mode 100644
index 41ccea0c2e9..00000000000
--- a/llvm/tools/llvm-pdbdump/CompactTypeDumpVisitor.h
+++ /dev/null
@@ -1,49 +0,0 @@
-//===-- CompactTypeDumpVisitor.h - CodeView type info dumper ----*- C++ -*-===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef LLVM_DEBUGINFO_CODEVIEW_COMPACTTYPEDUMPVISITOR_H
-#define LLVM_DEBUGINFO_CODEVIEW_COMPACTTYPEDUMPVISITOR_H
-
-#include "llvm/DebugInfo/CodeView/TypeIndex.h"
-#include "llvm/DebugInfo/CodeView/TypeRecord.h"
-#include "llvm/DebugInfo/CodeView/TypeVisitorCallbacks.h"
-
-namespace llvm {
-class ScopedPrinter;
-namespace codeview {
-class TypeCollection;
-}
-
-namespace pdb {
-
-/// Dumper for CodeView type streams found in COFF object files and PDB files.
-/// Dumps records on a single line, and ignores member records.
-class CompactTypeDumpVisitor : public codeview::TypeVisitorCallbacks {
-public:
- CompactTypeDumpVisitor(codeview::TypeCollection &Types, ScopedPrinter *W);
- CompactTypeDumpVisitor(codeview::TypeCollection &Types,
- codeview::TypeIndex FirstTI, ScopedPrinter *W);
-
- /// Paired begin/end actions for all types. Receives all record data,
- /// including the fixed-length record prefix.
- Error visitTypeBegin(codeview::CVType &Record) override;
- Error visitTypeEnd(codeview::CVType &Record) override;
-
-private:
- ScopedPrinter *W;
-
- codeview::TypeIndex TI;
- uint32_t Offset;
- codeview::TypeCollection &Types;
-};
-
-} // end namespace pdb
-} // end namespace llvm
-
-#endif
diff --git a/llvm/tools/llvm-pdbdump/Diff.cpp b/llvm/tools/llvm-pdbdump/Diff.cpp
deleted file mode 100644
index 418c2361ac3..00000000000
--- a/llvm/tools/llvm-pdbdump/Diff.cpp
+++ /dev/null
@@ -1,537 +0,0 @@
-//===- Diff.cpp - PDB diff utility ------------------------------*- C++ -*-===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#include "Diff.h"
-
-#include "StreamUtil.h"
-#include "llvm-pdbdump.h"
-
-#include "llvm/DebugInfo/PDB/Native/Formatters.h"
-#include "llvm/DebugInfo/PDB/Native/InfoStream.h"
-#include "llvm/DebugInfo/PDB/Native/PDBFile.h"
-#include "llvm/DebugInfo/PDB/Native/PDBStringTable.h"
-#include "llvm/DebugInfo/PDB/Native/RawConstants.h"
-
-#include "llvm/Support/FormatAdapters.h"
-#include "llvm/Support/FormatProviders.h"
-#include "llvm/Support/FormatVariadic.h"
-
-using namespace llvm;
-using namespace llvm::pdb;
-
-namespace llvm {
-template <> struct format_provider<PdbRaw_FeatureSig> {
- static void format(const PdbRaw_FeatureSig &Sig, raw_ostream &Stream,
- StringRef Style) {
- switch (Sig) {
- case PdbRaw_FeatureSig::MinimalDebugInfo:
- Stream << "MinimalDebugInfo";
- break;
- case PdbRaw_FeatureSig::NoTypeMerge:
- Stream << "NoTypeMerge";
- break;
- case PdbRaw_FeatureSig::VC110:
- Stream << "VC110";
- break;
- case PdbRaw_FeatureSig::VC140:
- Stream << "VC140";
- break;
- }
- }
-};
-}
-
-template <typename R> using ValueOfRange = llvm::detail::ValueOfRange<R>;
-
-template <typename Range, typename Comp>
-static void set_differences(Range &&R1, Range &&R2,
- SmallVectorImpl<ValueOfRange<Range>> *OnlyLeft,
- SmallVectorImpl<ValueOfRange<Range>> *OnlyRight,
- SmallVectorImpl<ValueOfRange<Range>> *Intersection,
- Comp Comparator) {
-
- std::sort(R1.begin(), R1.end(), Comparator);
- std::sort(R2.begin(), R2.end(), Comparator);
-
- if (OnlyLeft) {
- OnlyLeft->reserve(R1.size());
- auto End = std::set_difference(R1.begin(), R1.end(), R2.begin(), R2.end(),
- OnlyLeft->begin(), Comparator);
- OnlyLeft->set_size(std::distance(OnlyLeft->begin(), End));
- }
- if (OnlyRight) {
- OnlyLeft->reserve(R2.size());
- auto End = std::set_difference(R2.begin(), R2.end(), R1.begin(), R1.end(),
- OnlyRight->begin(), Comparator);
- OnlyRight->set_size(std::distance(OnlyRight->begin(), End));
- }
- if (Intersection) {
- Intersection->reserve(std::min(R1.size(), R2.size()));
- auto End = std::set_intersection(R1.begin(), R1.end(), R2.begin(), R2.end(),
- Intersection->begin(), Comparator);
- Intersection->set_size(std::distance(Intersection->begin(), End));
- }
-}
-
-template <typename Range>
-static void
-set_differences(Range &&R1, Range &&R2,
- SmallVectorImpl<ValueOfRange<Range>> *OnlyLeft,
- SmallVectorImpl<ValueOfRange<Range>> *OnlyRight,
- SmallVectorImpl<ValueOfRange<Range>> *Intersection = nullptr) {
- std::less<ValueOfRange<Range>> Comp;
- set_differences(std::forward<Range>(R1), std::forward<Range>(R2), OnlyLeft,
- OnlyRight, Intersection, Comp);
-}
-
-DiffStyle::DiffStyle(PDBFile &File1, PDBFile &File2)
- : File1(File1), File2(File2) {}
-
-Error DiffStyle::dump() {
- if (auto EC = diffSuperBlock())
- return EC;
-
- if (auto EC = diffFreePageMap())
- return EC;
-
- if (auto EC = diffStreamDirectory())
- return EC;
-
- if (auto EC = diffStringTable())
- return EC;
-
- if (auto EC = diffInfoStream())
- return EC;
-
- if (auto EC = diffDbiStream())
- return EC;
-
- if (auto EC = diffSectionContribs())
- return EC;
-
- if (auto EC = diffSectionMap())
- return EC;
-
- if (auto EC = diffFpoStream())
- return EC;
-
- if (auto EC = diffTpiStream(StreamTPI))
- return EC;
-
- if (auto EC = diffTpiStream(StreamIPI))
- return EC;
-
- if (auto EC = diffPublics())
- return EC;
-
- if (auto EC = diffGlobals())
- return EC;
-
- return Error::success();
-}
-
-template <typename T>
-static bool diffAndPrint(StringRef Label, PDBFile &File1, PDBFile &File2, T V1,
- T V2) {
- if (V1 == V2) {
- outs() << formatv(" {0}: No differences detected!\n", Label);
- return false;
- }
-
- outs().indent(2) << Label << "\n";
- outs().indent(4) << formatv("{0}: {1}\n", File1.getFilePath(), V1);
- outs().indent(4) << formatv("{0}: {1}\n", File2.getFilePath(), V2);
- return true;
-}
-
-template <typename T>
-static bool diffAndPrint(StringRef Label, PDBFile &File1, PDBFile &File2,
- ArrayRef<T> V1, ArrayRef<T> V2) {
- if (V1 == V2) {
- outs() << formatv(" {0}: No differences detected!\n", Label);
- return false;
- }
-
- outs().indent(2) << Label << "\n";
- outs().indent(4) << formatv("{0}: {1}\n", File1.getFilePath(),
- make_range(V1.begin(), V1.end()));
- outs().indent(4) << formatv("{0}: {1}\n", File2.getFilePath(),
- make_range(V2.begin(), V2.end()));
- return true;
-}
-
-template <typename T>
-static bool printSymmetricDifferences(PDBFile &File1, PDBFile &File2,
- T &&OnlyRange1, T &&OnlyRange2,
- StringRef Label) {
- bool HasDiff = false;
- if (!OnlyRange1.empty()) {
- HasDiff = true;
- outs() << formatv(" {0} {1}(s) only in ({2})\n", OnlyRange1.size(), Label,
- File1.getFilePath());
- for (const auto &Item : OnlyRange1)
- outs() << formatv(" {0}\n", Label, Item);
- }
- if (!OnlyRange2.empty()) {
- HasDiff = true;
- outs() << formatv(" {0} {1}(s) only in ({2})\n", OnlyRange2.size(),
- File2.getFilePath());
- for (const auto &Item : OnlyRange2)
- outs() << formatv(" {0}\n", Item);
- }
- return HasDiff;
-}
-
-Error DiffStyle::diffSuperBlock() {
- outs() << "MSF Super Block: Searching for differences...\n";
- bool Diffs = false;
-
- Diffs |= diffAndPrint("Block Size", File1, File2, File1.getBlockSize(),
- File2.getBlockSize());
- Diffs |= diffAndPrint("Block Count", File1, File2, File1.getBlockCount(),
- File2.getBlockCount());
- Diffs |= diffAndPrint("Unknown 1", File1, File2, File1.getUnknown1(),
- File2.getUnknown1());
-
- if (opts::diff::Pedantic) {
- Diffs |= diffAndPrint("Free Block Map", File1, File2,
- File1.getFreeBlockMapBlock(),
- File2.getFreeBlockMapBlock());
- Diffs |= diffAndPrint("Directory Size", File1, File2,
- File1.getNumDirectoryBytes(),
- File2.getNumDirectoryBytes());
- Diffs |= diffAndPrint("Block Map Addr", File1, File2,
- File1.getBlockMapOffset(), File2.getBlockMapOffset());
- }
- if (!Diffs)
- outs() << "MSF Super Block: No differences detected...\n";
- return Error::success();
-}
-
-Error DiffStyle::diffStreamDirectory() {
- SmallVector<std::string, 32> P;
- SmallVector<std::string, 32> Q;
- discoverStreamPurposes(File1, P);
- discoverStreamPurposes(File2, Q);
- outs() << "Stream Directory: Searching for differences...\n";
-
- bool HasDifferences = false;
- if (opts::diff::Pedantic) {
- size_t Min = std::min(P.size(), Q.size());
- for (size_t I = 0; I < Min; ++I) {
- StringRef Names[] = {P[I], Q[I]};
- uint32_t Sizes[] = {File1.getStreamByteSize(I),
- File2.getStreamByteSize(I)};
- bool NamesDiffer = Names[0] != Names[1];
- bool SizesDiffer = Sizes[0] != Sizes[1];
- if (NamesDiffer) {
- HasDifferences = true;
- outs().indent(2) << formatv("Stream {0} - {1}: {2}, {3}: {4}\n", I,
- File1.getFilePath(), Names[0],
- File2.getFilePath(), Names[1]);
- continue;
- }
- if (SizesDiffer) {
- HasDifferences = true;
- outs().indent(2) << formatv(
- "Stream {0} ({1}): {2}: {3} bytes, {4}: {5} bytes\n", I, Names[0],
- File1.getFilePath(), Sizes[0], File2.getFilePath(), Sizes[1]);
- continue;
- }
- }
-
- ArrayRef<std::string> MaxNames = (P.size() > Q.size() ? P : Q);
- size_t Max = std::max(P.size(), Q.size());
- PDBFile &MaxFile = (P.size() > Q.size() ? File1 : File2);
- StringRef MinFileName =
- (P.size() < Q.size() ? File1.getFilePath() : File2.getFilePath());
- for (size_t I = Min; I < Max; ++I) {
- HasDifferences = true;
- StringRef StreamName = MaxNames[I];
-
- outs().indent(2) << formatv(
- "Stream {0} - {1}: <not present>, {2}: Index {3}, {4} bytes\n",
- StreamName, MinFileName, MaxFile.getFilePath(), I,
- MaxFile.getStreamByteSize(I));
- }
- if (!HasDifferences)
- outs() << "Stream Directory: No differences detected...\n";
- } else {
- auto PI = to_vector<32>(enumerate(P));
- auto QI = to_vector<32>(enumerate(Q));
-
- typedef decltype(PI) ContainerType;
- typedef typename ContainerType::value_type value_type;
-
- auto Comparator = [](const value_type &I1, const value_type &I2) {
- return I1.value() < I2.value();
- };
-
- decltype(PI) OnlyP;
- decltype(QI) OnlyQ;
- decltype(PI) Common;
-
- set_differences(PI, QI, &OnlyP, &OnlyQ, &Common, Comparator);
-
- if (!OnlyP.empty()) {
- HasDifferences = true;
- outs().indent(2) << formatv("{0} Stream(s) only in ({1})\n", OnlyP.size(),
- File1.getFilePath());
- for (auto &Item : OnlyP) {
- outs().indent(4) << formatv("Stream {0} - {1}\n", Item.index(),
- Item.value());
- }
- }
-
- if (!OnlyQ.empty()) {
- HasDifferences = true;
- outs().indent(2) << formatv("{0} Streams(s) only in ({1})\n",
- OnlyQ.size(), File2.getFilePath());
- for (auto &Item : OnlyQ) {
- outs().indent(4) << formatv("Stream {0} - {1}\n", Item.index(),
- Item.value());
- }
- }
- if (!Common.empty()) {
- outs().indent(2) << formatv("Found {0} common streams. Searching for "
- "intra-stream differences.\n",
- Common.size());
- bool HasCommonDifferences = false;
- for (const auto &Left : Common) {
- // Left was copied from the first range so its index refers to a stream
- // index in the first file. Find the corresponding stream index in the
- // second file.
- auto Range =
- std::equal_range(QI.begin(), QI.end(), Left,
- [](const value_type &L, const value_type &R) {
- return L.value() < R.value();
- });
- const auto &Right = *Range.first;
- assert(Left.value() == Right.value());
- uint32_t LeftSize = File1.getStreamByteSize(Left.index());
- uint32_t RightSize = File2.getStreamByteSize(Right.index());
- if (LeftSize != RightSize) {
- HasDifferences = true;
- HasCommonDifferences = true;
- outs().indent(4) << formatv("{0} ({1}: {2} bytes, {3}: {4} bytes)\n",
- Left.value(), File1.getFilePath(),
- LeftSize, File2.getFilePath(), RightSize);
- }
- }
- if (!HasCommonDifferences)
- outs().indent(2) << "Common Streams: No differences detected!\n";
- }
- if (!HasDifferences)
- outs() << "Stream Directory: No differences detected!\n";
- }
-
- return Error::success();
-}
-
-Error DiffStyle::diffStringTable() {
- auto ExpectedST1 = File1.getStringTable();
- auto ExpectedST2 = File2.getStringTable();
- outs() << "String Table: Searching for differences...\n";
- bool Has1 = !!ExpectedST1;
- bool Has2 = !!ExpectedST2;
- if (!(Has1 && Has2)) {
- // If one has a string table and the other doesn't, we can print less
- // output.
- if (Has1 != Has2) {
- if (Has1) {
- outs() << formatv(" {0}: ({1} strings)\n", File1.getFilePath(),
- ExpectedST1->getNameCount());
- outs() << formatv(" {0}: (string table not present)\n",
- File2.getFilePath());
- } else {
- outs() << formatv(" {0}: (string table not present)\n",
- File1.getFilePath());
- outs() << formatv(" {0}: ({1})\n", File2.getFilePath(),
- ExpectedST2->getNameCount());
- }
- }
- consumeError(ExpectedST1.takeError());
- consumeError(ExpectedST2.takeError());
- return Error::success();
- }
-
- bool HasDiff = false;
- auto &ST1 = *ExpectedST1;
- auto &ST2 = *ExpectedST2;
-
- if (ST1.getByteSize() != ST2.getByteSize()) {
- outs() << " Stream Size\n";
- outs() << formatv(" {0} - {1} byte(s)\n", File1.getFilePath(),
- ST1.getByteSize());
- outs() << formatv(" {0} - {1} byte(s)\n", File2.getFilePath(),
- ST2.getByteSize());
- outs() << formatv(" Difference: {0} bytes\n",
- AbsoluteDifference(ST1.getByteSize(), ST2.getByteSize()));
- HasDiff = true;
- }
- HasDiff |= diffAndPrint("Hash Version", File1, File2, ST1.getHashVersion(),
- ST1.getHashVersion());
- HasDiff |= diffAndPrint("Signature", File1, File2, ST1.getSignature(),
- ST1.getSignature());
-
- // Both have a valid string table, dive in and compare individual strings.
-
- auto IdList1 = ST1.name_ids();
- auto IdList2 = ST2.name_ids();
- if (opts::diff::Pedantic) {
- // In pedantic mode, we compare index by index (i.e. the strings are in the
- // same order
- // in both tables.
- uint32_t Max = std::max(IdList1.size(), IdList2.size());
- for (uint32_t I = 0; I < Max; ++I) {
- Optional<uint32_t> Id1, Id2;
- StringRef S1, S2;
- if (I < IdList1.size()) {
- Id1 = IdList1[I];
- if (auto Result = ST1.getStringForID(*Id1))
- S1 = *Result;
- else
- return Result.takeError();
- }
- if (I < IdList2.size()) {
- Id2 = IdList2[I];
- if (auto Result = ST2.getStringForID(*Id2))
- S2 = *Result;
- else
- return Result.takeError();
- }
- if (Id1 == Id2 && S1 == S2)
- continue;
-
- std::string OutId1 =
- Id1 ? formatv("{0}", *Id1).str() : "(index not present)";
- std::string OutId2 =
- Id2 ? formatv("{0}", *Id2).str() : "(index not present)";
- outs() << formatv(" String {0}\n", I);
- outs() << formatv(" {0}: Hash - {1}, Value - {2}\n",
- File1.getFilePath(), OutId1, S1);
- outs() << formatv(" {0}: Hash - {1}, Value - {2}\n",
- File2.getFilePath(), OutId2, S2);
- HasDiff = true;
- }
- } else {
- std::vector<StringRef> Strings1, Strings2;
- Strings1.reserve(IdList1.size());
- Strings2.reserve(IdList2.size());
- for (auto ID : IdList1) {
- auto S = ST1.getStringForID(ID);
- if (!S)
- return S.takeError();
- Strings1.push_back(*S);
- }
- for (auto ID : IdList2) {
- auto S = ST2.getStringForID(ID);
- if (!S)
- return S.takeError();
- Strings2.push_back(*S);
- }
-
- SmallVector<StringRef, 64> OnlyP;
- SmallVector<StringRef, 64> OnlyQ;
- auto End1 = std::remove(Strings1.begin(), Strings1.end(), "");
- auto End2 = std::remove(Strings2.begin(), Strings2.end(), "");
- uint32_t Empty1 = std::distance(End1, Strings1.end());
- uint32_t Empty2 = std::distance(End2, Strings2.end());
- Strings1.erase(End1, Strings1.end());
- Strings2.erase(End2, Strings2.end());
- set_differences(Strings1, Strings2, &OnlyP, &OnlyQ);
- printSymmetricDifferences(File1, File2, OnlyP, OnlyQ, "String");
-
- if (Empty1 != Empty2) {
- PDBFile &MoreF = (Empty1 > Empty2) ? File1 : File2;
- PDBFile &LessF = (Empty1 < Empty2) ? File1 : File2;
- uint32_t Difference = AbsoluteDifference(Empty1, Empty2);
- outs() << formatv(" {0} had {1} more empty strings than {2}\n",
- MoreF.getFilePath(), Difference, LessF.getFilePath());
- }
- }
- if (!HasDiff)
- outs() << "String Table: No differences detected!\n";
- return Error::success();
-}
-
-Error DiffStyle::diffFreePageMap() { return Error::success(); }
-
-Error DiffStyle::diffInfoStream() {
- auto ExpectedInfo1 = File1.getPDBInfoStream();
- auto ExpectedInfo2 = File2.getPDBInfoStream();
-
- outs() << "PDB Stream: Searching for differences...\n";
- bool Has1 = !!ExpectedInfo1;
- bool Has2 = !!ExpectedInfo2;
- if (!(Has1 && Has2)) {
- if (Has1 != Has2)
- outs() << formatv("{0} does not have a PDB Stream!\n",
- Has1 ? File1.getFilePath() : File2.getFilePath());
- consumeError(ExpectedInfo2.takeError());
- consumeError(ExpectedInfo2.takeError());
- return Error::success();
- }
-
- bool HasDiff = false;
- auto &IS1 = *ExpectedInfo1;
- auto &IS2 = *ExpectedInfo2;
- if (IS1.getStreamSize() != IS2.getStreamSize()) {
- outs() << " Stream Size\n";
- outs() << formatv(" {0} - {1} byte(s)\n", File1.getFilePath(),
- IS1.getStreamSize());
- outs() << formatv(" {0} - {1} byte(s)\n", File2.getFilePath(),
- IS2.getStreamSize());
- outs() << formatv(
- " Difference: {0} bytes\n",
- AbsoluteDifference(IS1.getStreamSize(), IS2.getStreamSize()));
- HasDiff = true;
- }
- HasDiff |= diffAndPrint("Age", File1, File2, IS1.getAge(), IS2.getAge());
- HasDiff |= diffAndPrint("Guid", File1, File2, IS1.getGuid(), IS2.getGuid());
- HasDiff |= diffAndPrint("Signature", File1, File2, IS1.getSignature(),
- IS2.getSignature());
- HasDiff |=
- diffAndPrint("Version", File1, File2, IS1.getVersion(), IS2.getVersion());
- HasDiff |= diffAndPrint("Features", File1, File2, IS1.getFeatureSignatures(),
- IS2.getFeatureSignatures());
- HasDiff |= diffAndPrint("Named Stream Byte Size", File1, File2,
- IS1.getNamedStreamMapByteSize(),
- IS2.getNamedStreamMapByteSize());
- SmallVector<StringRef, 4> NS1;
- SmallVector<StringRef, 4> NS2;
- for (const auto &X : IS1.getNamedStreams().entries())
- NS1.push_back(X.getKey());
- for (const auto &X : IS2.getNamedStreams().entries())
- NS2.push_back(X.getKey());
- SmallVector<StringRef, 4> OnlyP;
- SmallVector<StringRef, 4> OnlyQ;
- set_differences(NS1, NS2, &OnlyP, &OnlyQ);
- printSymmetricDifferences(File1, File2, OnlyP, OnlyQ, "Named Streams");
- if (!HasDiff)
- outs() << "PDB Stream: No differences detected!\n";
-
- return Error::success();
-}
-
-Error DiffStyle::diffDbiStream() { return Error::success(); }
-
-Error DiffStyle::diffSectionContribs() { return Error::success(); }
-
-Error DiffStyle::diffSectionMap() { return Error::success(); }
-
-Error DiffStyle::diffFpoStream() { return Error::success(); }
-
-Error DiffStyle::diffTpiStream(int Index) { return Error::success(); }
-
-Error DiffStyle::diffModuleInfoStream(int Index) { return Error::success(); }
-
-Error DiffStyle::diffPublics() { return Error::success(); }
-
-Error DiffStyle::diffGlobals() { return Error::success(); }
diff --git a/llvm/tools/llvm-pdbdump/Diff.h b/llvm/tools/llvm-pdbdump/Diff.h
deleted file mode 100644
index 6037576e21b..00000000000
--- a/llvm/tools/llvm-pdbdump/Diff.h
+++ /dev/null
@@ -1,45 +0,0 @@
-//===- Diff.h - PDB diff utility --------------------------------*- C++ -*-===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef LLVM_TOOLS_LLVMPDBDUMP_DIFF_H
-#define LLVM_TOOLS_LLVMPDBDUMP_DIFF_H
-
-#include "OutputStyle.h"
-
-namespace llvm {
-namespace pdb {
-class PDBFile;
-class DiffStyle : public OutputStyle {
-public:
- explicit DiffStyle(PDBFile &File1, PDBFile &File2);
-
- Error dump() override;
-
-private:
- Error diffSuperBlock();
- Error diffStreamDirectory();
- Error diffStringTable();
- Error diffFreePageMap();
- Error diffInfoStream();
- Error diffDbiStream();
- Error diffSectionContribs();
- Error diffSectionMap();
- Error diffFpoStream();
- Error diffTpiStream(int Index);
- Error diffModuleInfoStream(int Index);
- Error diffPublics();
- Error diffGlobals();
-
- PDBFile &File1;
- PDBFile &File2;
-};
-}
-}
-
-#endif
diff --git a/llvm/tools/llvm-pdbdump/LLVMBuild.txt b/llvm/tools/llvm-pdbdump/LLVMBuild.txt
deleted file mode 100644
index 4043e13ceae..00000000000
--- a/llvm/tools/llvm-pdbdump/LLVMBuild.txt
+++ /dev/null
@@ -1,23 +0,0 @@
-;===- ./tools/llvm-pdbdump/LLVMBuild.txt -----------------------*- Conf -*--===;
-;
-; The LLVM Compiler Infrastructure
-;
-; This file is distributed under the University of Illinois Open Source
-; License. See LICENSE.TXT for details.
-;
-;===------------------------------------------------------------------------===;
-;
-; This is an LLVMBuild description file for the components in this subdirectory.
-;
-; For more information on the LLVMBuild system, please see:
-;
-; http://llvm.org/docs/LLVMBuild.html
-;
-;===------------------------------------------------------------------------===;
-
-[component_0]
-type = Tool
-name = llvm-pdbdump
-parent = Tools
-required_libraries = DebugInfoMSF DebugInfoPDB
-
diff --git a/llvm/tools/llvm-pdbdump/LLVMOutputStyle.cpp b/llvm/tools/llvm-pdbdump/LLVMOutputStyle.cpp
deleted file mode 100644
index 2f108a4785c..00000000000
--- a/llvm/tools/llvm-pdbdump/LLVMOutputStyle.cpp
+++ /dev/null
@@ -1,1177 +0,0 @@
-//===- LLVMOutputStyle.cpp ------------------------------------ *- C++ --*-===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#include "LLVMOutputStyle.h"
-
-#include "CompactTypeDumpVisitor.h"
-#include "StreamUtil.h"
-#include "llvm-pdbdump.h"
-
-#include "llvm/DebugInfo/CodeView/CVTypeVisitor.h"
-#include "llvm/DebugInfo/CodeView/DebugChecksumsSubsection.h"
-#include "llvm/DebugInfo/CodeView/DebugCrossExSubsection.h"
-#include "llvm/DebugInfo/CodeView/DebugCrossImpSubsection.h"
-#include "llvm/DebugInfo/CodeView/DebugFrameDataSubsection.h"
-#include "llvm/DebugInfo/CodeView/DebugInlineeLinesSubsection.h"
-#include "llvm/DebugInfo/CodeView/DebugLinesSubsection.h"
-#include "llvm/DebugInfo/CodeView/DebugStringTableSubsection.h"
-#include "llvm/DebugInfo/CodeView/DebugSubsectionVisitor.h"
-#include "llvm/DebugInfo/CodeView/DebugSymbolsSubsection.h"
-#include "llvm/DebugInfo/CodeView/DebugUnknownSubsection.h"
-#include "llvm/DebugInfo/CodeView/EnumTables.h"
-#include "llvm/DebugInfo/CodeView/LazyRandomTypeCollection.h"
-#include "llvm/DebugInfo/CodeView/Line.h"
-#include "llvm/DebugInfo/CodeView/SymbolDumper.h"
-#include "llvm/DebugInfo/CodeView/TypeDatabaseVisitor.h"
-#include "llvm/DebugInfo/CodeView/TypeDumpVisitor.h"
-#include "llvm/DebugInfo/CodeView/TypeVisitorCallbackPipeline.h"
-#include "llvm/DebugInfo/MSF/MappedBlockStream.h"
-#include "llvm/DebugInfo/PDB/Native/DbiModuleDescriptor.h"
-#include "llvm/DebugInfo/PDB/Native/DbiStream.h"
-#include "llvm/DebugInfo/PDB/Native/EnumTables.h"
-#include "llvm/DebugInfo/PDB/Native/GlobalsStream.h"
-#include "llvm/DebugInfo/PDB/Native/ISectionContribVisitor.h"
-#include "llvm/DebugInfo/PDB/Native/InfoStream.h"
-#include "llvm/DebugInfo/PDB/Native/ModuleDebugStream.h"
-#include "llvm/DebugInfo/PDB/Native/PDBFile.h"
-#include "llvm/DebugInfo/PDB/Native/PublicsStream.h"
-#include "llvm/DebugInfo/PDB/Native/RawError.h"
-#include "llvm/DebugInfo/PDB/Native/TpiHashing.h"
-#include "llvm/DebugInfo/PDB/Native/TpiStream.h"
-#include "llvm/DebugInfo/PDB/PDBExtras.h"
-#include "llvm/Object/COFF.h"
-#include "llvm/Support/BinaryStreamReader.h"
-#include "llvm/Support/FormatVariadic.h"
-
-#include <unordered_map>
-
-using namespace llvm;
-using namespace llvm::codeview;
-using namespace llvm::msf;
-using namespace llvm::pdb;
-
-namespace {
-struct PageStats {
- explicit PageStats(const BitVector &FreePages)
- : Upm(FreePages), ActualUsedPages(FreePages.size()),
- MultiUsePages(FreePages.size()), UseAfterFreePages(FreePages.size()) {
- const_cast<BitVector &>(Upm).flip();
- // To calculate orphaned pages, we start with the set of pages that the
- // MSF thinks are used. Each time we find one that actually *is* used,
- // we unset it. Whichever bits remain set at the end are orphaned.
- OrphanedPages = Upm;
- }
-
- // The inverse of the MSF File's copy of the Fpm. The basis for which we
- // determine the allocation status of each page.
- const BitVector Upm;
-
- // Pages which are marked as used in the FPM and are used at least once.
- BitVector ActualUsedPages;
-
- // Pages which are marked as used in the FPM but are used more than once.
- BitVector MultiUsePages;
-
- // Pages which are marked as used in the FPM but are not used at all.
- BitVector OrphanedPages;
-
- // Pages which are marked free in the FPM but are used.
- BitVector UseAfterFreePages;
-};
-
-class C13RawVisitor : public DebugSubsectionVisitor {
-public:
- C13RawVisitor(ScopedPrinter &P, LazyRandomTypeCollection &TPI,
- LazyRandomTypeCollection &IPI)
- : P(P), TPI(TPI), IPI(IPI) {}
-
- Error visitUnknown(DebugUnknownSubsectionRef &Unknown) override {
- if (!opts::checkModuleSubsection(opts::ModuleSubsection::Unknown))
- return Error::success();
- DictScope DD(P, "Unknown");
- P.printHex("Kind", static_cast<uint32_t>(Unknown.kind()));
- ArrayRef<uint8_t> Data;
- BinaryStreamReader Reader(Unknown.getData());
- consumeError(Reader.readBytes(Data, Reader.bytesRemaining()));
- P.printBinaryBlock("Data", Data);
- return Error::success();
- }
-
- Error visitLines(DebugLinesSubsectionRef &Lines,
- const DebugSubsectionState &State) override {
- if (!opts::checkModuleSubsection(opts::ModuleSubsection::Lines))
- return Error::success();
-
- DictScope DD(P, "Lines");
-
- P.printNumber("RelocSegment", Lines.header()->RelocSegment);
- P.printNumber("RelocOffset", Lines.header()->RelocOffset);
- P.printNumber("CodeSize", Lines.header()->CodeSize);
- P.printBoolean("HasColumns", Lines.hasColumnInfo());
-
- for (const auto &L : Lines) {
- DictScope DDDD(P, "FileEntry");
-
- if (auto EC = printFileName("FileName", L.NameIndex, State))
- return EC;
-
- for (const auto &N : L.LineNumbers) {
- DictScope DDD(P, "Line");
- LineInfo LI(N.Flags);
- P.printNumber("Offset", N.Offset);
- if (LI.isAlwaysStepInto())
- P.printString("StepInto", StringRef("Always"));
- else if (LI.isNeverStepInto())
- P.printString("StepInto", StringRef("Never"));
- else
- P.printNumber("LineNumberStart", LI.getStartLine());
- P.printNumber("EndDelta", LI.getLineDelta());
- P.printBoolean("IsStatement", LI.isStatement());
- }
- for (const auto &C : L.Columns) {
- DictScope DDD(P, "Column");
- P.printNumber("Start", C.StartColumn);
- P.printNumber("End", C.EndColumn);
- }
- }
-
- return Error::success();
- }
-
- Error visitFileChecksums(DebugChecksumsSubsectionRef &Checksums,
- const DebugSubsectionState &State) override {
- if (!opts::checkModuleSubsection(opts::ModuleSubsection::FileChecksums))
- return Error::success();
-
- DictScope DD(P, "FileChecksums");
- for (const auto &CS : Checksums) {
- DictScope DDD(P, "Checksum");
- if (auto Result = getNameFromStringTable(CS.FileNameOffset, State))
- P.printString("FileName", *Result);
- else
- return Result.takeError();
- P.printEnum("Kind", uint8_t(CS.Kind), getFileChecksumNames());
- P.printBinaryBlock("Checksum", CS.Checksum);
- }
- return Error::success();
- }
-
- Error visitInlineeLines(DebugInlineeLinesSubsectionRef &Inlinees,
- const DebugSubsectionState &State) override {
- if (!opts::checkModuleSubsection(opts::ModuleSubsection::InlineeLines))
- return Error::success();
-
- DictScope D(P, "InlineeLines");
- P.printBoolean("HasExtraFiles", Inlinees.hasExtraFiles());
- ListScope LS(P, "Lines");
- for (const auto &L : Inlinees) {
- DictScope DDD(P, "Inlinee");
- if (auto EC = printFileName("FileName", L.Header->FileID, State))
- return EC;
-
- if (auto EC = dumpTypeRecord("Function", L.Header->Inlinee))
- return EC;
- P.printNumber("SourceLine", L.Header->SourceLineNum);
- if (Inlinees.hasExtraFiles()) {
- ListScope DDDD(P, "ExtraFiles");
- for (const auto &EF : L.ExtraFiles) {
- if (auto EC = printFileName("File", EF, State))
- return EC;
- }
- }
- }
- return Error::success();
- }
-
- Error visitCrossModuleExports(DebugCrossModuleExportsSubsectionRef &CSE,
- const DebugSubsectionState &State) override {
- if (!opts::checkModuleSubsection(opts::ModuleSubsection::CrossScopeExports))
- return Error::success();
-
- ListScope D(P, "CrossModuleExports");
- for (const auto &M : CSE) {
- DictScope D(P, "Export");
- P.printHex("Local", M.Local);
- P.printHex("Global", M.Global);
- }
- return Error::success();
- }
-
- Error visitCrossModuleImports(DebugCrossModuleImportsSubsectionRef &CSI,
- const DebugSubsectionState &State) override {
- if (!opts::checkModuleSubsection(opts::ModuleSubsection::CrossScopeImports))
- return Error::success();
-
- ListScope L(P, "CrossModuleImports");
- for (const auto &M : CSI) {
- DictScope D(P, "ModuleImport");
- auto Name = getNameFromStringTable(M.Header->ModuleNameOffset, State);
- if (!Name)
- return Name.takeError();
- P.printString("Module", *Name);
- P.printHexList("Imports", M.Imports);
- }
- return Error::success();
- }
-
- Error visitFrameData(DebugFrameDataSubsectionRef &FD,
- const DebugSubsectionState &State) override {
- if (!opts::checkModuleSubsection(opts::ModuleSubsection::FrameData))
- return Error::success();
-
- ListScope L(P, "FrameData");
- for (const auto &Frame : FD) {
- DictScope D(P, "Frame");
- auto Name = getNameFromStringTable(Frame.FrameFunc, State);
- if (!Name)
- return joinErrors(make_error<RawError>(raw_error_code::invalid_format,
- "Invalid Frame.FrameFunc index"),
- Name.takeError());
- P.printNumber("Rva", Frame.RvaStart);
- P.printNumber("CodeSize", Frame.CodeSize);
- P.printNumber("LocalSize", Frame.LocalSize);
- P.printNumber("ParamsSize", Frame.ParamsSize);
- P.printNumber("MaxStackSize", Frame.MaxStackSize);
- P.printString("FrameFunc", *Name);
- P.printNumber("PrologSize", Frame.PrologSize);
- P.printNumber("SavedRegsSize", Frame.SavedRegsSize);
- P.printNumber("Flags", Frame.Flags);
- }
- return Error::success();
- }
-
- Error visitSymbols(DebugSymbolsSubsectionRef &Symbols,
- const DebugSubsectionState &State) override {
- if (!opts::checkModuleSubsection(opts::ModuleSubsection::Symbols))
- return Error::success();
- ListScope L(P, "Symbols");
-
- // This section should not actually appear in a PDB file, it really only
- // appears in object files. But we support it here for testing. So we
- // specify the Object File container type.
- codeview::CVSymbolDumper SD(P, TPI, CodeViewContainer::ObjectFile, nullptr,
- false);
- for (auto S : Symbols) {
- DictScope LL(P, "");
- if (auto EC = SD.dump(S)) {
- return make_error<RawError>(
- raw_error_code::corrupt_file,
- "DEBUG_S_SYMBOLS subsection contained corrupt symbol record");
- }
- }
- return Error::success();
- }
-
- Error visitStringTable(DebugStringTableSubsectionRef &Strings,
- const DebugSubsectionState &State) override {
- if (!opts::checkModuleSubsection(opts::ModuleSubsection::StringTable))
- return Error::success();
-
- ListScope D(P, "String Table");
- BinaryStreamReader Reader(Strings.getBuffer());
- StringRef S;
- consumeError(Reader.readCString(S));
- while (Reader.bytesRemaining() > 0) {
- consumeError(Reader.readCString(S));
- if (S.empty() && Reader.bytesRemaining() < 4)
- break;
- P.printString(S);
- }
- return Error::success();
- }
-
-private:
- Error dumpTypeRecord(StringRef Label, TypeIndex Index) {
- CompactTypeDumpVisitor CTDV(IPI, Index, &P);
- DictScope D(P, Label);
- if (IPI.contains(Index)) {
- CVType Type = IPI.getType(Index);
- if (auto EC = codeview::visitTypeRecord(Type, CTDV))
- return EC;
- } else {
- P.printString(
- llvm::formatv("Index: {0:x} (unknown function)", Index.getIndex())
- .str());
- }
- return Error::success();
- }
- Error printFileName(StringRef Label, uint32_t Offset,
- const DebugSubsectionState &State) {
- if (auto Result = getNameFromChecksumsBuffer(Offset, State)) {
- P.printString(Label, *Result);
- return Error::success();
- } else
- return Result.takeError();
- }
-
- Expected<StringRef>
- getNameFromStringTable(uint32_t Offset, const DebugSubsectionState &State) {
- return State.strings().getString(Offset);
- }
-
- Expected<StringRef>
- getNameFromChecksumsBuffer(uint32_t Offset,
- const DebugSubsectionState &State) {
- auto Array = State.checksums().getArray();
- auto ChecksumIter = Array.at(Offset);
- if (ChecksumIter == Array.end())
- return make_error<RawError>(raw_error_code::invalid_format);
- const auto &Entry = *ChecksumIter;
- return getNameFromStringTable(Entry.FileNameOffset, State);
- }
-
- ScopedPrinter &P;
- LazyRandomTypeCollection &TPI;
- LazyRandomTypeCollection &IPI;
-};
-}
-
-static void recordKnownUsedPage(PageStats &Stats, uint32_t UsedIndex) {
- if (Stats.Upm.test(UsedIndex)) {
- if (Stats.ActualUsedPages.test(UsedIndex))
- Stats.MultiUsePages.set(UsedIndex);
- Stats.ActualUsedPages.set(UsedIndex);
- Stats.OrphanedPages.reset(UsedIndex);
- } else {
- // The MSF doesn't think this page is used, but it is.
- Stats.UseAfterFreePages.set(UsedIndex);
- }
-}
-
-static void printSectionOffset(llvm::raw_ostream &OS,
- const SectionOffset &Off) {
- OS << Off.Off << ", " << Off.Isect;
-}
-
-LLVMOutputStyle::LLVMOutputStyle(PDBFile &File) : File(File), P(outs()) {}
-
-Error LLVMOutputStyle::dump() {
- if (auto EC = dumpFileHeaders())
- return EC;
-
- if (auto EC = dumpStreamSummary())
- return EC;
-
- if (auto EC = dumpFreePageMap())
- return EC;
-
- if (auto EC = dumpStreamBlocks())
- return EC;
-
- if (auto EC = dumpBlockRanges())
- return EC;
-
- if (auto EC = dumpStreamBytes())
- return EC;
-
- if (auto EC = dumpStringTable())
- return EC;
-
- if (auto EC = dumpInfoStream())
- return EC;
-
- if (auto EC = dumpTpiStream(StreamTPI))
- return EC;
-
- if (auto EC = dumpTpiStream(StreamIPI))
- return EC;
-
- if (auto EC = dumpDbiStream())
- return EC;
-
- if (auto EC = dumpSectionContribs())
- return EC;
-
- if (auto EC = dumpSectionMap())
- return EC;
-
- if (auto EC = dumpGlobalsStream())
- return EC;
-
- if (auto EC = dumpPublicsStream())
- return EC;
-
- if (auto EC = dumpSectionHeaders())
- return EC;
-
- if (auto EC = dumpFpoStream())
- return EC;
-
- flush();
-
- return Error::success();
-}
-
-Error LLVMOutputStyle::dumpFileHeaders() {
- if (!opts::raw::DumpHeaders)
- return Error::success();
-
- DictScope D(P, "FileHeaders");
- P.printNumber("BlockSize", File.getBlockSize());
- P.printNumber("FreeBlockMap", File.getFreeBlockMapBlock());
- P.printNumber("NumBlocks", File.getBlockCount());
- P.printNumber("NumDirectoryBytes", File.getNumDirectoryBytes());
- P.printNumber("Unknown1", File.getUnknown1());
- P.printNumber("BlockMapAddr", File.getBlockMapIndex());
- P.printNumber("NumDirectoryBlocks", File.getNumDirectoryBlocks());
-
- // The directory is not contiguous. Instead, the block map contains a
- // contiguous list of block numbers whose contents, when concatenated in
- // order, make up the directory.
- P.printList("DirectoryBlocks", File.getDirectoryBlockArray());
- P.printNumber("NumStreams", File.getNumStreams());
- return Error::success();
-}
-
-Error LLVMOutputStyle::dumpStreamSummary() {
- if (!opts::raw::DumpStreamSummary)
- return Error::success();
-
- if (StreamPurposes.empty())
- discoverStreamPurposes(File, StreamPurposes);
-
- uint32_t StreamCount = File.getNumStreams();
-
- ListScope L(P, "Streams");
- for (uint16_t StreamIdx = 0; StreamIdx < StreamCount; ++StreamIdx) {
- std::string Label("Stream ");
- Label += to_string(StreamIdx);
-
- std::string Value = "[" + StreamPurposes[StreamIdx] + "] (";
- Value += to_string(File.getStreamByteSize(StreamIdx));
- Value += " bytes)";
-
- P.printString(Label, Value);
- }
-
- P.flush();
- return Error::success();
-}
-
-Error LLVMOutputStyle::dumpFreePageMap() {
- if (!opts::raw::DumpPageStats)
- return Error::success();
-
- // Start with used pages instead of free pages because
- // the number of free pages is far larger than used pages.
- BitVector FPM = File.getMsfLayout().FreePageMap;
-
- PageStats PS(FPM);
-
- recordKnownUsedPage(PS, 0); // MSF Super Block
-
- uint32_t BlocksPerSection = msf::getFpmIntervalLength(File.getMsfLayout());
- uint32_t NumSections = msf::getNumFpmIntervals(File.getMsfLayout());
- for (uint32_t I = 0; I < NumSections; ++I) {
- uint32_t Fpm0 = 1 + BlocksPerSection * I;
- // 2 Fpm blocks spaced at `getBlockSize()` block intervals
- recordKnownUsedPage(PS, Fpm0);
- recordKnownUsedPage(PS, Fpm0 + 1);
- }
-
- recordKnownUsedPage(PS, File.getBlockMapIndex()); // Stream Table
-
- for (auto DB : File.getDirectoryBlockArray())
- recordKnownUsedPage(PS, DB);
-
- // Record pages used by streams. Note that pages for stream 0
- // are considered being unused because that's what MSVC tools do.
- // Stream 0 doesn't contain actual data, so it makes some sense,
- // though it's a bit confusing to us.
- for (auto &SE : File.getStreamMap().drop_front(1))
- for (auto &S : SE)
- recordKnownUsedPage(PS, S);
-
- dumpBitVector("Msf Free Pages", FPM);
- dumpBitVector("Orphaned Pages", PS.OrphanedPages);
- dumpBitVector("Multiply Used Pages", PS.MultiUsePages);
- dumpBitVector("Use After Free Pages", PS.UseAfterFreePages);
- return Error::success();
-}
-
-void LLVMOutputStyle::dumpBitVector(StringRef Name, const BitVector &V) {
- std::vector<uint32_t> Vec;
- for (uint32_t I = 0, E = V.size(); I != E; ++I)
- if (V[I])
- Vec.push_back(I);
- P.printList(Name, Vec);
-}
-
-Error LLVMOutputStyle::dumpGlobalsStream() {
- if (!opts::raw::DumpGlobals)
- return Error::success();
- if (!File.hasPDBGlobalsStream()) {
- P.printString("Globals Stream not present");
- return Error::success();
- }
-
- auto Globals = File.getPDBGlobalsStream();
- if (!Globals)
- return Globals.takeError();
- DictScope D(P, "Globals Stream");
-
- auto Dbi = File.getPDBDbiStream();
- if (!Dbi)
- return Dbi.takeError();
-
- P.printNumber("Stream number", Dbi->getGlobalSymbolStreamIndex());
- P.printNumber("Number of buckets", Globals->getNumBuckets());
- P.printList("Hash Buckets", Globals->getHashBuckets());
-
- return Error::success();
-}
-
-Error LLVMOutputStyle::dumpStreamBlocks() {
- if (!opts::raw::DumpStreamBlocks)
- return Error::success();
-
- ListScope L(P, "StreamBlocks");
- uint32_t StreamCount = File.getNumStreams();
- for (uint32_t StreamIdx = 0; StreamIdx < StreamCount; ++StreamIdx) {
- std::string Name("Stream ");
- Name += to_string(StreamIdx);
- auto StreamBlocks = File.getStreamBlockList(StreamIdx);
- P.printList(Name, StreamBlocks);
- }
- return Error::success();
-}
-
-Error LLVMOutputStyle::dumpBlockRanges() {
- if (!opts::raw::DumpBlockRange.hasValue())
- return Error::success();
- auto &R = *opts::raw::DumpBlockRange;
- uint32_t Max = R.Max.getValueOr(R.Min);
-
- if (Max < R.Min)
- return make_error<StringError>(
- "Invalid block range specified. Max < Min",
- std::make_error_code(std::errc::bad_address));
- if (Max >= File.getBlockCount())
- return make_error<StringError>(
- "Invalid block range specified. Requested block out of bounds",
- std::make_error_code(std::errc::bad_address));
-
- DictScope D(P, "Block Data");
- for (uint32_t I = R.Min; I <= Max; ++I) {
- auto ExpectedData = File.getBlockData(I, File.getBlockSize());
- if (!ExpectedData)
- return ExpectedData.takeError();
- std::string Label;
- llvm::raw_string_ostream S(Label);
- S << "Block " << I;
- S.flush();
- P.printBinaryBlock(Label, *ExpectedData);
- }
-
- return Error::success();
-}
-
-static Error parseStreamSpec(StringRef Str, uint32_t &SI, uint32_t &Offset,
- uint32_t &Size) {
- if (Str.consumeInteger(0, SI))
- return make_error<RawError>(raw_error_code::invalid_format,
- "Invalid Stream Specification");
- if (Str.consume_front(":")) {
- if (Str.consumeInteger(0, Offset))
- return make_error<RawError>(raw_error_code::invalid_format,
- "Invalid Stream Specification");
- }
- if (Str.consume_front("@")) {
- if (Str.consumeInteger(0, Size))
- return make_error<RawError>(raw_error_code::invalid_format,
- "Invalid Stream Specification");
- }
- if (!Str.empty())
- return make_error<RawError>(raw_error_code::invalid_format,
- "Invalid Stream Specification");
- return Error::success();
-}
-
-Error LLVMOutputStyle::dumpStreamBytes() {
- if (opts::raw::DumpStreamData.empty())
- return Error::success();
-
- if (StreamPurposes.empty())
- discoverStreamPurposes(File, StreamPurposes);
-
- DictScope D(P, "Stream Data");
- for (auto &Str : opts::raw::DumpStreamData) {
- uint32_t SI = 0;
- uint32_t Begin = 0;
- uint32_t Size = 0;
- uint32_t End = 0;
-
- if (auto EC = parseStreamSpec(Str, SI, Begin, Size))
- return EC;
-
- if (SI >= File.getNumStreams())
- return make_error<RawError>(raw_error_code::no_stream);
-
- auto S = MappedBlockStream::createIndexedStream(
- File.getMsfLayout(), File.getMsfBuffer(), SI, File.getAllocator());
- if (!S)
- continue;
- DictScope DD(P, "Stream");
- if (Size == 0)
- End = S->getLength();
- else {
- End = Begin + Size;
- if (End >= S->getLength())
- return make_error<RawError>(raw_error_code::index_out_of_bounds,
- "Stream is not long enough!");
- }
-
- P.printNumber("Index", SI);
- P.printString("Type", StreamPurposes[SI]);
- P.printNumber("Size", S->getLength());
- auto Blocks = File.getMsfLayout().StreamMap[SI];
- P.printList("Blocks", Blocks);
-
- BinaryStreamReader R(*S);
- ArrayRef<uint8_t> StreamData;
- if (auto EC = R.readBytes(StreamData, S->getLength()))
- return EC;
- Size = End - Begin;
- StreamData = StreamData.slice(Begin, Size);
- P.printBinaryBlock("Data", StreamData, Begin);
- }
- return Error::success();
-}
-
-Error LLVMOutputStyle::dumpStringTable() {
- if (!opts::raw::DumpStringTable)
- return Error::success();
-
- auto IS = File.getStringTable();
- if (!IS)
- return IS.takeError();
-
- DictScope D(P, "String Table");
- for (uint32_t I : IS->name_ids()) {
- auto ES = IS->getStringForID(I);
- if (!ES)
- return ES.takeError();
-
- if (ES->empty())
- continue;
- llvm::SmallString<32> Str;
- Str.append("'");
- Str.append(*ES);
- Str.append("'");
- P.printString(Str);
- }
- return Error::success();
-}
-
-Error LLVMOutputStyle::dumpInfoStream() {
- if (!opts::raw::DumpHeaders)
- return Error::success();
- if (!File.hasPDBInfoStream()) {
- P.printString("PDB Stream not present");
- return Error::success();
- }
- auto IS = File.getPDBInfoStream();
- if (!IS)
- return IS.takeError();
-
- DictScope D(P, "PDB Stream");
- P.printNumber("Version", IS->getVersion());
- P.printHex("Signature", IS->getSignature());
- P.printNumber("Age", IS->getAge());
- P.printObject("Guid", IS->getGuid());
- P.printHex("Features", IS->getFeatures());
- {
- DictScope DD(P, "Named Streams");
- for (const auto &S : IS->getNamedStreams().entries())
- P.printObject(S.getKey(), S.getValue());
- }
- return Error::success();
-}
-
-namespace {
-class RecordBytesVisitor : public TypeVisitorCallbacks {
-public:
- explicit RecordBytesVisitor(ScopedPrinter &P) : P(P) {}
-
- Error visitTypeEnd(CVType &Record) override {
- P.printBinaryBlock("Bytes", Record.content());
- return Error::success();
- }
-
-private:
- ScopedPrinter &P;
-};
-}
-
-Error LLVMOutputStyle::dumpTpiStream(uint32_t StreamIdx) {
- assert(StreamIdx == StreamTPI || StreamIdx == StreamIPI);
-
- bool DumpRecordBytes = false;
- bool DumpRecords = false;
- bool DumpTpiHash = false;
- StringRef Label;
- StringRef VerLabel;
- if (StreamIdx == StreamTPI) {
- if (!File.hasPDBTpiStream()) {
- P.printString("Type Info Stream (TPI) not present");
- return Error::success();
- }
- DumpRecordBytes = opts::raw::DumpTpiRecordBytes;
- DumpRecords = opts::raw::DumpTpiRecords;
- DumpTpiHash = opts::raw::DumpTpiHash;
- Label = "Type Info Stream (TPI)";
- VerLabel = "TPI Version";
- } else if (StreamIdx == StreamIPI) {
- if (!File.hasPDBIpiStream()) {
- P.printString("Type Info Stream (IPI) not present");
- return Error::success();
- }
- DumpRecordBytes = opts::raw::DumpIpiRecordBytes;
- DumpRecords = opts::raw::DumpIpiRecords;
- Label = "Type Info Stream (IPI)";
- VerLabel = "IPI Version";
- }
-
- auto Tpi = (StreamIdx == StreamTPI) ? File.getPDBTpiStream()
- : File.getPDBIpiStream();
- if (!Tpi)
- return Tpi.takeError();
-
- auto ExpectedTypes = initializeTypeDatabase(StreamIdx);
- if (!ExpectedTypes)
- return ExpectedTypes.takeError();
- auto &Types = *ExpectedTypes;
-
- if (!DumpRecordBytes && !DumpRecords && !DumpTpiHash)
- return Error::success();
-
- std::unique_ptr<DictScope> StreamScope;
- std::unique_ptr<ListScope> RecordScope;
-
- StreamScope = llvm::make_unique<DictScope>(P, Label);
- P.printNumber(VerLabel, Tpi->getTpiVersion());
- P.printNumber("Record count", Tpi->getNumTypeRecords());
-
- std::vector<std::unique_ptr<TypeVisitorCallbacks>> Visitors;
-
- // If we're in dump mode, add a dumper with the appropriate detail level.
- if (DumpRecords) {
- std::unique_ptr<TypeVisitorCallbacks> Dumper;
- if (opts::raw::CompactRecords)
- Dumper = make_unique<CompactTypeDumpVisitor>(Types, &P);
- else {
- assert(TpiTypes);
-
- auto X = make_unique<TypeDumpVisitor>(*TpiTypes, &P, false);
- if (StreamIdx == StreamIPI)
- X->setIpiTypes(*IpiTypes);
- Dumper = std::move(X);
- }
- Visitors.push_back(std::move(Dumper));
- }
- if (DumpRecordBytes)
- Visitors.push_back(make_unique<RecordBytesVisitor>(P));
-
- // We always need to deserialize and add it to the type database. This is
- // true if even if we're not dumping anything, because we could need the
- // type database for the purposes of dumping symbols.
- TypeVisitorCallbackPipeline Pipeline;
- for (const auto &V : Visitors)
- Pipeline.addCallbackToPipeline(*V);
-
- if (DumpRecords || DumpRecordBytes)
- RecordScope = llvm::make_unique<ListScope>(P, "Records");
-
- Optional<TypeIndex> I = Types.getFirst();
- while (I) {
- std::unique_ptr<DictScope> OneRecordScope;
-
- if ((DumpRecords || DumpRecordBytes) && !opts::raw::CompactRecords)
- OneRecordScope = llvm::make_unique<DictScope>(P, "");
-
- auto T = Types.getType(*I);
- if (auto EC = codeview::visitTypeRecord(T, *I, Pipeline))
- return EC;
- I = Types.getNext(*I);
- }
-
- if (DumpTpiHash) {
- DictScope DD(P, "Hash");
- P.printNumber("Number of Hash Buckets", Tpi->getNumHashBuckets());
- P.printNumber("Hash Key Size", Tpi->getHashKeySize());
- P.printList("Values", Tpi->getHashValues());
-
- ListScope LHA(P, "Adjusters");
- auto ExpectedST = File.getStringTable();
- if (!ExpectedST)
- return ExpectedST.takeError();
- const auto &ST = *ExpectedST;
- for (const auto &E : Tpi->getHashAdjusters()) {
- DictScope DHA(P);
- auto Name = ST.getStringForID(E.first);
- if (!Name)
- return Name.takeError();
-
- P.printString("Type", *Name);
- P.printHex("TI", E.second);
- }
- }
-
- ListScope L(P, "TypeIndexOffsets");
- for (const auto &IO : Tpi->getTypeIndexOffsets()) {
- P.printString(formatv("Index: {0:x}, Offset: {1:N}", IO.Type.getIndex(),
- (uint32_t)IO.Offset)
- .str());
- }
-
- P.flush();
- return Error::success();
-}
-
-Expected<codeview::LazyRandomTypeCollection &>
-LLVMOutputStyle::initializeTypeDatabase(uint32_t SN) {
- auto &TypeCollection = (SN == StreamTPI) ? TpiTypes : IpiTypes;
- auto Tpi =
- (SN == StreamTPI) ? File.getPDBTpiStream() : File.getPDBIpiStream();
- if (!Tpi)
- return Tpi.takeError();
-
- if (!TypeCollection) {
- // Initialize the type collection, even if we're not going to dump it. This
- // way if some other part of the dumper decides it wants to use some or all
- // of the records for whatever purposes, it can still access them lazily.
- auto &Types = Tpi->typeArray();
- uint32_t Count = Tpi->getNumTypeRecords();
- auto Offsets = Tpi->getTypeIndexOffsets();
- TypeCollection =
- llvm::make_unique<LazyRandomTypeCollection>(Types, Count, Offsets);
- }
-
- return *TypeCollection;
-}
-
-Error LLVMOutputStyle::dumpDbiStream() {
- bool DumpModules = opts::shared::DumpModules ||
- opts::shared::DumpModuleSyms ||
- opts::shared::DumpModuleFiles ||
- !opts::shared::DumpModuleSubsections.empty();
- if (!opts::raw::DumpHeaders && !DumpModules)
- return Error::success();
- if (!File.hasPDBDbiStream()) {
- P.printString("DBI Stream not present");
- return Error::success();
- }
-
- auto DS = File.getPDBDbiStream();
- if (!DS)
- return DS.takeError();
-
- DictScope D(P, "DBI Stream");
- P.printNumber("Dbi Version", DS->getDbiVersion());
- P.printNumber("Age", DS->getAge());
- P.printBoolean("Incremental Linking", DS->isIncrementallyLinked());
- P.printBoolean("Has CTypes", DS->hasCTypes());
- P.printBoolean("Is Stripped", DS->isStripped());
- P.printObject("Machine Type", DS->getMachineType());
- P.printNumber("Symbol Record Stream Index", DS->getSymRecordStreamIndex());
- P.printNumber("Public Symbol Stream Index", DS->getPublicSymbolStreamIndex());
- P.printNumber("Global Symbol Stream Index", DS->getGlobalSymbolStreamIndex());
-
- uint16_t Major = DS->getBuildMajorVersion();
- uint16_t Minor = DS->getBuildMinorVersion();
- P.printVersion("Toolchain Version", Major, Minor);
-
- std::string DllName;
- raw_string_ostream DllStream(DllName);
- DllStream << "mspdb" << Major << Minor << ".dll version";
- DllStream.flush();
- P.printVersion(DllName, Major, Minor, DS->getPdbDllVersion());
-
- if (DumpModules) {
- ListScope L(P, "Modules");
- const DbiModuleList &Modules = DS->modules();
- for (uint32_t I = 0; I < Modules.getModuleCount(); ++I) {
- const DbiModuleDescriptor &Modi = Modules.getModuleDescriptor(I);
- DictScope DD(P);
- P.printString("Name", Modi.getModuleName().str());
- P.printNumber("Debug Stream Index", Modi.getModuleStreamIndex());
- P.printString("Object File Name", Modi.getObjFileName().str());
- P.printNumber("Num Files", Modi.getNumberOfFiles());
- P.printNumber("Source File Name Idx", Modi.getSourceFileNameIndex());
- P.printNumber("Pdb File Name Idx", Modi.getPdbFilePathNameIndex());
- P.printNumber("Line Info Byte Size", Modi.getC11LineInfoByteSize());
- P.printNumber("C13 Line Info Byte Size", Modi.getC13LineInfoByteSize());
- P.printNumber("Symbol Byte Size", Modi.getSymbolDebugInfoByteSize());
- P.printNumber("Type Server Index", Modi.getTypeServerIndex());
- P.printBoolean("Has EC Info", Modi.hasECInfo());
- if (opts::shared::DumpModuleFiles) {
- std::string FileListName = to_string(Modules.getSourceFileCount(I)) +
- " Contributing Source Files";
- ListScope LL(P, FileListName);
- for (auto File : Modules.source_files(I))
- P.printString(File);
- }
- bool HasModuleDI = (Modi.getModuleStreamIndex() < File.getNumStreams());
- bool ShouldDumpSymbols =
- (opts::shared::DumpModuleSyms || opts::raw::DumpSymRecordBytes);
- if (HasModuleDI &&
- (ShouldDumpSymbols || !opts::shared::DumpModuleSubsections.empty())) {
- auto ModStreamData = MappedBlockStream::createIndexedStream(
- File.getMsfLayout(), File.getMsfBuffer(),
- Modi.getModuleStreamIndex(), File.getAllocator());
-
- ModuleDebugStreamRef ModS(Modi, std::move(ModStreamData));
- if (auto EC = ModS.reload())
- return EC;
-
- auto ExpectedTpi = initializeTypeDatabase(StreamTPI);
- if (!ExpectedTpi)
- return ExpectedTpi.takeError();
- auto &Tpi = *ExpectedTpi;
- if (ShouldDumpSymbols) {
-
- ListScope SS(P, "Symbols");
- codeview::CVSymbolDumper SD(P, Tpi, CodeViewContainer::Pdb, nullptr,
- false);
- bool HadError = false;
- for (auto S : ModS.symbols(&HadError)) {
- DictScope LL(P, "");
- if (opts::shared::DumpModuleSyms) {
- if (auto EC = SD.dump(S)) {
- llvm::consumeError(std::move(EC));
- HadError = true;
- break;
- }
- }
- if (opts::raw::DumpSymRecordBytes)
- P.printBinaryBlock("Bytes", S.content());
- }
- if (HadError)
- return make_error<RawError>(
- raw_error_code::corrupt_file,
- "DBI stream contained corrupt symbol record");
- }
- if (!opts::shared::DumpModuleSubsections.empty()) {
- ListScope SS(P, "Subsections");
- auto ExpectedIpi = initializeTypeDatabase(StreamIPI);
- if (!ExpectedIpi)
- return ExpectedIpi.takeError();
- auto &Ipi = *ExpectedIpi;
- auto ExpectedStrings = File.getStringTable();
- if (!ExpectedStrings)
- return joinErrors(
- make_error<RawError>(raw_error_code::no_stream,
- "Could not get string table!"),
- ExpectedStrings.takeError());
-
- C13RawVisitor V(P, Tpi, Ipi);
- if (auto EC = codeview::visitDebugSubsections(
- ModS.subsections(), V, ExpectedStrings->getStringTable()))
- return EC;
- }
- }
- }
- }
- return Error::success();
-}
-
-Error LLVMOutputStyle::dumpSectionContribs() {
- if (!opts::raw::DumpSectionContribs)
- return Error::success();
- if (!File.hasPDBDbiStream()) {
- P.printString("DBI Stream not present");
- return Error::success();
- }
-
- auto Dbi = File.getPDBDbiStream();
- if (!Dbi)
- return Dbi.takeError();
-
- ListScope L(P, "Section Contributions");
- class Visitor : public ISectionContribVisitor {
- public:
- Visitor(ScopedPrinter &P, DbiStream &DS) : P(P), DS(DS) {}
- void visit(const SectionContrib &SC) override {
- DictScope D(P, "Contribution");
- P.printNumber("ISect", SC.ISect);
- P.printNumber("Off", SC.Off);
- P.printNumber("Size", SC.Size);
- P.printFlags("Characteristics", SC.Characteristics,
- codeview::getImageSectionCharacteristicNames(),
- COFF::SectionCharacteristics(0x00F00000));
- {
- DictScope DD(P, "Module");
- P.printNumber("Index", SC.Imod);
- const DbiModuleList &Modules = DS.modules();
- if (Modules.getModuleCount() > SC.Imod) {
- P.printString("Name",
- Modules.getModuleDescriptor(SC.Imod).getModuleName());
- }
- }
- P.printNumber("Data CRC", SC.DataCrc);
- P.printNumber("Reloc CRC", SC.RelocCrc);
- P.flush();
- }
- void visit(const SectionContrib2 &SC) override {
- visit(SC.Base);
- P.printNumber("ISect Coff", SC.ISectCoff);
- P.flush();
- }
-
- private:
- ScopedPrinter &P;
- DbiStream &DS;
- };
- Visitor V(P, *Dbi);
- Dbi->visitSectionContributions(V);
- return Error::success();
-}
-
-Error LLVMOutputStyle::dumpSectionMap() {
- if (!opts::raw::DumpSectionMap)
- return Error::success();
- if (!File.hasPDBDbiStream()) {
- P.printString("DBI Stream not present");
- return Error::success();
- }
-
- auto Dbi = File.getPDBDbiStream();
- if (!Dbi)
- return Dbi.takeError();
-
- ListScope L(P, "Section Map");
- for (auto &M : Dbi->getSectionMap()) {
- DictScope D(P, "Entry");
- P.printFlags("Flags", M.Flags, getOMFSegMapDescFlagNames());
- P.printNumber("Ovl", M.Ovl);
- P.printNumber("Group", M.Group);
- P.printNumber("Frame", M.Frame);
- P.printNumber("SecName", M.SecName);
- P.printNumber("ClassName", M.ClassName);
- P.printNumber("Offset", M.Offset);
- P.printNumber("SecByteLength", M.SecByteLength);
- P.flush();
- }
- return Error::success();
-}
-
-Error LLVMOutputStyle::dumpPublicsStream() {
- if (!opts::raw::DumpPublics)
- return Error::success();
- if (!File.hasPDBPublicsStream()) {
- P.printString("Publics Stream not present");
- return Error::success();
- }
-
- auto Publics = File.getPDBPublicsStream();
- if (!Publics)
- return Publics.takeError();
- DictScope D(P, "Publics Stream");
-
- auto Dbi = File.getPDBDbiStream();
- if (!Dbi)
- return Dbi.takeError();
-
- P.printNumber("Stream number", Dbi->getPublicSymbolStreamIndex());
- P.printNumber("SymHash", Publics->getSymHash());
- P.printNumber("AddrMap", Publics->getAddrMap());
- P.printNumber("Number of buckets", Publics->getNumBuckets());
- P.printList("Hash Buckets", Publics->getHashBuckets());
- P.printList("Address Map", Publics->getAddressMap());
- P.printList("Thunk Map", Publics->getThunkMap());
- P.printList("Section Offsets", Publics->getSectionOffsets(),
- printSectionOffset);
- ListScope L(P, "Symbols");
- auto ExpectedTypes = initializeTypeDatabase(StreamTPI);
- if (!ExpectedTypes)
- return ExpectedTypes.takeError();
- auto &Tpi = *ExpectedTypes;
-
- codeview::CVSymbolDumper SD(P, Tpi, CodeViewContainer::Pdb, nullptr, false);
- bool HadError = false;
- for (auto S : Publics->getSymbols(&HadError)) {
- DictScope DD(P, "");
-
- if (auto EC = SD.dump(S)) {
- HadError = true;
- break;
- }
- if (opts::raw::DumpSymRecordBytes)
- P.printBinaryBlock("Bytes", S.content());
- }
- if (HadError)
- return make_error<RawError>(
- raw_error_code::corrupt_file,
- "Public symbol stream contained corrupt record");
-
- return Error::success();
-}
-
-Error LLVMOutputStyle::dumpSectionHeaders() {
- if (!opts::raw::DumpSectionHeaders)
- return Error::success();
- if (!File.hasPDBDbiStream()) {
- P.printString("DBI Stream not present");
- return Error::success();
- }
-
- auto Dbi = File.getPDBDbiStream();
- if (!Dbi)
- return Dbi.takeError();
-
- ListScope D(P, "Section Headers");
- for (const object::coff_section &Section : Dbi->getSectionHeaders()) {
- DictScope DD(P, "");
-
- // If a name is 8 characters long, there is no NUL character at end.
- StringRef Name(Section.Name, strnlen(Section.Name, sizeof(Section.Name)));
- P.printString("Name", Name);
- P.printNumber("Virtual Size", Section.VirtualSize);
- P.printNumber("Virtual Address", Section.VirtualAddress);
- P.printNumber("Size of Raw Data", Section.SizeOfRawData);
- P.printNumber("File Pointer to Raw Data", Section.PointerToRawData);
- P.printNumber("File Pointer to Relocations", Section.PointerToRelocations);
- P.printNumber("File Pointer to Linenumbers", Section.PointerToLinenumbers);
- P.printNumber("Number of Relocations", Section.NumberOfRelocations);
- P.printNumber("Number of Linenumbers", Section.NumberOfLinenumbers);
- P.printFlags("Characteristics", Section.Characteristics,
- getImageSectionCharacteristicNames());
- }
- return Error::success();
-}
-
-Error LLVMOutputStyle::dumpFpoStream() {
- if (!opts::raw::DumpFpo)
- return Error::success();
- if (!File.hasPDBDbiStream()) {
- P.printString("DBI Stream not present");
- return Error::success();
- }
-
- auto Dbi = File.getPDBDbiStream();
- if (!Dbi)
- return Dbi.takeError();
-
- ListScope D(P, "New FPO");
- for (const object::FpoData &Fpo : Dbi->getFpoRecords()) {
- DictScope DD(P, "");
- P.printNumber("Offset", Fpo.Offset);
- P.printNumber("Size", Fpo.Size);
- P.printNumber("Number of locals", Fpo.NumLocals);
- P.printNumber("Number of params", Fpo.NumParams);
- P.printNumber("Size of Prolog", Fpo.getPrologSize());
- P.printNumber("Number of Saved Registers", Fpo.getNumSavedRegs());
- P.printBoolean("Has SEH", Fpo.hasSEH());
- P.printBoolean("Use BP", Fpo.useBP());
- P.printNumber("Frame Pointer", Fpo.getFP());
- }
- return Error::success();
-}
-
-void LLVMOutputStyle::flush() { P.flush(); }
diff --git a/llvm/tools/llvm-pdbdump/LLVMOutputStyle.h b/llvm/tools/llvm-pdbdump/LLVMOutputStyle.h
deleted file mode 100644
index 184dc4e1f44..00000000000
--- a/llvm/tools/llvm-pdbdump/LLVMOutputStyle.h
+++ /dev/null
@@ -1,70 +0,0 @@
-//===- LLVMOutputStyle.h -------------------------------------- *- C++ --*-===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef LLVM_TOOLS_LLVMPDBDUMP_LLVMOUTPUTSTYLE_H
-#define LLVM_TOOLS_LLVMPDBDUMP_LLVMOUTPUTSTYLE_H
-
-#include "OutputStyle.h"
-
-#include "llvm/ADT/Optional.h"
-#include "llvm/ADT/SmallVector.h"
-#include "llvm/DebugInfo/CodeView/TypeDatabase.h"
-#include "llvm/Support/ScopedPrinter.h"
-
-#include <string>
-
-namespace llvm {
-class BitVector;
-
-namespace codeview {
-class LazyRandomTypeCollection;
-}
-
-namespace pdb {
-class LLVMOutputStyle : public OutputStyle {
-public:
- LLVMOutputStyle(PDBFile &File);
-
- Error dump() override;
-
-private:
- Expected<codeview::LazyRandomTypeCollection &>
- initializeTypeDatabase(uint32_t SN);
-
- Error dumpFileHeaders();
- Error dumpStreamSummary();
- Error dumpFreePageMap();
- Error dumpBlockRanges();
- Error dumpGlobalsStream();
- Error dumpStreamBytes();
- Error dumpStreamBlocks();
- Error dumpStringTable();
- Error dumpInfoStream();
- Error dumpTpiStream(uint32_t StreamIdx);
- Error dumpDbiStream();
- Error dumpSectionContribs();
- Error dumpSectionMap();
- Error dumpPublicsStream();
- Error dumpSectionHeaders();
- Error dumpFpoStream();
-
- void dumpBitVector(StringRef Name, const BitVector &V);
-
- void flush();
-
- PDBFile &File;
- ScopedPrinter P;
- std::unique_ptr<codeview::LazyRandomTypeCollection> TpiTypes;
- std::unique_ptr<codeview::LazyRandomTypeCollection> IpiTypes;
- SmallVector<std::string, 32> StreamPurposes;
-};
-}
-}
-
-#endif
diff --git a/llvm/tools/llvm-pdbdump/LinePrinter.cpp b/llvm/tools/llvm-pdbdump/LinePrinter.cpp
deleted file mode 100644
index 7fa524400ae..00000000000
--- a/llvm/tools/llvm-pdbdump/LinePrinter.cpp
+++ /dev/null
@@ -1,145 +0,0 @@
-//===- LinePrinter.cpp ------------------------------------------*- C++ -*-===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#include "LinePrinter.h"
-
-#include "llvm-pdbdump.h"
-
-#include "llvm/ADT/STLExtras.h"
-#include "llvm/DebugInfo/PDB/UDTLayout.h"
-#include "llvm/Support/Regex.h"
-
-#include <algorithm>
-
-using namespace llvm;
-using namespace llvm::pdb;
-
-namespace {
-bool IsItemExcluded(llvm::StringRef Item,
- std::list<llvm::Regex> &IncludeFilters,
- std::list<llvm::Regex> &ExcludeFilters) {
- if (Item.empty())
- return false;
-
- auto match_pred = [Item](llvm::Regex &R) { return R.match(Item); };
-
- // Include takes priority over exclude. If the user specified include
- // filters, and none of them include this item, them item is gone.
- if (!IncludeFilters.empty() && !any_of(IncludeFilters, match_pred))
- return true;
-
- if (any_of(ExcludeFilters, match_pred))
- return true;
-
- return false;
-}
-}
-
-using namespace llvm;
-
-LinePrinter::LinePrinter(int Indent, bool UseColor, llvm::raw_ostream &Stream)
- : OS(Stream), IndentSpaces(Indent), CurrentIndent(0), UseColor(UseColor) {
- SetFilters(ExcludeTypeFilters, opts::pretty::ExcludeTypes.begin(),
- opts::pretty::ExcludeTypes.end());
- SetFilters(ExcludeSymbolFilters, opts::pretty::ExcludeSymbols.begin(),
- opts::pretty::ExcludeSymbols.end());
- SetFilters(ExcludeCompilandFilters, opts::pretty::ExcludeCompilands.begin(),
- opts::pretty::ExcludeCompilands.end());
-
- SetFilters(IncludeTypeFilters, opts::pretty::IncludeTypes.begin(),
- opts::pretty::IncludeTypes.end());
- SetFilters(IncludeSymbolFilters, opts::pretty::IncludeSymbols.begin(),
- opts::pretty::IncludeSymbols.end());
- SetFilters(IncludeCompilandFilters, opts::pretty::IncludeCompilands.begin(),
- opts::pretty::IncludeCompilands.end());
-}
-
-void LinePrinter::Indent() { CurrentIndent += IndentSpaces; }
-
-void LinePrinter::Unindent() {
- CurrentIndent = std::max(0, CurrentIndent - IndentSpaces);
-}
-
-void LinePrinter::NewLine() {
- OS << "\n";
- OS.indent(CurrentIndent);
-}
-
-bool LinePrinter::IsClassExcluded(const ClassLayout &Class) {
- if (IsTypeExcluded(Class.getName(), Class.getSize()))
- return true;
- if (Class.deepPaddingSize() < opts::pretty::PaddingThreshold)
- return true;
- return false;
-}
-
-bool LinePrinter::IsTypeExcluded(llvm::StringRef TypeName, uint32_t Size) {
- if (IsItemExcluded(TypeName, IncludeTypeFilters, ExcludeTypeFilters))
- return true;
- if (Size < opts::pretty::SizeThreshold)
- return true;
- return false;
-}
-
-bool LinePrinter::IsSymbolExcluded(llvm::StringRef SymbolName) {
- return IsItemExcluded(SymbolName, IncludeSymbolFilters, ExcludeSymbolFilters);
-}
-
-bool LinePrinter::IsCompilandExcluded(llvm::StringRef CompilandName) {
- return IsItemExcluded(CompilandName, IncludeCompilandFilters,
- ExcludeCompilandFilters);
-}
-
-WithColor::WithColor(LinePrinter &P, PDB_ColorItem C)
- : OS(P.OS), UseColor(P.hasColor()) {
- if (UseColor)
- applyColor(C);
-}
-
-WithColor::~WithColor() {
- if (UseColor)
- OS.resetColor();
-}
-
-void WithColor::applyColor(PDB_ColorItem C) {
- switch (C) {
- case PDB_ColorItem::None:
- OS.resetColor();
- return;
- case PDB_ColorItem::Comment:
- OS.changeColor(raw_ostream::GREEN, false);
- return;
- case PDB_ColorItem::Address:
- OS.changeColor(raw_ostream::YELLOW, /*bold=*/true);
- return;
- case PDB_ColorItem::Keyword:
- OS.changeColor(raw_ostream::MAGENTA, true);
- return;
- case PDB_ColorItem::Register:
- case PDB_ColorItem::Offset:
- OS.changeColor(raw_ostream::YELLOW, false);
- return;
- case PDB_ColorItem::Type:
- OS.changeColor(raw_ostream::CYAN, true);
- return;
- case PDB_ColorItem::Identifier:
- OS.changeColor(raw_ostream::CYAN, false);
- return;
- case PDB_ColorItem::Path:
- OS.changeColor(raw_ostream::CYAN, false);
- return;
- case PDB_ColorItem::Padding:
- case PDB_ColorItem::SectionHeader:
- OS.changeColor(raw_ostream::RED, true);
- return;
- case PDB_ColorItem::LiteralValue:
- OS.changeColor(raw_ostream::GREEN, true);
- return;
- }
-}
diff --git a/llvm/tools/llvm-pdbdump/LinePrinter.h b/llvm/tools/llvm-pdbdump/LinePrinter.h
deleted file mode 100644
index 1a922feb1e6..00000000000
--- a/llvm/tools/llvm-pdbdump/LinePrinter.h
+++ /dev/null
@@ -1,102 +0,0 @@
-//===- LinePrinter.h ------------------------------------------ *- C++ --*-===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef LLVM_TOOLS_LLVMPDBDUMP_LINEPRINTER_H
-#define LLVM_TOOLS_LLVMPDBDUMP_LINEPRINTER_H
-
-#include "llvm/ADT/StringRef.h"
-#include "llvm/ADT/Twine.h"
-#include "llvm/Support/raw_ostream.h"
-#include "llvm/Support/Regex.h"
-
-#include <list>
-
-namespace llvm {
-namespace pdb {
-
-class ClassLayout;
-
-class LinePrinter {
- friend class WithColor;
-
-public:
- LinePrinter(int Indent, bool UseColor, raw_ostream &Stream);
-
- void Indent();
- void Unindent();
- void NewLine();
-
- bool hasColor() const { return UseColor; }
- raw_ostream &getStream() { return OS; }
- int getIndentLevel() const { return CurrentIndent; }
-
- bool IsClassExcluded(const ClassLayout &Class);
- bool IsTypeExcluded(llvm::StringRef TypeName, uint32_t Size);
- bool IsSymbolExcluded(llvm::StringRef SymbolName);
- bool IsCompilandExcluded(llvm::StringRef CompilandName);
-
-private:
- template <typename Iter>
- void SetFilters(std::list<Regex> &List, Iter Begin, Iter End) {
- List.clear();
- for (; Begin != End; ++Begin)
- List.emplace_back(StringRef(*Begin));
- }
-
- raw_ostream &OS;
- int IndentSpaces;
- int CurrentIndent;
- bool UseColor;
-
- std::list<Regex> ExcludeCompilandFilters;
- std::list<Regex> ExcludeTypeFilters;
- std::list<Regex> ExcludeSymbolFilters;
-
- std::list<Regex> IncludeCompilandFilters;
- std::list<Regex> IncludeTypeFilters;
- std::list<Regex> IncludeSymbolFilters;
-};
-
-template <class T>
-inline raw_ostream &operator<<(LinePrinter &Printer, const T &Item) {
- Printer.getStream() << Item;
- return Printer.getStream();
-}
-
-enum class PDB_ColorItem {
- None,
- Address,
- Type,
- Comment,
- Padding,
- Keyword,
- Offset,
- Identifier,
- Path,
- SectionHeader,
- LiteralValue,
- Register,
-};
-
-class WithColor {
-public:
- WithColor(LinePrinter &P, PDB_ColorItem C);
- ~WithColor();
-
- raw_ostream &get() { return OS; }
-
-private:
- void applyColor(PDB_ColorItem C);
- raw_ostream &OS;
- bool UseColor;
-};
-}
-}
-
-#endif
diff --git a/llvm/tools/llvm-pdbdump/OutputStyle.h b/llvm/tools/llvm-pdbdump/OutputStyle.h
deleted file mode 100644
index dfefc25a215..00000000000
--- a/llvm/tools/llvm-pdbdump/OutputStyle.h
+++ /dev/null
@@ -1,28 +0,0 @@
-//===- OutputStyle.h ------------------------------------------ *- C++ --*-===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef LLVM_TOOLS_LLVMPDBDUMP_OUTPUTSTYLE_H
-#define LLVM_TOOLS_LLVMPDBDUMP_OUTPUTSTYLE_H
-
-#include "llvm/Support/Error.h"
-
-namespace llvm {
-namespace pdb {
-class PDBFile;
-
-class OutputStyle {
-public:
- virtual ~OutputStyle() {}
-
- virtual Error dump() = 0;
-};
-}
-}
-
-#endif
diff --git a/llvm/tools/llvm-pdbdump/PdbYaml.cpp b/llvm/tools/llvm-pdbdump/PdbYaml.cpp
deleted file mode 100644
index b4a41fbfdb8..00000000000
--- a/llvm/tools/llvm-pdbdump/PdbYaml.cpp
+++ /dev/null
@@ -1,227 +0,0 @@
-//===- PdbYAML.cpp -------------------------------------------- *- C++ --*-===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#include "PdbYaml.h"
-
-#include "llvm/ADT/StringExtras.h"
-#include "llvm/DebugInfo/CodeView/CVSymbolVisitor.h"
-#include "llvm/DebugInfo/CodeView/CVTypeVisitor.h"
-#include "llvm/DebugInfo/CodeView/DebugStringTableSubsection.h"
-#include "llvm/DebugInfo/CodeView/SymbolDeserializer.h"
-#include "llvm/DebugInfo/CodeView/SymbolVisitorCallbackPipeline.h"
-#include "llvm/DebugInfo/CodeView/TypeSerializer.h"
-#include "llvm/DebugInfo/CodeView/TypeVisitorCallbackPipeline.h"
-#include "llvm/DebugInfo/PDB/Native/PDBFile.h"
-#include "llvm/DebugInfo/PDB/Native/RawTypes.h"
-#include "llvm/DebugInfo/PDB/Native/TpiHashing.h"
-#include "llvm/DebugInfo/PDB/PDBExtras.h"
-#include "llvm/DebugInfo/PDB/PDBTypes.h"
-#include "llvm/ObjectYAML/CodeViewYAMLDebugSections.h"
-#include "llvm/ObjectYAML/CodeViewYAMLTypes.h"
-
-using namespace llvm;
-using namespace llvm::pdb;
-using namespace llvm::pdb::yaml;
-using namespace llvm::yaml;
-
-LLVM_YAML_IS_FLOW_SEQUENCE_VECTOR(uint32_t)
-LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::StringRef)
-LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::pdb::yaml::NamedStreamMapping)
-LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::pdb::yaml::PdbDbiModuleInfo)
-LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::pdb::yaml::StreamBlockList)
-LLVM_YAML_IS_FLOW_SEQUENCE_VECTOR(llvm::pdb::PdbRaw_FeatureSig)
-
-namespace llvm {
-namespace yaml {
-
-template <> struct ScalarTraits<llvm::pdb::PDB_UniqueId> {
- static void output(const llvm::pdb::PDB_UniqueId &S, void *,
- llvm::raw_ostream &OS) {
- OS << S;
- }
-
- static StringRef input(StringRef Scalar, void *Ctx,
- llvm::pdb::PDB_UniqueId &S) {
- if (Scalar.size() != 38)
- return "GUID strings are 38 characters long";
- if (Scalar[0] != '{' || Scalar[37] != '}')
- return "GUID is not enclosed in {}";
- if (Scalar[9] != '-' || Scalar[14] != '-' || Scalar[19] != '-' ||
- Scalar[24] != '-')
- return "GUID sections are not properly delineated with dashes";
-
- uint8_t *OutBuffer = S.Guid;
- for (auto Iter = Scalar.begin(); Iter != Scalar.end();) {
- if (*Iter == '-' || *Iter == '{' || *Iter == '}') {
- ++Iter;
- continue;
- }
- uint8_t Value = (llvm::hexDigitValue(*Iter) << 4);
- ++Iter;
- Value |= llvm::hexDigitValue(*Iter);
- ++Iter;
- *OutBuffer++ = Value;
- }
-
- return "";
- }
-
- static bool mustQuote(StringRef Scalar) { return needsQuotes(Scalar); }
-};
-
-template <> struct ScalarEnumerationTraits<llvm::pdb::PDB_Machine> {
- static void enumeration(IO &io, llvm::pdb::PDB_Machine &Value) {
- io.enumCase(Value, "Invalid", PDB_Machine::Invalid);
- io.enumCase(Value, "Am33", PDB_Machine::Am33);
- io.enumCase(Value, "Amd64", PDB_Machine::Amd64);
- io.enumCase(Value, "Arm", PDB_Machine::Arm);
- io.enumCase(Value, "ArmNT", PDB_Machine::ArmNT);
- io.enumCase(Value, "Ebc", PDB_Machine::Ebc);
- io.enumCase(Value, "x86", PDB_Machine::x86);
- io.enumCase(Value, "Ia64", PDB_Machine::Ia64);
- io.enumCase(Value, "M32R", PDB_Machine::M32R);
- io.enumCase(Value, "Mips16", PDB_Machine::Mips16);
- io.enumCase(Value, "MipsFpu", PDB_Machine::MipsFpu);
- io.enumCase(Value, "MipsFpu16", PDB_Machine::MipsFpu16);
- io.enumCase(Value, "PowerPCFP", PDB_Machine::PowerPCFP);
- io.enumCase(Value, "R4000", PDB_Machine::R4000);
- io.enumCase(Value, "SH3", PDB_Machine::SH3);
- io.enumCase(Value, "SH3DSP", PDB_Machine::SH3DSP);
- io.enumCase(Value, "Thumb", PDB_Machine::Thumb);
- io.enumCase(Value, "WceMipsV2", PDB_Machine::WceMipsV2);
- }
-};
-
-template <> struct ScalarEnumerationTraits<llvm::pdb::PdbRaw_DbiVer> {
- static void enumeration(IO &io, llvm::pdb::PdbRaw_DbiVer &Value) {
- io.enumCase(Value, "V41", llvm::pdb::PdbRaw_DbiVer::PdbDbiVC41);
- io.enumCase(Value, "V50", llvm::pdb::PdbRaw_DbiVer::PdbDbiV50);
- io.enumCase(Value, "V60", llvm::pdb::PdbRaw_DbiVer::PdbDbiV60);
- io.enumCase(Value, "V70", llvm::pdb::PdbRaw_DbiVer::PdbDbiV70);
- io.enumCase(Value, "V110", llvm::pdb::PdbRaw_DbiVer::PdbDbiV110);
- }
-};
-
-template <> struct ScalarEnumerationTraits<llvm::pdb::PdbRaw_ImplVer> {
- static void enumeration(IO &io, llvm::pdb::PdbRaw_ImplVer &Value) {
- io.enumCase(Value, "VC2", llvm::pdb::PdbRaw_ImplVer::PdbImplVC2);
- io.enumCase(Value, "VC4", llvm::pdb::PdbRaw_ImplVer::PdbImplVC4);
- io.enumCase(Value, "VC41", llvm::pdb::PdbRaw_ImplVer::PdbImplVC41);
- io.enumCase(Value, "VC50", llvm::pdb::PdbRaw_ImplVer::PdbImplVC50);
- io.enumCase(Value, "VC98", llvm::pdb::PdbRaw_ImplVer::PdbImplVC98);
- io.enumCase(Value, "VC70Dep", llvm::pdb::PdbRaw_ImplVer::PdbImplVC70Dep);
- io.enumCase(Value, "VC70", llvm::pdb::PdbRaw_ImplVer::PdbImplVC70);
- io.enumCase(Value, "VC80", llvm::pdb::PdbRaw_ImplVer::PdbImplVC80);
- io.enumCase(Value, "VC110", llvm::pdb::PdbRaw_ImplVer::PdbImplVC110);
- io.enumCase(Value, "VC140", llvm::pdb::PdbRaw_ImplVer::PdbImplVC140);
- }
-};
-
-template <> struct ScalarEnumerationTraits<llvm::pdb::PdbRaw_TpiVer> {
- static void enumeration(IO &io, llvm::pdb::PdbRaw_TpiVer &Value) {
- io.enumCase(Value, "VC40", llvm::pdb::PdbRaw_TpiVer::PdbTpiV40);
- io.enumCase(Value, "VC41", llvm::pdb::PdbRaw_TpiVer::PdbTpiV41);
- io.enumCase(Value, "VC50", llvm::pdb::PdbRaw_TpiVer::PdbTpiV50);
- io.enumCase(Value, "VC70", llvm::pdb::PdbRaw_TpiVer::PdbTpiV70);
- io.enumCase(Value, "VC80", llvm::pdb::PdbRaw_TpiVer::PdbTpiV80);
- }
-};
-
-template <> struct ScalarEnumerationTraits<llvm::pdb::PdbRaw_FeatureSig> {
- static void enumeration(IO &io, PdbRaw_FeatureSig &Features) {
- io.enumCase(Features, "MinimalDebugInfo",
- PdbRaw_FeatureSig::MinimalDebugInfo);
- io.enumCase(Features, "NoTypeMerge", PdbRaw_FeatureSig::NoTypeMerge);
- io.enumCase(Features, "VC110", PdbRaw_FeatureSig::VC110);
- io.enumCase(Features, "VC140", PdbRaw_FeatureSig::VC140);
- }
-};
-}
-}
-
-void MappingTraits<PdbObject>::mapping(IO &IO, PdbObject &Obj) {
- IO.mapOptional("MSF", Obj.Headers);
- IO.mapOptional("StreamSizes", Obj.StreamSizes);
- IO.mapOptional("StreamMap", Obj.StreamMap);
- IO.mapOptional("StringTable", Obj.StringTable);
- IO.mapOptional("PdbStream", Obj.PdbStream);
- IO.mapOptional("DbiStream", Obj.DbiStream);
- IO.mapOptional("TpiStream", Obj.TpiStream);
- IO.mapOptional("IpiStream", Obj.IpiStream);
-}
-
-void MappingTraits<MSFHeaders>::mapping(IO &IO, MSFHeaders &Obj) {
- IO.mapOptional("SuperBlock", Obj.SuperBlock);
- IO.mapOptional("NumDirectoryBlocks", Obj.NumDirectoryBlocks);
- IO.mapOptional("DirectoryBlocks", Obj.DirectoryBlocks);
- IO.mapOptional("NumStreams", Obj.NumStreams);
- IO.mapOptional("FileSize", Obj.FileSize);
-}
-
-void MappingTraits<msf::SuperBlock>::mapping(IO &IO, msf::SuperBlock &SB) {
- if (!IO.outputting()) {
- ::memcpy(SB.MagicBytes, msf::Magic, sizeof(msf::Magic));
- }
-
- using u32 = support::ulittle32_t;
- IO.mapOptional("BlockSize", SB.BlockSize, u32(4096U));
- IO.mapOptional("FreeBlockMap", SB.FreeBlockMapBlock, u32(0U));
- IO.mapOptional("NumBlocks", SB.NumBlocks, u32(0U));
- IO.mapOptional("NumDirectoryBytes", SB.NumDirectoryBytes, u32(0U));
- IO.mapOptional("Unknown1", SB.Unknown1, u32(0U));
- IO.mapOptional("BlockMapAddr", SB.BlockMapAddr, u32(0U));
-}
-
-void MappingTraits<StreamBlockList>::mapping(IO &IO, StreamBlockList &SB) {
- IO.mapRequired("Stream", SB.Blocks);
-}
-
-void MappingTraits<PdbInfoStream>::mapping(IO &IO, PdbInfoStream &Obj) {
- IO.mapOptional("Age", Obj.Age, 1U);
- IO.mapOptional("Guid", Obj.Guid);
- IO.mapOptional("Signature", Obj.Signature, 0U);
- IO.mapOptional("Features", Obj.Features);
- IO.mapOptional("Version", Obj.Version, PdbImplVC70);
-}
-
-void MappingTraits<PdbDbiStream>::mapping(IO &IO, PdbDbiStream &Obj) {
- IO.mapOptional("VerHeader", Obj.VerHeader, PdbDbiV70);
- IO.mapOptional("Age", Obj.Age, 1U);
- IO.mapOptional("BuildNumber", Obj.BuildNumber, uint16_t(0U));
- IO.mapOptional("PdbDllVersion", Obj.PdbDllVersion, 0U);
- IO.mapOptional("PdbDllRbld", Obj.PdbDllRbld, uint16_t(0U));
- IO.mapOptional("Flags", Obj.Flags, uint16_t(1U));
- IO.mapOptional("MachineType", Obj.MachineType, PDB_Machine::x86);
- IO.mapOptional("Modules", Obj.ModInfos);
-}
-
-void MappingTraits<PdbTpiStream>::mapping(IO &IO,
- pdb::yaml::PdbTpiStream &Obj) {
- IO.mapOptional("Version", Obj.Version, PdbTpiV80);
- IO.mapRequired("Records", Obj.Records);
-}
-
-void MappingTraits<NamedStreamMapping>::mapping(IO &IO,
- NamedStreamMapping &Obj) {
- IO.mapRequired("Name", Obj.StreamName);
- IO.mapRequired("StreamNum", Obj.StreamNumber);
-}
-
-void MappingTraits<PdbModiStream>::mapping(IO &IO, PdbModiStream &Obj) {
- IO.mapOptional("Signature", Obj.Signature, 4U);
- IO.mapRequired("Records", Obj.Symbols);
-}
-
-void MappingTraits<PdbDbiModuleInfo>::mapping(IO &IO, PdbDbiModuleInfo &Obj) {
- IO.mapRequired("Module", Obj.Mod);
- IO.mapOptional("ObjFile", Obj.Obj, Obj.Mod);
- IO.mapOptional("SourceFiles", Obj.SourceFiles);
- IO.mapOptional("Subsections", Obj.Subsections);
- IO.mapOptional("Modi", Obj.Modi);
-}
diff --git a/llvm/tools/llvm-pdbdump/PdbYaml.h b/llvm/tools/llvm-pdbdump/PdbYaml.h
deleted file mode 100644
index 62ed608916f..00000000000
--- a/llvm/tools/llvm-pdbdump/PdbYaml.h
+++ /dev/null
@@ -1,125 +0,0 @@
-//===- PdbYAML.h ---------------------------------------------- *- C++ --*-===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef LLVM_TOOLS_LLVMPDBDUMP_PDBYAML_H
-#define LLVM_TOOLS_LLVMPDBDUMP_PDBYAML_H
-
-#include "OutputStyle.h"
-
-#include "llvm/ADT/Optional.h"
-#include "llvm/DebugInfo/CodeView/SymbolRecord.h"
-#include "llvm/DebugInfo/CodeView/TypeRecord.h"
-#include "llvm/DebugInfo/MSF/MSFCommon.h"
-#include "llvm/DebugInfo/PDB/Native/PDBFile.h"
-#include "llvm/DebugInfo/PDB/Native/RawConstants.h"
-#include "llvm/DebugInfo/PDB/PDBTypes.h"
-#include "llvm/ObjectYAML/CodeViewYAMLDebugSections.h"
-#include "llvm/ObjectYAML/CodeViewYAMLSymbols.h"
-#include "llvm/ObjectYAML/CodeViewYAMLTypes.h"
-#include "llvm/Support/Endian.h"
-#include "llvm/Support/YAMLTraits.h"
-
-#include <vector>
-
-namespace llvm {
-namespace codeview {
-class DebugStringTableSubsection;
-}
-namespace pdb {
-
-namespace yaml {
-struct SerializationContext;
-
-struct MSFHeaders {
- msf::SuperBlock SuperBlock;
- uint32_t NumDirectoryBlocks = 0;
- std::vector<uint32_t> DirectoryBlocks;
- uint32_t NumStreams = 0;
- uint32_t FileSize = 0;
-};
-
-struct StreamBlockList {
- std::vector<uint32_t> Blocks;
-};
-
-struct NamedStreamMapping {
- StringRef StreamName;
- uint32_t StreamNumber;
-};
-
-struct PdbInfoStream {
- PdbRaw_ImplVer Version = PdbImplVC70;
- uint32_t Signature = 0;
- uint32_t Age = 1;
- PDB_UniqueId Guid;
- std::vector<PdbRaw_FeatureSig> Features;
- std::vector<NamedStreamMapping> NamedStreams;
-};
-
-struct PdbModiStream {
- uint32_t Signature;
- std::vector<CodeViewYAML::SymbolRecord> Symbols;
-};
-
-struct PdbDbiModuleInfo {
- StringRef Obj;
- StringRef Mod;
- std::vector<StringRef> SourceFiles;
- std::vector<CodeViewYAML::YAMLDebugSubsection> Subsections;
- Optional<PdbModiStream> Modi;
-};
-
-struct PdbDbiStream {
- PdbRaw_DbiVer VerHeader = PdbDbiV70;
- uint32_t Age = 1;
- uint16_t BuildNumber = 0;
- uint32_t PdbDllVersion = 0;
- uint16_t PdbDllRbld = 0;
- uint16_t Flags = 1;
- PDB_Machine MachineType = PDB_Machine::x86;
-
- std::vector<PdbDbiModuleInfo> ModInfos;
-};
-
-struct PdbTpiStream {
- PdbRaw_TpiVer Version = PdbTpiV80;
- std::vector<CodeViewYAML::LeafRecord> Records;
-};
-
-struct PdbObject {
- explicit PdbObject(BumpPtrAllocator &Allocator) : Allocator(Allocator) {}
-
- Optional<MSFHeaders> Headers;
- Optional<std::vector<uint32_t>> StreamSizes;
- Optional<std::vector<StreamBlockList>> StreamMap;
- Optional<PdbInfoStream> PdbStream;
- Optional<PdbDbiStream> DbiStream;
- Optional<PdbTpiStream> TpiStream;
- Optional<PdbTpiStream> IpiStream;
-
- Optional<std::vector<StringRef>> StringTable;
-
- BumpPtrAllocator &Allocator;
-};
-}
-}
-}
-
-LLVM_YAML_DECLARE_MAPPING_TRAITS(pdb::yaml::PdbObject)
-LLVM_YAML_DECLARE_MAPPING_TRAITS(pdb::yaml::MSFHeaders)
-LLVM_YAML_DECLARE_MAPPING_TRAITS(msf::SuperBlock)
-LLVM_YAML_DECLARE_MAPPING_TRAITS(pdb::yaml::StreamBlockList)
-LLVM_YAML_DECLARE_MAPPING_TRAITS(pdb::yaml::PdbInfoStream)
-LLVM_YAML_DECLARE_MAPPING_TRAITS(pdb::yaml::PdbDbiStream)
-LLVM_YAML_DECLARE_MAPPING_TRAITS(pdb::yaml::PdbTpiStream)
-LLVM_YAML_DECLARE_MAPPING_TRAITS(pdb::yaml::NamedStreamMapping)
-LLVM_YAML_DECLARE_MAPPING_TRAITS(pdb::yaml::PdbModiStream)
-LLVM_YAML_DECLARE_MAPPING_TRAITS(pdb::yaml::PdbDbiModuleInfo)
-
-#endif // LLVM_TOOLS_LLVMPDBDUMP_PDBYAML_H
diff --git a/llvm/tools/llvm-pdbdump/PrettyBuiltinDumper.cpp b/llvm/tools/llvm-pdbdump/PrettyBuiltinDumper.cpp
deleted file mode 100644
index 591d5e70cfd..00000000000
--- a/llvm/tools/llvm-pdbdump/PrettyBuiltinDumper.cpp
+++ /dev/null
@@ -1,94 +0,0 @@
-//===- PrettyBuiltinDumper.cpp ---------------------------------- *- C++ *-===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#include "PrettyBuiltinDumper.h"
-#include "LinePrinter.h"
-#include "llvm-pdbdump.h"
-
-#include "llvm/DebugInfo/PDB/PDBSymbolTypeBuiltin.h"
-
-using namespace llvm;
-using namespace llvm::pdb;
-
-BuiltinDumper::BuiltinDumper(LinePrinter &P)
- : PDBSymDumper(false), Printer(P) {}
-
-void BuiltinDumper::start(const PDBSymbolTypeBuiltin &Symbol) {
- if (Symbol.isConstType())
- WithColor(Printer, PDB_ColorItem::Keyword).get() << "const ";
- if (Symbol.isVolatileType())
- WithColor(Printer, PDB_ColorItem::Keyword).get() << "volatile ";
- WithColor(Printer, PDB_ColorItem::Type).get() << getTypeName(Symbol);
-}
-
-StringRef BuiltinDumper::getTypeName(const PDBSymbolTypeBuiltin &Symbol) {
- PDB_BuiltinType Type = Symbol.getBuiltinType();
- switch (Type) {
- case PDB_BuiltinType::Float:
- if (Symbol.getLength() == 4)
- return "float";
- return "double";
- case PDB_BuiltinType::UInt:
- switch (Symbol.getLength()) {
- case 8:
- return "unsigned __int64";
- case 4:
- return "unsigned int";
- case 2:
- return "unsigned short";
- case 1:
- return "unsigned char";
- default:
- return "unsigned";
- }
- case PDB_BuiltinType::Int:
- switch (Symbol.getLength()) {
- case 8:
- return "__int64";
- case 4:
- return "int";
- case 2:
- return "short";
- case 1:
- return "char";
- default:
- return "int";
- }
- case PDB_BuiltinType::Char:
- return "char";
- case PDB_BuiltinType::WCharT:
- return "wchar_t";
- case PDB_BuiltinType::Void:
- return "void";
- case PDB_BuiltinType::Long:
- return "long";
- case PDB_BuiltinType::ULong:
- return "unsigned long";
- case PDB_BuiltinType::Bool:
- return "bool";
- case PDB_BuiltinType::Currency:
- return "CURRENCY";
- case PDB_BuiltinType::Date:
- return "DATE";
- case PDB_BuiltinType::Variant:
- return "VARIANT";
- case PDB_BuiltinType::Complex:
- return "complex";
- case PDB_BuiltinType::Bitfield:
- return "bitfield";
- case PDB_BuiltinType::BSTR:
- return "BSTR";
- case PDB_BuiltinType::HResult:
- return "HRESULT";
- case PDB_BuiltinType::BCD:
- return "HRESULT";
- default:
- return "void";
- }
-}
diff --git a/llvm/tools/llvm-pdbdump/PrettyBuiltinDumper.h b/llvm/tools/llvm-pdbdump/PrettyBuiltinDumper.h
deleted file mode 100644
index fb6b0b172e6..00000000000
--- a/llvm/tools/llvm-pdbdump/PrettyBuiltinDumper.h
+++ /dev/null
@@ -1,35 +0,0 @@
-//===- PrettyBuiltinDumper.h ---------------------------------- *- C++ --*-===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef LLVM_TOOLS_LLVMPDBDUMP_PRETTYBUILTINDUMPER_H
-#define LLVM_TOOLS_LLVMPDBDUMP_PRETTYBUILTINDUMPER_H
-
-#include "llvm/ADT/StringRef.h"
-#include "llvm/DebugInfo/PDB/PDBSymDumper.h"
-
-namespace llvm {
-namespace pdb {
-
-class LinePrinter;
-
-class BuiltinDumper : public PDBSymDumper {
-public:
- BuiltinDumper(LinePrinter &P);
-
- void start(const PDBSymbolTypeBuiltin &Symbol);
-
-private:
- StringRef getTypeName(const PDBSymbolTypeBuiltin &Symbol);
-
- LinePrinter &Printer;
-};
-}
-}
-
-#endif
diff --git a/llvm/tools/llvm-pdbdump/PrettyClassDefinitionDumper.cpp b/llvm/tools/llvm-pdbdump/PrettyClassDefinitionDumper.cpp
deleted file mode 100644
index 90f7772001d..00000000000
--- a/llvm/tools/llvm-pdbdump/PrettyClassDefinitionDumper.cpp
+++ /dev/null
@@ -1,108 +0,0 @@
-//===- PrettyClassDefinitionDumper.cpp --------------------------*- C++ -*-===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#include "PrettyClassDefinitionDumper.h"
-
-#include "LinePrinter.h"
-#include "PrettyClassLayoutGraphicalDumper.h"
-#include "llvm-pdbdump.h"
-
-#include "llvm/ADT/APFloat.h"
-#include "llvm/ADT/SmallString.h"
-#include "llvm/DebugInfo/PDB/PDBSymbolTypeBaseClass.h"
-#include "llvm/DebugInfo/PDB/PDBSymbolTypeUDT.h"
-#include "llvm/DebugInfo/PDB/UDTLayout.h"
-
-#include "llvm/Support/Format.h"
-
-using namespace llvm;
-using namespace llvm::pdb;
-
-ClassDefinitionDumper::ClassDefinitionDumper(LinePrinter &P)
- : PDBSymDumper(true), Printer(P) {}
-
-void ClassDefinitionDumper::start(const PDBSymbolTypeUDT &Class) {
- assert(opts::pretty::ClassFormat !=
- opts::pretty::ClassDefinitionFormat::None);
-
- ClassLayout Layout(Class);
- start(Layout);
-}
-
-void ClassDefinitionDumper::start(const ClassLayout &Layout) {
- prettyPrintClassIntro(Layout);
-
- PrettyClassLayoutGraphicalDumper Dumper(Printer, 1, 0);
- DumpedAnything |= Dumper.start(Layout);
-
- prettyPrintClassOutro(Layout);
-}
-
-void ClassDefinitionDumper::prettyPrintClassIntro(const ClassLayout &Layout) {
- DumpedAnything = false;
- Printer.NewLine();
-
- uint32_t Size = Layout.getSize();
- const PDBSymbolTypeUDT &Class = Layout.getClass();
-
- WithColor(Printer, PDB_ColorItem::Keyword).get() << Class.getUdtKind() << " ";
- WithColor(Printer, PDB_ColorItem::Type).get() << Class.getName();
- WithColor(Printer, PDB_ColorItem::Comment).get() << " [sizeof = " << Size
- << "]";
- uint32_t BaseCount = Layout.bases().size();
- if (BaseCount > 0) {
- Printer.Indent();
- char NextSeparator = ':';
- for (auto BC : Layout.bases()) {
- const auto &Base = BC->getBase();
- if (Base.isIndirectVirtualBaseClass())
- continue;
-
- Printer.NewLine();
- Printer << NextSeparator << " ";
- WithColor(Printer, PDB_ColorItem::Keyword).get() << Base.getAccess();
- if (BC->isVirtualBase())
- WithColor(Printer, PDB_ColorItem::Keyword).get() << " virtual";
-
- WithColor(Printer, PDB_ColorItem::Type).get() << " " << Base.getName();
- NextSeparator = ',';
- }
-
- Printer.Unindent();
- }
-
- Printer << " {";
- Printer.Indent();
-}
-
-void ClassDefinitionDumper::prettyPrintClassOutro(const ClassLayout &Layout) {
- Printer.Unindent();
- if (DumpedAnything)
- Printer.NewLine();
- Printer << "}";
- Printer.NewLine();
- if (Layout.deepPaddingSize() > 0) {
- APFloat Pct(100.0 * (double)Layout.deepPaddingSize() /
- (double)Layout.getSize());
- SmallString<8> PctStr;
- Pct.toString(PctStr, 4);
- WithColor(Printer, PDB_ColorItem::Padding).get()
- << "Total padding " << Layout.deepPaddingSize() << " bytes (" << PctStr
- << "% of class size)";
- Printer.NewLine();
- APFloat Pct2(100.0 * (double)Layout.immediatePadding() /
- (double)Layout.getSize());
- PctStr.clear();
- Pct2.toString(PctStr, 4);
- WithColor(Printer, PDB_ColorItem::Padding).get()
- << "Immediate padding " << Layout.immediatePadding() << " bytes ("
- << PctStr << "% of class size)";
- Printer.NewLine();
- }
-}
diff --git a/llvm/tools/llvm-pdbdump/PrettyClassDefinitionDumper.h b/llvm/tools/llvm-pdbdump/PrettyClassDefinitionDumper.h
deleted file mode 100644
index 6569a1d304f..00000000000
--- a/llvm/tools/llvm-pdbdump/PrettyClassDefinitionDumper.h
+++ /dev/null
@@ -1,47 +0,0 @@
-//===- PrettyClassDefinitionDumper.h ----------------------------*- C++ -*-===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef LLVM_TOOLS_LLVMPDBDUMP_PRETTYCLASSDEFINITIONDUMPER_H
-#define LLVM_TOOLS_LLVMPDBDUMP_PRETTYCLASSDEFINITIONDUMPER_H
-
-#include "llvm/ADT/BitVector.h"
-
-#include "llvm/DebugInfo/PDB/PDBSymDumper.h"
-#include "llvm/DebugInfo/PDB/PDBSymbolData.h"
-#include "llvm/DebugInfo/PDB/PDBSymbolFunc.h"
-
-#include <list>
-#include <memory>
-#include <unordered_map>
-
-namespace llvm {
-class BitVector;
-
-namespace pdb {
-
-class ClassLayout;
-class LinePrinter;
-
-class ClassDefinitionDumper : public PDBSymDumper {
-public:
- ClassDefinitionDumper(LinePrinter &P);
-
- void start(const PDBSymbolTypeUDT &Class);
- void start(const ClassLayout &Class);
-
-private:
- void prettyPrintClassIntro(const ClassLayout &Class);
- void prettyPrintClassOutro(const ClassLayout &Class);
-
- LinePrinter &Printer;
- bool DumpedAnything = false;
-};
-}
-}
-#endif
diff --git a/llvm/tools/llvm-pdbdump/PrettyClassLayoutGraphicalDumper.cpp b/llvm/tools/llvm-pdbdump/PrettyClassLayoutGraphicalDumper.cpp
deleted file mode 100644
index d1147267962..00000000000
--- a/llvm/tools/llvm-pdbdump/PrettyClassLayoutGraphicalDumper.cpp
+++ /dev/null
@@ -1,216 +0,0 @@
-//===- PrettyClassLayoutGraphicalDumper.h -----------------------*- C++ -*-===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#include "PrettyClassLayoutGraphicalDumper.h"
-
-#include "LinePrinter.h"
-#include "PrettyClassDefinitionDumper.h"
-#include "PrettyEnumDumper.h"
-#include "PrettyFunctionDumper.h"
-#include "PrettyTypedefDumper.h"
-#include "PrettyVariableDumper.h"
-#include "PrettyVariableDumper.h"
-#include "llvm-pdbdump.h"
-
-#include "llvm/DebugInfo/PDB/PDBSymbolData.h"
-#include "llvm/DebugInfo/PDB/PDBSymbolTypeBaseClass.h"
-#include "llvm/DebugInfo/PDB/PDBSymbolTypeUDT.h"
-#include "llvm/DebugInfo/PDB/UDTLayout.h"
-#include "llvm/Support/Format.h"
-
-using namespace llvm;
-using namespace llvm::pdb;
-
-PrettyClassLayoutGraphicalDumper::PrettyClassLayoutGraphicalDumper(
- LinePrinter &P, uint32_t RecurseLevel, uint32_t InitialOffset)
- : PDBSymDumper(true), Printer(P), RecursionLevel(RecurseLevel),
- ClassOffsetZero(InitialOffset), CurrentAbsoluteOffset(InitialOffset) {}
-
-bool PrettyClassLayoutGraphicalDumper::start(const UDTLayoutBase &Layout) {
-
- if (RecursionLevel == 1 &&
- opts::pretty::ClassFormat == opts::pretty::ClassDefinitionFormat::All) {
- for (auto &Other : Layout.other_items())
- Other->dump(*this);
- for (auto &Func : Layout.funcs())
- Func->dump(*this);
- }
-
- const BitVector &UseMap = Layout.usedBytes();
- int NextPaddingByte = UseMap.find_first_unset();
-
- for (auto &Item : Layout.layout_items()) {
- // Calculate the absolute offset of the first byte of the next field.
- uint32_t RelativeOffset = Item->getOffsetInParent();
- CurrentAbsoluteOffset = ClassOffsetZero + RelativeOffset;
-
- // Since there is storage there, it should be set! However, this might
- // be an empty base, in which case it could extend outside the bounds of
- // the parent class.
- if (RelativeOffset < UseMap.size() && (Item->getSize() > 0)) {
- assert(UseMap.test(RelativeOffset));
-
- // If there is any remaining padding in this class, and the offset of the
- // new item is after the padding, then we must have just jumped over some
- // padding. Print a padding row and then look for where the next block
- // of padding begins.
- if ((NextPaddingByte >= 0) &&
- (RelativeOffset > uint32_t(NextPaddingByte))) {
- printPaddingRow(RelativeOffset - NextPaddingByte);
- NextPaddingByte = UseMap.find_next_unset(RelativeOffset);
- }
- }
-
- CurrentItem = Item;
- if (Item->isVBPtr()) {
- VTableLayoutItem &Layout = static_cast<VTableLayoutItem &>(*CurrentItem);
-
- VariableDumper VarDumper(Printer);
- VarDumper.startVbptr(CurrentAbsoluteOffset, Layout.getSize());
- } else {
- if (auto Sym = Item->getSymbol())
- Sym->dump(*this);
- }
-
- if (Item->getLayoutSize() > 0) {
- uint32_t Prev = RelativeOffset + Item->getLayoutSize() - 1;
- if (Prev < UseMap.size())
- NextPaddingByte = UseMap.find_next_unset(Prev);
- }
- }
-
- auto TailPadding = Layout.tailPadding();
- if (TailPadding > 0) {
- if (TailPadding != 1 || Layout.getSize() != 1) {
- Printer.NewLine();
- WithColor(Printer, PDB_ColorItem::Padding).get()
- << "<padding> (" << TailPadding << " bytes)";
- DumpedAnything = true;
- }
- }
-
- return DumpedAnything;
-}
-
-void PrettyClassLayoutGraphicalDumper::printPaddingRow(uint32_t Amount) {
- if (Amount == 0)
- return;
-
- Printer.NewLine();
- WithColor(Printer, PDB_ColorItem::Padding).get() << "<padding> (" << Amount
- << " bytes)";
- DumpedAnything = true;
-}
-
-void PrettyClassLayoutGraphicalDumper::dump(
- const PDBSymbolTypeBaseClass &Symbol) {
- assert(CurrentItem != nullptr);
-
- Printer.NewLine();
- BaseClassLayout &Layout = static_cast<BaseClassLayout &>(*CurrentItem);
-
- std::string Label = "base";
- if (Layout.isVirtualBase()) {
- Label.insert(Label.begin(), 'v');
- if (Layout.getBase().isIndirectVirtualBaseClass())
- Label.insert(Label.begin(), 'i');
- }
- Printer << Label << " ";
-
- uint32_t Size = Layout.isEmptyBase() ? 1 : Layout.getLayoutSize();
-
- WithColor(Printer, PDB_ColorItem::Offset).get()
- << "+" << format_hex(CurrentAbsoluteOffset, 4) << " [sizeof=" << Size
- << "] ";
-
- WithColor(Printer, PDB_ColorItem::Identifier).get() << Layout.getName();
-
- if (shouldRecurse()) {
- Printer.Indent();
- uint32_t ChildOffsetZero = ClassOffsetZero + Layout.getOffsetInParent();
- PrettyClassLayoutGraphicalDumper BaseDumper(Printer, RecursionLevel + 1,
- ChildOffsetZero);
- DumpedAnything |= BaseDumper.start(Layout);
- Printer.Unindent();
- }
-
- DumpedAnything = true;
-}
-
-bool PrettyClassLayoutGraphicalDumper::shouldRecurse() const {
- uint32_t Limit = opts::pretty::ClassRecursionDepth;
- if (Limit == 0)
- return true;
- return RecursionLevel < Limit;
-}
-
-void PrettyClassLayoutGraphicalDumper::dump(const PDBSymbolData &Symbol) {
- assert(CurrentItem != nullptr);
-
- DataMemberLayoutItem &Layout =
- static_cast<DataMemberLayoutItem &>(*CurrentItem);
-
- VariableDumper VarDumper(Printer);
- VarDumper.start(Symbol, ClassOffsetZero);
-
- if (Layout.hasUDTLayout() && shouldRecurse()) {
- uint32_t ChildOffsetZero = ClassOffsetZero + Layout.getOffsetInParent();
- Printer.Indent();
- PrettyClassLayoutGraphicalDumper TypeDumper(Printer, RecursionLevel + 1,
- ChildOffsetZero);
- TypeDumper.start(Layout.getUDTLayout());
- Printer.Unindent();
- }
-
- DumpedAnything = true;
-}
-
-void PrettyClassLayoutGraphicalDumper::dump(const PDBSymbolTypeVTable &Symbol) {
- assert(CurrentItem != nullptr);
-
- VariableDumper VarDumper(Printer);
- VarDumper.start(Symbol, ClassOffsetZero);
-
- DumpedAnything = true;
-}
-
-void PrettyClassLayoutGraphicalDumper::dump(const PDBSymbolTypeEnum &Symbol) {
- DumpedAnything = true;
- Printer.NewLine();
- EnumDumper Dumper(Printer);
- Dumper.start(Symbol);
-}
-
-void PrettyClassLayoutGraphicalDumper::dump(
- const PDBSymbolTypeTypedef &Symbol) {
- DumpedAnything = true;
- Printer.NewLine();
- TypedefDumper Dumper(Printer);
- Dumper.start(Symbol);
-}
-
-void PrettyClassLayoutGraphicalDumper::dump(
- const PDBSymbolTypeBuiltin &Symbol) {}
-
-void PrettyClassLayoutGraphicalDumper::dump(const PDBSymbolTypeUDT &Symbol) {}
-
-void PrettyClassLayoutGraphicalDumper::dump(const PDBSymbolFunc &Symbol) {
- if (Printer.IsSymbolExcluded(Symbol.getName()))
- return;
- if (Symbol.isCompilerGenerated() && opts::pretty::ExcludeCompilerGenerated)
- return;
- if (Symbol.getLength() == 0 && !Symbol.isPureVirtual() &&
- !Symbol.isIntroVirtualFunction())
- return;
-
- DumpedAnything = true;
- Printer.NewLine();
- FunctionDumper Dumper(Printer);
- Dumper.start(Symbol, FunctionDumper::PointerType::None);
-}
diff --git a/llvm/tools/llvm-pdbdump/PrettyClassLayoutGraphicalDumper.h b/llvm/tools/llvm-pdbdump/PrettyClassLayoutGraphicalDumper.h
deleted file mode 100644
index f83f1a6c1b3..00000000000
--- a/llvm/tools/llvm-pdbdump/PrettyClassLayoutGraphicalDumper.h
+++ /dev/null
@@ -1,58 +0,0 @@
-//===- PrettyClassLayoutGraphicalDumper.h -----------------------*- C++ -*-===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef LLVM_TOOLS_LLVMPDBDUMP_PRETTYCLASSLAYOUTGRAPHICALDUMPER_H
-#define LLVM_TOOLS_LLVMPDBDUMP_PRETTYCLASSLAYOUTGRAPHICALDUMPER_H
-
-#include "llvm/ADT/BitVector.h"
-
-#include "llvm/DebugInfo/PDB/PDBSymDumper.h"
-
-namespace llvm {
-
-namespace pdb {
-
-class UDTLayoutBase;
-class LayoutItemBase;
-class LinePrinter;
-
-class PrettyClassLayoutGraphicalDumper : public PDBSymDumper {
-public:
- PrettyClassLayoutGraphicalDumper(LinePrinter &P, uint32_t RecurseLevel,
- uint32_t InitialOffset);
-
- bool start(const UDTLayoutBase &Layout);
-
- // Layout based symbol types.
- void dump(const PDBSymbolTypeBaseClass &Symbol) override;
- void dump(const PDBSymbolData &Symbol) override;
- void dump(const PDBSymbolTypeVTable &Symbol) override;
-
- // Non layout-based symbol types.
- void dump(const PDBSymbolTypeEnum &Symbol) override;
- void dump(const PDBSymbolFunc &Symbol) override;
- void dump(const PDBSymbolTypeTypedef &Symbol) override;
- void dump(const PDBSymbolTypeUDT &Symbol) override;
- void dump(const PDBSymbolTypeBuiltin &Symbol) override;
-
-private:
- bool shouldRecurse() const;
- void printPaddingRow(uint32_t Amount);
-
- LinePrinter &Printer;
-
- LayoutItemBase *CurrentItem = nullptr;
- uint32_t RecursionLevel = 0;
- uint32_t ClassOffsetZero = 0;
- uint32_t CurrentAbsoluteOffset = 0;
- bool DumpedAnything = false;
-};
-}
-}
-#endif
diff --git a/llvm/tools/llvm-pdbdump/PrettyCompilandDumper.cpp b/llvm/tools/llvm-pdbdump/PrettyCompilandDumper.cpp
deleted file mode 100644
index 9cf7bf82a16..00000000000
--- a/llvm/tools/llvm-pdbdump/PrettyCompilandDumper.cpp
+++ /dev/null
@@ -1,207 +0,0 @@
-//===- PrettyCompilandDumper.cpp - llvm-pdbdump compiland dumper -*- C++ *-===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#include "PrettyCompilandDumper.h"
-
-#include "LinePrinter.h"
-#include "PrettyFunctionDumper.h"
-#include "llvm-pdbdump.h"
-
-#include "llvm/DebugInfo/PDB/IPDBEnumChildren.h"
-#include "llvm/DebugInfo/PDB/IPDBLineNumber.h"
-#include "llvm/DebugInfo/PDB/IPDBSession.h"
-#include "llvm/DebugInfo/PDB/IPDBSourceFile.h"
-#include "llvm/DebugInfo/PDB/PDBExtras.h"
-#include "llvm/DebugInfo/PDB/PDBSymbol.h"
-#include "llvm/DebugInfo/PDB/PDBSymbolCompiland.h"
-#include "llvm/DebugInfo/PDB/PDBSymbolData.h"
-#include "llvm/DebugInfo/PDB/PDBSymbolFunc.h"
-#include "llvm/DebugInfo/PDB/PDBSymbolFuncDebugEnd.h"
-#include "llvm/DebugInfo/PDB/PDBSymbolFuncDebugStart.h"
-#include "llvm/DebugInfo/PDB/PDBSymbolLabel.h"
-#include "llvm/DebugInfo/PDB/PDBSymbolThunk.h"
-#include "llvm/DebugInfo/PDB/PDBSymbolTypeFunctionSig.h"
-#include "llvm/DebugInfo/PDB/PDBSymbolUnknown.h"
-#include "llvm/Support/Format.h"
-#include "llvm/Support/Path.h"
-#include "llvm/Support/raw_ostream.h"
-
-#include <utility>
-
-using namespace llvm;
-using namespace llvm::pdb;
-
-CompilandDumper::CompilandDumper(LinePrinter &P)
- : PDBSymDumper(true), Printer(P) {}
-
-void CompilandDumper::dump(const PDBSymbolCompilandDetails &Symbol) {}
-
-void CompilandDumper::dump(const PDBSymbolCompilandEnv &Symbol) {}
-
-void CompilandDumper::start(const PDBSymbolCompiland &Symbol,
- CompilandDumpFlags opts) {
- std::string FullName = Symbol.getName();
- if (Printer.IsCompilandExcluded(FullName))
- return;
-
- Printer.NewLine();
- WithColor(Printer, PDB_ColorItem::Path).get() << FullName;
-
- if (opts & Flags::Lines) {
- const IPDBSession &Session = Symbol.getSession();
- auto Files = Session.getSourceFilesForCompiland(Symbol);
- Printer.Indent();
- while (auto File = Files->getNext()) {
- Printer.NewLine();
- WithColor(Printer, PDB_ColorItem::Path).get() << File->getFileName();
-
- auto Lines = Session.findLineNumbers(Symbol, *File);
- Printer.Indent();
- while (auto Line = Lines->getNext()) {
- Printer.NewLine();
- uint32_t LineStart = Line->getLineNumber();
- uint32_t LineEnd = Line->getLineNumberEnd();
-
- Printer << "Line ";
- PDB_ColorItem StatementColor = Line->isStatement()
- ? PDB_ColorItem::Keyword
- : PDB_ColorItem::LiteralValue;
- WithColor(Printer, StatementColor).get() << LineStart;
- if (LineStart != LineEnd)
- WithColor(Printer, StatementColor).get() << " - " << LineEnd;
-
- uint32_t ColumnStart = Line->getColumnNumber();
- uint32_t ColumnEnd = Line->getColumnNumberEnd();
- if (ColumnStart != 0 || ColumnEnd != 0) {
- Printer << ", Column: ";
- WithColor(Printer, StatementColor).get() << ColumnStart;
- if (ColumnEnd != ColumnStart)
- WithColor(Printer, StatementColor).get() << " - " << ColumnEnd;
- }
-
- Printer << ", Address: ";
- if (Line->getLength() > 0) {
- uint64_t AddrStart = Line->getVirtualAddress();
- uint64_t AddrEnd = AddrStart + Line->getLength() - 1;
- WithColor(Printer, PDB_ColorItem::Address).get()
- << "[" << format_hex(AddrStart, 10) << " - "
- << format_hex(AddrEnd, 10) << "]";
- Printer << " (" << Line->getLength() << " bytes)";
- } else {
- uint64_t AddrStart = Line->getVirtualAddress();
- WithColor(Printer, PDB_ColorItem::Address).get()
- << "[" << format_hex(AddrStart, 10) << "] ";
- Printer << "(0 bytes)";
- }
- }
- Printer.Unindent();
- }
- Printer.Unindent();
- }
-
- if (opts & Flags::Children) {
- auto ChildrenEnum = Symbol.findAllChildren();
- Printer.Indent();
- while (auto Child = ChildrenEnum->getNext())
- Child->dump(*this);
- Printer.Unindent();
- }
-}
-
-void CompilandDumper::dump(const PDBSymbolData &Symbol) {
- if (!shouldDumpSymLevel(opts::pretty::SymLevel::Data))
- return;
- if (Printer.IsSymbolExcluded(Symbol.getName()))
- return;
-
- Printer.NewLine();
-
- switch (auto LocType = Symbol.getLocationType()) {
- case PDB_LocType::Static:
- Printer << "data: ";
- WithColor(Printer, PDB_ColorItem::Address).get()
- << "[" << format_hex(Symbol.getVirtualAddress(), 10) << "]";
-
- WithColor(Printer, PDB_ColorItem::Comment).get()
- << " [sizeof = " << getTypeLength(Symbol) << "]";
-
- break;
- case PDB_LocType::Constant:
- Printer << "constant: ";
- WithColor(Printer, PDB_ColorItem::LiteralValue).get()
- << "[" << Symbol.getValue() << "]";
- WithColor(Printer, PDB_ColorItem::Comment).get()
- << " [sizeof = " << getTypeLength(Symbol) << "]";
- break;
- default:
- Printer << "data(unexpected type=" << LocType << ")";
- }
-
- Printer << " ";
- WithColor(Printer, PDB_ColorItem::Identifier).get() << Symbol.getName();
-}
-
-void CompilandDumper::dump(const PDBSymbolFunc &Symbol) {
- if (!shouldDumpSymLevel(opts::pretty::SymLevel::Functions))
- return;
- if (Symbol.getLength() == 0)
- return;
- if (Printer.IsSymbolExcluded(Symbol.getName()))
- return;
-
- Printer.NewLine();
- FunctionDumper Dumper(Printer);
- Dumper.start(Symbol, FunctionDumper::PointerType::None);
-}
-
-void CompilandDumper::dump(const PDBSymbolLabel &Symbol) {
- if (Printer.IsSymbolExcluded(Symbol.getName()))
- return;
-
- Printer.NewLine();
- Printer << "label ";
- WithColor(Printer, PDB_ColorItem::Address).get()
- << "[" << format_hex(Symbol.getVirtualAddress(), 10) << "] ";
- WithColor(Printer, PDB_ColorItem::Identifier).get() << Symbol.getName();
-}
-
-void CompilandDumper::dump(const PDBSymbolThunk &Symbol) {
- if (!shouldDumpSymLevel(opts::pretty::SymLevel::Thunks))
- return;
- if (Printer.IsSymbolExcluded(Symbol.getName()))
- return;
-
- Printer.NewLine();
- Printer << "thunk ";
- codeview::ThunkOrdinal Ordinal = Symbol.getThunkOrdinal();
- uint64_t VA = Symbol.getVirtualAddress();
- if (Ordinal == codeview::ThunkOrdinal::TrampIncremental) {
- uint64_t Target = Symbol.getTargetVirtualAddress();
- WithColor(Printer, PDB_ColorItem::Address).get() << format_hex(VA, 10);
- Printer << " -> ";
- WithColor(Printer, PDB_ColorItem::Address).get() << format_hex(Target, 10);
- } else {
- WithColor(Printer, PDB_ColorItem::Address).get()
- << "[" << format_hex(VA, 10) << " - "
- << format_hex(VA + Symbol.getLength(), 10) << "]";
- }
- Printer << " (";
- WithColor(Printer, PDB_ColorItem::Register).get() << Ordinal;
- Printer << ") ";
- std::string Name = Symbol.getName();
- if (!Name.empty())
- WithColor(Printer, PDB_ColorItem::Identifier).get() << Name;
-}
-
-void CompilandDumper::dump(const PDBSymbolTypeTypedef &Symbol) {}
-
-void CompilandDumper::dump(const PDBSymbolUnknown &Symbol) {
- Printer.NewLine();
- Printer << "unknown (" << Symbol.getSymTag() << ")";
-}
diff --git a/llvm/tools/llvm-pdbdump/PrettyCompilandDumper.h b/llvm/tools/llvm-pdbdump/PrettyCompilandDumper.h
deleted file mode 100644
index 2127e7d1f52..00000000000
--- a/llvm/tools/llvm-pdbdump/PrettyCompilandDumper.h
+++ /dev/null
@@ -1,44 +0,0 @@
-//===- PrettyCompilandDumper.h - llvm-pdbdump compiland dumper -*- C++ --*-===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef LLVM_TOOLS_LLVMPDBDUMP_PRETTYCOMPILANDDUMPER_H
-#define LLVM_TOOLS_LLVMPDBDUMP_PRETTYCOMPILANDDUMPER_H
-
-#include "llvm/DebugInfo/PDB/PDBSymDumper.h"
-
-namespace llvm {
-namespace pdb {
-
-class LinePrinter;
-
-typedef int CompilandDumpFlags;
-class CompilandDumper : public PDBSymDumper {
-public:
- enum Flags { None = 0x0, Children = 0x1, Symbols = 0x2, Lines = 0x4 };
-
- CompilandDumper(LinePrinter &P);
-
- void start(const PDBSymbolCompiland &Symbol, CompilandDumpFlags flags);
-
- void dump(const PDBSymbolCompilandDetails &Symbol) override;
- void dump(const PDBSymbolCompilandEnv &Symbol) override;
- void dump(const PDBSymbolData &Symbol) override;
- void dump(const PDBSymbolFunc &Symbol) override;
- void dump(const PDBSymbolLabel &Symbol) override;
- void dump(const PDBSymbolThunk &Symbol) override;
- void dump(const PDBSymbolTypeTypedef &Symbol) override;
- void dump(const PDBSymbolUnknown &Symbol) override;
-
-private:
- LinePrinter &Printer;
-};
-}
-}
-
-#endif
diff --git a/llvm/tools/llvm-pdbdump/PrettyEnumDumper.cpp b/llvm/tools/llvm-pdbdump/PrettyEnumDumper.cpp
deleted file mode 100644
index 965ca1b9f98..00000000000
--- a/llvm/tools/llvm-pdbdump/PrettyEnumDumper.cpp
+++ /dev/null
@@ -1,53 +0,0 @@
-//===- PrettyEnumDumper.cpp -------------------------------------*- C++ -*-===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#include "PrettyEnumDumper.h"
-
-#include "LinePrinter.h"
-#include "PrettyBuiltinDumper.h"
-#include "llvm-pdbdump.h"
-
-#include "llvm/DebugInfo/PDB/PDBSymbolData.h"
-#include "llvm/DebugInfo/PDB/PDBSymbolTypeBuiltin.h"
-#include "llvm/DebugInfo/PDB/PDBSymbolTypeEnum.h"
-
-using namespace llvm;
-using namespace llvm::pdb;
-
-EnumDumper::EnumDumper(LinePrinter &P) : PDBSymDumper(true), Printer(P) {}
-
-void EnumDumper::start(const PDBSymbolTypeEnum &Symbol) {
- WithColor(Printer, PDB_ColorItem::Keyword).get() << "enum ";
- WithColor(Printer, PDB_ColorItem::Type).get() << Symbol.getName();
- if (!opts::pretty::NoEnumDefs) {
- auto BuiltinType = Symbol.getUnderlyingType();
- if (BuiltinType->getBuiltinType() != PDB_BuiltinType::Int ||
- BuiltinType->getLength() != 4) {
- Printer << " : ";
- BuiltinDumper Dumper(Printer);
- Dumper.start(*BuiltinType);
- }
- Printer << " {";
- Printer.Indent();
- auto EnumValues = Symbol.findAllChildren<PDBSymbolData>();
- while (auto EnumValue = EnumValues->getNext()) {
- if (EnumValue->getDataKind() != PDB_DataKind::Constant)
- continue;
- Printer.NewLine();
- WithColor(Printer, PDB_ColorItem::Identifier).get()
- << EnumValue->getName();
- Printer << " = ";
- WithColor(Printer, PDB_ColorItem::LiteralValue).get()
- << EnumValue->getValue();
- }
- Printer.Unindent();
- Printer.NewLine();
- Printer << "}";
- }
-}
diff --git a/llvm/tools/llvm-pdbdump/PrettyEnumDumper.h b/llvm/tools/llvm-pdbdump/PrettyEnumDumper.h
deleted file mode 100644
index c6e65a6d177..00000000000
--- a/llvm/tools/llvm-pdbdump/PrettyEnumDumper.h
+++ /dev/null
@@ -1,31 +0,0 @@
-//===- PrettyEnumDumper.h ---------------------------------------*- C++ -*-===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef LLVM_TOOLS_LLVMPDBDUMP_PRETTYENUMDUMPER_H
-#define LLVM_TOOLS_LLVMPDBDUMP_PRETTYENUMDUMPER_H
-
-#include "llvm/DebugInfo/PDB/PDBSymDumper.h"
-
-namespace llvm {
-namespace pdb {
-
-class LinePrinter;
-
-class EnumDumper : public PDBSymDumper {
-public:
- EnumDumper(LinePrinter &P);
-
- void start(const PDBSymbolTypeEnum &Symbol);
-
-private:
- LinePrinter &Printer;
-};
-}
-}
-#endif
diff --git a/llvm/tools/llvm-pdbdump/PrettyExternalSymbolDumper.cpp b/llvm/tools/llvm-pdbdump/PrettyExternalSymbolDumper.cpp
deleted file mode 100644
index fc40d90cee9..00000000000
--- a/llvm/tools/llvm-pdbdump/PrettyExternalSymbolDumper.cpp
+++ /dev/null
@@ -1,41 +0,0 @@
-//===- PrettyExternalSymbolDumper.cpp -------------------------- *- C++ *-===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#include "PrettyExternalSymbolDumper.h"
-#include "LinePrinter.h"
-
-#include "llvm/DebugInfo/PDB/PDBSymbolExe.h"
-#include "llvm/DebugInfo/PDB/PDBSymbolPublicSymbol.h"
-#include "llvm/Support/Format.h"
-
-using namespace llvm;
-using namespace llvm::pdb;
-
-ExternalSymbolDumper::ExternalSymbolDumper(LinePrinter &P)
- : PDBSymDumper(true), Printer(P) {}
-
-void ExternalSymbolDumper::start(const PDBSymbolExe &Symbol) {
- auto Vars = Symbol.findAllChildren<PDBSymbolPublicSymbol>();
- while (auto Var = Vars->getNext())
- Var->dump(*this);
-}
-
-void ExternalSymbolDumper::dump(const PDBSymbolPublicSymbol &Symbol) {
- std::string LinkageName = Symbol.getName();
- if (Printer.IsSymbolExcluded(LinkageName))
- return;
-
- Printer.NewLine();
- uint64_t Addr = Symbol.getVirtualAddress();
-
- Printer << "[";
- WithColor(Printer, PDB_ColorItem::Address).get() << format_hex(Addr, 10);
- Printer << "] ";
- WithColor(Printer, PDB_ColorItem::Identifier).get() << LinkageName;
-}
diff --git a/llvm/tools/llvm-pdbdump/PrettyExternalSymbolDumper.h b/llvm/tools/llvm-pdbdump/PrettyExternalSymbolDumper.h
deleted file mode 100644
index 6a009862ddd..00000000000
--- a/llvm/tools/llvm-pdbdump/PrettyExternalSymbolDumper.h
+++ /dev/null
@@ -1,34 +0,0 @@
-//===- PrettyExternalSymbolDumper.h --------------------------- *- C++ --*-===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef LLVM_TOOLS_LLVMPDBDUMP_PRETTYEXTERNALSYMBOLDUMPER_H
-#define LLVM_TOOLS_LLVMPDBDUMP_PRETTYEXTERNALSYMBOLDUMPER_H
-
-#include "llvm/DebugInfo/PDB/PDBSymDumper.h"
-
-namespace llvm {
-namespace pdb {
-
-class LinePrinter;
-
-class ExternalSymbolDumper : public PDBSymDumper {
-public:
- ExternalSymbolDumper(LinePrinter &P);
-
- void start(const PDBSymbolExe &Symbol);
-
- void dump(const PDBSymbolPublicSymbol &Symbol) override;
-
-private:
- LinePrinter &Printer;
-};
-}
-}
-
-#endif
diff --git a/llvm/tools/llvm-pdbdump/PrettyFunctionDumper.cpp b/llvm/tools/llvm-pdbdump/PrettyFunctionDumper.cpp
deleted file mode 100644
index 8b2043989b8..00000000000
--- a/llvm/tools/llvm-pdbdump/PrettyFunctionDumper.cpp
+++ /dev/null
@@ -1,259 +0,0 @@
-//===- PrettyFunctionDumper.cpp --------------------------------- *- C++ *-===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#include "PrettyFunctionDumper.h"
-#include "LinePrinter.h"
-#include "PrettyBuiltinDumper.h"
-#include "llvm-pdbdump.h"
-
-#include "llvm/DebugInfo/PDB/IPDBSession.h"
-#include "llvm/DebugInfo/PDB/PDBExtras.h"
-#include "llvm/DebugInfo/PDB/PDBSymbolData.h"
-#include "llvm/DebugInfo/PDB/PDBSymbolFunc.h"
-#include "llvm/DebugInfo/PDB/PDBSymbolFuncDebugEnd.h"
-#include "llvm/DebugInfo/PDB/PDBSymbolFuncDebugStart.h"
-#include "llvm/DebugInfo/PDB/PDBSymbolTypeArray.h"
-#include "llvm/DebugInfo/PDB/PDBSymbolTypeEnum.h"
-#include "llvm/DebugInfo/PDB/PDBSymbolTypeFunctionArg.h"
-#include "llvm/DebugInfo/PDB/PDBSymbolTypeFunctionSig.h"
-#include "llvm/DebugInfo/PDB/PDBSymbolTypePointer.h"
-#include "llvm/DebugInfo/PDB/PDBSymbolTypeTypedef.h"
-#include "llvm/DebugInfo/PDB/PDBSymbolTypeUDT.h"
-#include "llvm/Support/Format.h"
-#include "llvm/Support/FormatVariadic.h"
-
-using namespace llvm;
-using namespace llvm::codeview;
-using namespace llvm::pdb;
-
-namespace {
-template <class T>
-void dumpClassParentWithScopeOperator(const T &Symbol, LinePrinter &Printer,
- FunctionDumper &Dumper) {
- uint32_t ClassParentId = Symbol.getClassParentId();
- auto ClassParent =
- Symbol.getSession().template getConcreteSymbolById<PDBSymbolTypeUDT>(
- ClassParentId);
- if (!ClassParent)
- return;
-
- WithColor(Printer, PDB_ColorItem::Type).get() << ClassParent->getName();
- Printer << "::";
-}
-}
-
-FunctionDumper::FunctionDumper(LinePrinter &P)
- : PDBSymDumper(true), Printer(P) {}
-
-void FunctionDumper::start(const PDBSymbolTypeFunctionSig &Symbol,
- const char *Name, PointerType Pointer) {
- auto ReturnType = Symbol.getReturnType();
- ReturnType->dump(*this);
- Printer << " ";
- uint32_t ClassParentId = Symbol.getClassParentId();
- auto ClassParent =
- Symbol.getSession().getConcreteSymbolById<PDBSymbolTypeUDT>(
- ClassParentId);
-
- PDB_CallingConv CC = Symbol.getCallingConvention();
- bool ShouldDumpCallingConvention = true;
- if ((ClassParent && CC == CallingConvention::ThisCall) ||
- (!ClassParent && CC == CallingConvention::NearStdCall)) {
- ShouldDumpCallingConvention = false;
- }
-
- if (Pointer == PointerType::None) {
- if (ShouldDumpCallingConvention)
- WithColor(Printer, PDB_ColorItem::Keyword).get() << CC << " ";
- if (ClassParent) {
- Printer << "(";
- WithColor(Printer, PDB_ColorItem::Identifier).get()
- << ClassParent->getName();
- Printer << "::)";
- }
- } else {
- Printer << "(";
- if (ShouldDumpCallingConvention)
- WithColor(Printer, PDB_ColorItem::Keyword).get() << CC << " ";
- if (ClassParent) {
- WithColor(Printer, PDB_ColorItem::Identifier).get()
- << ClassParent->getName();
- Printer << "::";
- }
- if (Pointer == PointerType::Reference)
- Printer << "&";
- else
- Printer << "*";
- if (Name)
- WithColor(Printer, PDB_ColorItem::Identifier).get() << Name;
- Printer << ")";
- }
-
- Printer << "(";
- if (auto ChildEnum = Symbol.getArguments()) {
- uint32_t Index = 0;
- while (auto Arg = ChildEnum->getNext()) {
- Arg->dump(*this);
- if (++Index < ChildEnum->getChildCount())
- Printer << ", ";
- }
- }
- Printer << ")";
-
- if (Symbol.isConstType())
- WithColor(Printer, PDB_ColorItem::Keyword).get() << " const";
- if (Symbol.isVolatileType())
- WithColor(Printer, PDB_ColorItem::Keyword).get() << " volatile";
-}
-
-void FunctionDumper::start(const PDBSymbolFunc &Symbol, PointerType Pointer) {
- uint64_t FuncStart = Symbol.getVirtualAddress();
- uint64_t FuncEnd = FuncStart + Symbol.getLength();
-
- Printer << "func [";
- WithColor(Printer, PDB_ColorItem::Address).get() << format_hex(FuncStart, 10);
- if (auto DebugStart = Symbol.findOneChild<PDBSymbolFuncDebugStart>()) {
- uint64_t Prologue = DebugStart->getVirtualAddress() - FuncStart;
- WithColor(Printer, PDB_ColorItem::Offset).get()
- << formatv("+{0,2}", Prologue);
- }
- Printer << " - ";
- WithColor(Printer, PDB_ColorItem::Address).get() << format_hex(FuncEnd, 10);
- if (auto DebugEnd = Symbol.findOneChild<PDBSymbolFuncDebugEnd>()) {
- uint64_t Epilogue = FuncEnd - DebugEnd->getVirtualAddress();
- WithColor(Printer, PDB_ColorItem::Offset).get()
- << formatv("-{0,2}", Epilogue);
- }
-
- WithColor(Printer, PDB_ColorItem::Comment).get()
- << formatv(" | sizeof={0,3}", Symbol.getLength());
- Printer << "] (";
-
- if (Symbol.hasFramePointer()) {
- WithColor(Printer, PDB_ColorItem::Register).get()
- << Symbol.getLocalBasePointerRegisterId();
- } else {
- WithColor(Printer, PDB_ColorItem::Register).get() << "FPO";
- }
- Printer << ") ";
-
- if (Symbol.isVirtual() || Symbol.isPureVirtual())
- WithColor(Printer, PDB_ColorItem::Keyword).get() << "virtual ";
-
- auto Signature = Symbol.getSignature();
- if (!Signature) {
- WithColor(Printer, PDB_ColorItem::Identifier).get() << Symbol.getName();
- if (Pointer == PointerType::Pointer)
- Printer << "*";
- else if (Pointer == FunctionDumper::PointerType::Reference)
- Printer << "&";
- return;
- }
-
- auto ReturnType = Signature->getReturnType();
- ReturnType->dump(*this);
- Printer << " ";
-
- auto ClassParent = Symbol.getClassParent();
- CallingConvention CC = Signature->getCallingConvention();
- if (Pointer != FunctionDumper::PointerType::None)
- Printer << "(";
-
- if ((ClassParent && CC != CallingConvention::ThisCall) ||
- (!ClassParent && CC != CallingConvention::NearStdCall)) {
- WithColor(Printer, PDB_ColorItem::Keyword).get()
- << Signature->getCallingConvention() << " ";
- }
- WithColor(Printer, PDB_ColorItem::Identifier).get() << Symbol.getName();
- if (Pointer != FunctionDumper::PointerType::None) {
- if (Pointer == PointerType::Pointer)
- Printer << "*";
- else if (Pointer == FunctionDumper::PointerType::Reference)
- Printer << "&";
- Printer << ")";
- }
-
- Printer << "(";
- if (auto Arguments = Symbol.getArguments()) {
- uint32_t Index = 0;
- while (auto Arg = Arguments->getNext()) {
- auto ArgType = Arg->getType();
- ArgType->dump(*this);
- WithColor(Printer, PDB_ColorItem::Identifier).get() << " "
- << Arg->getName();
- if (++Index < Arguments->getChildCount())
- Printer << ", ";
- }
- }
- Printer << ")";
- if (Symbol.isConstType())
- WithColor(Printer, PDB_ColorItem::Keyword).get() << " const";
- if (Symbol.isVolatileType())
- WithColor(Printer, PDB_ColorItem::Keyword).get() << " volatile";
- if (Symbol.isPureVirtual())
- Printer << " = 0";
-}
-
-void FunctionDumper::dump(const PDBSymbolTypeArray &Symbol) {
- auto ElementType = Symbol.getElementType();
-
- ElementType->dump(*this);
- Printer << "[";
- WithColor(Printer, PDB_ColorItem::LiteralValue).get() << Symbol.getLength();
- Printer << "]";
-}
-
-void FunctionDumper::dump(const PDBSymbolTypeBuiltin &Symbol) {
- BuiltinDumper Dumper(Printer);
- Dumper.start(Symbol);
-}
-
-void FunctionDumper::dump(const PDBSymbolTypeEnum &Symbol) {
- dumpClassParentWithScopeOperator(Symbol, Printer, *this);
- WithColor(Printer, PDB_ColorItem::Type).get() << Symbol.getName();
-}
-
-void FunctionDumper::dump(const PDBSymbolTypeFunctionArg &Symbol) {
- // PDBSymbolTypeFunctionArg is just a shim over the real argument. Just drill
- // through to the real thing and dump it.
- uint32_t TypeId = Symbol.getTypeId();
- auto Type = Symbol.getSession().getSymbolById(TypeId);
- if (!Type)
- return;
- Type->dump(*this);
-}
-
-void FunctionDumper::dump(const PDBSymbolTypeTypedef &Symbol) {
- dumpClassParentWithScopeOperator(Symbol, Printer, *this);
- WithColor(Printer, PDB_ColorItem::Type).get() << Symbol.getName();
-}
-
-void FunctionDumper::dump(const PDBSymbolTypePointer &Symbol) {
- auto PointeeType = Symbol.getPointeeType();
- if (!PointeeType)
- return;
-
- if (auto FuncSig = unique_dyn_cast<PDBSymbolTypeFunctionSig>(PointeeType)) {
- FunctionDumper NestedDumper(Printer);
- PointerType Pointer =
- Symbol.isReference() ? PointerType::Reference : PointerType::Pointer;
- NestedDumper.start(*FuncSig, nullptr, Pointer);
- } else {
- if (Symbol.isConstType())
- WithColor(Printer, PDB_ColorItem::Keyword).get() << "const ";
- if (Symbol.isVolatileType())
- WithColor(Printer, PDB_ColorItem::Keyword).get() << "volatile ";
- PointeeType->dump(*this);
- Printer << (Symbol.isReference() ? "&" : "*");
- }
-}
-
-void FunctionDumper::dump(const PDBSymbolTypeUDT &Symbol) {
- WithColor(Printer, PDB_ColorItem::Type).get() << Symbol.getName();
-}
diff --git a/llvm/tools/llvm-pdbdump/PrettyFunctionDumper.h b/llvm/tools/llvm-pdbdump/PrettyFunctionDumper.h
deleted file mode 100644
index 1a6f5430ec5..00000000000
--- a/llvm/tools/llvm-pdbdump/PrettyFunctionDumper.h
+++ /dev/null
@@ -1,43 +0,0 @@
-//===- PrettyFunctionDumper.h --------------------------------- *- C++ --*-===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef LLVM_TOOLS_LLVMPDBDUMP_PRETTYFUNCTIONDUMPER_H
-#define LLVM_TOOLS_LLVMPDBDUMP_PRETTYFUNCTIONDUMPER_H
-
-#include "llvm/DebugInfo/PDB/PDBSymDumper.h"
-
-namespace llvm {
-namespace pdb {
-class LinePrinter;
-
-class FunctionDumper : public PDBSymDumper {
-public:
- FunctionDumper(LinePrinter &P);
-
- enum class PointerType { None, Pointer, Reference };
-
- void start(const PDBSymbolTypeFunctionSig &Symbol, const char *Name,
- PointerType Pointer);
- void start(const PDBSymbolFunc &Symbol, PointerType Pointer);
-
- void dump(const PDBSymbolTypeArray &Symbol) override;
- void dump(const PDBSymbolTypeBuiltin &Symbol) override;
- void dump(const PDBSymbolTypeEnum &Symbol) override;
- void dump(const PDBSymbolTypeFunctionArg &Symbol) override;
- void dump(const PDBSymbolTypePointer &Symbol) override;
- void dump(const PDBSymbolTypeTypedef &Symbol) override;
- void dump(const PDBSymbolTypeUDT &Symbol) override;
-
-private:
- LinePrinter &Printer;
-};
-}
-}
-
-#endif
diff --git a/llvm/tools/llvm-pdbdump/PrettyTypeDumper.cpp b/llvm/tools/llvm-pdbdump/PrettyTypeDumper.cpp
deleted file mode 100644
index bbbb429f4f3..00000000000
--- a/llvm/tools/llvm-pdbdump/PrettyTypeDumper.cpp
+++ /dev/null
@@ -1,255 +0,0 @@
-//===- PrettyTypeDumper.cpp - PDBSymDumper type dumper *------------ C++ *-===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#include "PrettyTypeDumper.h"
-
-#include "LinePrinter.h"
-#include "PrettyBuiltinDumper.h"
-#include "PrettyClassDefinitionDumper.h"
-#include "PrettyEnumDumper.h"
-#include "PrettyTypedefDumper.h"
-#include "llvm-pdbdump.h"
-
-#include "llvm/DebugInfo/PDB/IPDBSession.h"
-#include "llvm/DebugInfo/PDB/PDBSymbolExe.h"
-#include "llvm/DebugInfo/PDB/PDBSymbolTypeBuiltin.h"
-#include "llvm/DebugInfo/PDB/PDBSymbolTypeEnum.h"
-#include "llvm/DebugInfo/PDB/PDBSymbolTypeTypedef.h"
-#include "llvm/DebugInfo/PDB/PDBSymbolTypeUDT.h"
-#include "llvm/DebugInfo/PDB/UDTLayout.h"
-#include "llvm/Support/Compiler.h"
-#include "llvm/Support/FormatVariadic.h"
-
-using namespace llvm;
-using namespace llvm::pdb;
-
-using LayoutPtr = std::unique_ptr<ClassLayout>;
-
-typedef bool (*CompareFunc)(const LayoutPtr &S1, const LayoutPtr &S2);
-
-static bool CompareNames(const LayoutPtr &S1, const LayoutPtr &S2) {
- return S1->getName() < S2->getName();
-}
-
-static bool CompareSizes(const LayoutPtr &S1, const LayoutPtr &S2) {
- return S1->getSize() < S2->getSize();
-}
-
-static bool ComparePadding(const LayoutPtr &S1, const LayoutPtr &S2) {
- return S1->deepPaddingSize() < S2->deepPaddingSize();
-}
-
-static bool ComparePaddingPct(const LayoutPtr &S1, const LayoutPtr &S2) {
- double Pct1 = (double)S1->deepPaddingSize() / (double)S1->getSize();
- double Pct2 = (double)S2->deepPaddingSize() / (double)S2->getSize();
- return Pct1 < Pct2;
-}
-
-static bool ComparePaddingImmediate(const LayoutPtr &S1, const LayoutPtr &S2) {
- return S1->immediatePadding() < S2->immediatePadding();
-}
-
-static bool ComparePaddingPctImmediate(const LayoutPtr &S1,
- const LayoutPtr &S2) {
- double Pct1 = (double)S1->immediatePadding() / (double)S1->getSize();
- double Pct2 = (double)S2->immediatePadding() / (double)S2->getSize();
- return Pct1 < Pct2;
-}
-
-static CompareFunc getComparisonFunc(opts::pretty::ClassSortMode Mode) {
- switch (Mode) {
- case opts::pretty::ClassSortMode::Name:
- return CompareNames;
- case opts::pretty::ClassSortMode::Size:
- return CompareSizes;
- case opts::pretty::ClassSortMode::Padding:
- return ComparePadding;
- case opts::pretty::ClassSortMode::PaddingPct:
- return ComparePaddingPct;
- case opts::pretty::ClassSortMode::PaddingImmediate:
- return ComparePaddingImmediate;
- case opts::pretty::ClassSortMode::PaddingPctImmediate:
- return ComparePaddingPctImmediate;
- default:
- return nullptr;
- }
-}
-
-template <typename Enumerator>
-static std::vector<std::unique_ptr<ClassLayout>>
-filterAndSortClassDefs(LinePrinter &Printer, Enumerator &E,
- uint32_t UnfilteredCount) {
- std::vector<std::unique_ptr<ClassLayout>> Filtered;
-
- Filtered.reserve(UnfilteredCount);
- CompareFunc Comp = getComparisonFunc(opts::pretty::ClassOrder);
-
- if (UnfilteredCount > 10000) {
- errs() << formatv("Filtering and sorting {0} types", UnfilteredCount);
- errs().flush();
- }
- uint32_t Examined = 0;
- uint32_t Discarded = 0;
- while (auto Class = E.getNext()) {
- ++Examined;
- if (Examined % 10000 == 0) {
- errs() << formatv("Examined {0}/{1} items. {2} items discarded\n",
- Examined, UnfilteredCount, Discarded);
- errs().flush();
- }
-
- if (Class->getUnmodifiedTypeId() != 0) {
- ++Discarded;
- continue;
- }
-
- if (Printer.IsTypeExcluded(Class->getName(), Class->getLength())) {
- ++Discarded;
- continue;
- }
-
- auto Layout = llvm::make_unique<ClassLayout>(std::move(Class));
- if (Layout->deepPaddingSize() < opts::pretty::PaddingThreshold) {
- ++Discarded;
- continue;
- }
- if (Layout->immediatePadding() < opts::pretty::ImmediatePaddingThreshold) {
- ++Discarded;
- continue;
- }
-
- Filtered.push_back(std::move(Layout));
- }
-
- if (Comp)
- std::sort(Filtered.begin(), Filtered.end(), Comp);
- return Filtered;
-}
-
-TypeDumper::TypeDumper(LinePrinter &P) : PDBSymDumper(true), Printer(P) {}
-
-void TypeDumper::start(const PDBSymbolExe &Exe) {
- auto Children = Exe.findAllChildren();
- if (opts::pretty::Enums) {
- if (auto Enums = Exe.findAllChildren<PDBSymbolTypeEnum>()) {
- Printer.NewLine();
- WithColor(Printer, PDB_ColorItem::Identifier).get() << "Enums";
- Printer << ": (" << Enums->getChildCount() << " items)";
- Printer.Indent();
- while (auto Enum = Enums->getNext())
- Enum->dump(*this);
- Printer.Unindent();
- }
- }
-
- if (opts::pretty::Typedefs) {
- if (auto Typedefs = Exe.findAllChildren<PDBSymbolTypeTypedef>()) {
- Printer.NewLine();
- WithColor(Printer, PDB_ColorItem::Identifier).get() << "Typedefs";
- Printer << ": (" << Typedefs->getChildCount() << " items)";
- Printer.Indent();
- while (auto Typedef = Typedefs->getNext())
- Typedef->dump(*this);
- Printer.Unindent();
- }
- }
-
- if (opts::pretty::Classes) {
- if (auto Classes = Exe.findAllChildren<PDBSymbolTypeUDT>()) {
- uint32_t All = Classes->getChildCount();
-
- Printer.NewLine();
- WithColor(Printer, PDB_ColorItem::Identifier).get() << "Classes";
-
- bool Precompute = false;
- Precompute =
- (opts::pretty::ClassOrder != opts::pretty::ClassSortMode::None);
-
- // If we're using no sort mode, then we can start getting immediate output
- // from the tool by just filtering as we go, rather than processing
- // everything up front so that we can sort it. This makes the tool more
- // responsive. So only precompute the filtered/sorted set of classes if
- // necessary due to the specified options.
- std::vector<LayoutPtr> Filtered;
- uint32_t Shown = All;
- if (Precompute) {
- Filtered = filterAndSortClassDefs(Printer, *Classes, All);
-
- Shown = Filtered.size();
- }
-
- Printer << ": (Showing " << Shown << " items";
- if (Shown < All)
- Printer << ", " << (All - Shown) << " filtered";
- Printer << ")";
- Printer.Indent();
-
- // If we pre-computed, iterate the filtered/sorted list, otherwise iterate
- // the DIA enumerator and filter on the fly.
- if (Precompute) {
- for (auto &Class : Filtered)
- dumpClassLayout(*Class);
- } else {
- while (auto Class = Classes->getNext()) {
- if (Class->getUnmodifiedTypeId() != 0)
- continue;
-
- if (Printer.IsTypeExcluded(Class->getName(), Class->getLength()))
- continue;
-
- auto Layout = llvm::make_unique<ClassLayout>(std::move(Class));
- if (Layout->deepPaddingSize() < opts::pretty::PaddingThreshold)
- continue;
-
- dumpClassLayout(*Layout);
- }
- }
-
- Printer.Unindent();
- }
- }
-}
-
-void TypeDumper::dump(const PDBSymbolTypeEnum &Symbol) {
- assert(opts::pretty::Enums);
-
- if (Printer.IsTypeExcluded(Symbol.getName(), Symbol.getLength()))
- return;
- // Dump member enums when dumping their class definition.
- if (nullptr != Symbol.getClassParent())
- return;
-
- Printer.NewLine();
- EnumDumper Dumper(Printer);
- Dumper.start(Symbol);
-}
-
-void TypeDumper::dump(const PDBSymbolTypeTypedef &Symbol) {
- assert(opts::pretty::Typedefs);
-
- if (Printer.IsTypeExcluded(Symbol.getName(), Symbol.getLength()))
- return;
-
- Printer.NewLine();
- TypedefDumper Dumper(Printer);
- Dumper.start(Symbol);
-}
-
-void TypeDumper::dumpClassLayout(const ClassLayout &Class) {
- assert(opts::pretty::Classes);
-
- if (opts::pretty::ClassFormat == opts::pretty::ClassDefinitionFormat::None) {
- Printer.NewLine();
- WithColor(Printer, PDB_ColorItem::Keyword).get() << "class ";
- WithColor(Printer, PDB_ColorItem::Identifier).get() << Class.getName();
- } else {
- ClassDefinitionDumper Dumper(Printer);
- Dumper.start(Class);
- }
-}
diff --git a/llvm/tools/llvm-pdbdump/PrettyTypeDumper.h b/llvm/tools/llvm-pdbdump/PrettyTypeDumper.h
deleted file mode 100644
index 68a2f0246eb..00000000000
--- a/llvm/tools/llvm-pdbdump/PrettyTypeDumper.h
+++ /dev/null
@@ -1,36 +0,0 @@
-//===- PrettyTypeDumper.h - PDBSymDumper implementation for types *- C++ *-===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef LLVM_TOOLS_LLVMPDBDUMP_PRETTYTYPEDUMPER_H
-#define LLVM_TOOLS_LLVMPDBDUMP_PRETTYTYPEDUMPER_H
-
-#include "llvm/DebugInfo/PDB/PDBSymDumper.h"
-
-namespace llvm {
-namespace pdb {
-class LinePrinter;
-class ClassLayout;
-
-class TypeDumper : public PDBSymDumper {
-public:
- TypeDumper(LinePrinter &P);
-
- void start(const PDBSymbolExe &Exe);
-
- void dump(const PDBSymbolTypeEnum &Symbol) override;
- void dump(const PDBSymbolTypeTypedef &Symbol) override;
-
- void dumpClassLayout(const ClassLayout &Class);
-
-private:
- LinePrinter &Printer;
-};
-}
-}
-#endif
diff --git a/llvm/tools/llvm-pdbdump/PrettyTypedefDumper.cpp b/llvm/tools/llvm-pdbdump/PrettyTypedefDumper.cpp
deleted file mode 100644
index 2d8e915d760..00000000000
--- a/llvm/tools/llvm-pdbdump/PrettyTypedefDumper.cpp
+++ /dev/null
@@ -1,77 +0,0 @@
-//===- PrettyTypedefDumper.cpp - PDBSymDumper impl for typedefs -- * C++ *-===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#include "PrettyTypedefDumper.h"
-
-#include "LinePrinter.h"
-#include "PrettyBuiltinDumper.h"
-#include "PrettyFunctionDumper.h"
-#include "llvm-pdbdump.h"
-
-#include "llvm/DebugInfo/PDB/IPDBSession.h"
-#include "llvm/DebugInfo/PDB/PDBExtras.h"
-#include "llvm/DebugInfo/PDB/PDBSymbolTypeEnum.h"
-#include "llvm/DebugInfo/PDB/PDBSymbolTypeFunctionSig.h"
-#include "llvm/DebugInfo/PDB/PDBSymbolTypePointer.h"
-#include "llvm/DebugInfo/PDB/PDBSymbolTypeTypedef.h"
-#include "llvm/DebugInfo/PDB/PDBSymbolTypeUDT.h"
-
-using namespace llvm;
-using namespace llvm::pdb;
-
-TypedefDumper::TypedefDumper(LinePrinter &P) : PDBSymDumper(true), Printer(P) {}
-
-void TypedefDumper::start(const PDBSymbolTypeTypedef &Symbol) {
- WithColor(Printer, PDB_ColorItem::Keyword).get() << "typedef ";
- uint32_t TargetId = Symbol.getTypeId();
- if (auto TypeSymbol = Symbol.getSession().getSymbolById(TargetId))
- TypeSymbol->dump(*this);
- WithColor(Printer, PDB_ColorItem::Identifier).get() << " "
- << Symbol.getName();
-}
-
-void TypedefDumper::dump(const PDBSymbolTypeArray &Symbol) {}
-
-void TypedefDumper::dump(const PDBSymbolTypeBuiltin &Symbol) {
- BuiltinDumper Dumper(Printer);
- Dumper.start(Symbol);
-}
-
-void TypedefDumper::dump(const PDBSymbolTypeEnum &Symbol) {
- WithColor(Printer, PDB_ColorItem::Keyword).get() << "enum ";
- WithColor(Printer, PDB_ColorItem::Type).get() << " " << Symbol.getName();
-}
-
-void TypedefDumper::dump(const PDBSymbolTypePointer &Symbol) {
- if (Symbol.isConstType())
- WithColor(Printer, PDB_ColorItem::Keyword).get() << "const ";
- if (Symbol.isVolatileType())
- WithColor(Printer, PDB_ColorItem::Keyword).get() << "volatile ";
- auto PointeeType = Symbol.getPointeeType();
- if (auto FuncSig = unique_dyn_cast<PDBSymbolTypeFunctionSig>(PointeeType)) {
- FunctionDumper::PointerType Pointer = FunctionDumper::PointerType::Pointer;
- if (Symbol.isReference())
- Pointer = FunctionDumper::PointerType::Reference;
- FunctionDumper NestedDumper(Printer);
- NestedDumper.start(*FuncSig, nullptr, Pointer);
- } else {
- PointeeType->dump(*this);
- Printer << ((Symbol.isReference()) ? "&" : "*");
- }
-}
-
-void TypedefDumper::dump(const PDBSymbolTypeFunctionSig &Symbol) {
- FunctionDumper Dumper(Printer);
- Dumper.start(Symbol, nullptr, FunctionDumper::PointerType::None);
-}
-
-void TypedefDumper::dump(const PDBSymbolTypeUDT &Symbol) {
- WithColor(Printer, PDB_ColorItem::Keyword).get() << "class ";
- WithColor(Printer, PDB_ColorItem::Type).get() << Symbol.getName();
-}
diff --git a/llvm/tools/llvm-pdbdump/PrettyTypedefDumper.h b/llvm/tools/llvm-pdbdump/PrettyTypedefDumper.h
deleted file mode 100644
index 34c13960130..00000000000
--- a/llvm/tools/llvm-pdbdump/PrettyTypedefDumper.h
+++ /dev/null
@@ -1,39 +0,0 @@
-//===- PrettyTypedefDumper.h - llvm-pdbdump typedef dumper ---*- C++ ----*-===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef LLVM_TOOLS_LLVMPDBDUMP_PRETTYTYPEDEFDUMPER_H
-#define LLVM_TOOLS_LLVMPDBDUMP_PRETTYTYPEDEFDUMPER_H
-
-#include "llvm/DebugInfo/PDB/PDBSymDumper.h"
-
-namespace llvm {
-namespace pdb {
-
-class LinePrinter;
-
-class TypedefDumper : public PDBSymDumper {
-public:
- TypedefDumper(LinePrinter &P);
-
- void start(const PDBSymbolTypeTypedef &Symbol);
-
- void dump(const PDBSymbolTypeArray &Symbol) override;
- void dump(const PDBSymbolTypeBuiltin &Symbol) override;
- void dump(const PDBSymbolTypeEnum &Symbol) override;
- void dump(const PDBSymbolTypeFunctionSig &Symbol) override;
- void dump(const PDBSymbolTypePointer &Symbol) override;
- void dump(const PDBSymbolTypeUDT &Symbol) override;
-
-private:
- LinePrinter &Printer;
-};
-}
-}
-
-#endif
diff --git a/llvm/tools/llvm-pdbdump/PrettyVariableDumper.cpp b/llvm/tools/llvm-pdbdump/PrettyVariableDumper.cpp
deleted file mode 100644
index 70925f4b03d..00000000000
--- a/llvm/tools/llvm-pdbdump/PrettyVariableDumper.cpp
+++ /dev/null
@@ -1,220 +0,0 @@
-//===- PrettyVariableDumper.cpp ---------------------------------*- C++ -*-===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#include "PrettyVariableDumper.h"
-
-#include "LinePrinter.h"
-#include "PrettyBuiltinDumper.h"
-#include "PrettyFunctionDumper.h"
-#include "llvm-pdbdump.h"
-
-#include "llvm/DebugInfo/PDB/IPDBSession.h"
-#include "llvm/DebugInfo/PDB/PDBSymbolData.h"
-#include "llvm/DebugInfo/PDB/PDBSymbolFunc.h"
-#include "llvm/DebugInfo/PDB/PDBSymbolTypeArray.h"
-#include "llvm/DebugInfo/PDB/PDBSymbolTypeEnum.h"
-#include "llvm/DebugInfo/PDB/PDBSymbolTypeEnum.h"
-#include "llvm/DebugInfo/PDB/PDBSymbolTypeFunctionSig.h"
-#include "llvm/DebugInfo/PDB/PDBSymbolTypePointer.h"
-#include "llvm/DebugInfo/PDB/PDBSymbolTypeTypedef.h"
-#include "llvm/DebugInfo/PDB/PDBSymbolTypeUDT.h"
-#include "llvm/DebugInfo/PDB/PDBTypes.h"
-
-#include "llvm/Support/Format.h"
-
-using namespace llvm;
-using namespace llvm::codeview;
-using namespace llvm::pdb;
-
-VariableDumper::VariableDumper(LinePrinter &P)
- : PDBSymDumper(true), Printer(P) {}
-
-void VariableDumper::start(const PDBSymbolData &Var, uint32_t Offset) {
- if (Var.isCompilerGenerated() && opts::pretty::ExcludeCompilerGenerated)
- return;
- if (Printer.IsSymbolExcluded(Var.getName()))
- return;
-
- auto VarType = Var.getType();
-
- uint64_t Length = VarType->getRawSymbol().getLength();
-
- switch (auto LocType = Var.getLocationType()) {
- case PDB_LocType::Static:
- Printer.NewLine();
- Printer << "data [";
- WithColor(Printer, PDB_ColorItem::Address).get()
- << format_hex(Var.getVirtualAddress(), 10);
- Printer << ", sizeof=" << Length << "] ";
- WithColor(Printer, PDB_ColorItem::Keyword).get() << "static ";
- dumpSymbolTypeAndName(*VarType, Var.getName());
- break;
- case PDB_LocType::Constant:
- if (isa<PDBSymbolTypeEnum>(*VarType))
- break;
- Printer.NewLine();
- Printer << "data [sizeof=" << Length << "] ";
- dumpSymbolTypeAndName(*VarType, Var.getName());
- Printer << " = ";
- WithColor(Printer, PDB_ColorItem::LiteralValue).get() << Var.getValue();
- break;
- case PDB_LocType::ThisRel:
- Printer.NewLine();
- Printer << "data ";
- WithColor(Printer, PDB_ColorItem::Offset).get()
- << "+" << format_hex(Offset + Var.getOffset(), 4)
- << " [sizeof=" << Length << "] ";
- dumpSymbolTypeAndName(*VarType, Var.getName());
- break;
- case PDB_LocType::BitField:
- Printer.NewLine();
- Printer << "data ";
- WithColor(Printer, PDB_ColorItem::Offset).get()
- << "+" << format_hex(Offset + Var.getOffset(), 4)
- << " [sizeof=" << Length << "] ";
- dumpSymbolTypeAndName(*VarType, Var.getName());
- Printer << " : ";
- WithColor(Printer, PDB_ColorItem::LiteralValue).get() << Var.getLength();
- break;
- default:
- Printer.NewLine();
- Printer << "data [sizeof=" << Length << "] ";
- Printer << "unknown(" << LocType << ") ";
- WithColor(Printer, PDB_ColorItem::Identifier).get() << Var.getName();
- break;
- }
-}
-
-void VariableDumper::startVbptr(uint32_t Offset, uint32_t Size) {
- Printer.NewLine();
- Printer << "vbptr ";
-
- WithColor(Printer, PDB_ColorItem::Offset).get()
- << "+" << format_hex(Offset, 4) << " [sizeof=" << Size << "] ";
-}
-
-void VariableDumper::start(const PDBSymbolTypeVTable &Var, uint32_t Offset) {
- Printer.NewLine();
- Printer << "vfptr ";
- auto VTableType = cast<PDBSymbolTypePointer>(Var.getType());
- uint32_t PointerSize = VTableType->getLength();
-
- WithColor(Printer, PDB_ColorItem::Offset).get()
- << "+" << format_hex(Offset + Var.getOffset(), 4)
- << " [sizeof=" << PointerSize << "] ";
-}
-
-void VariableDumper::dump(const PDBSymbolTypeArray &Symbol) {
- auto ElementType = Symbol.getElementType();
- assert(ElementType);
- if (!ElementType)
- return;
- ElementType->dump(*this);
-}
-
-void VariableDumper::dumpRight(const PDBSymbolTypeArray &Symbol) {
- auto ElementType = Symbol.getElementType();
- assert(ElementType);
- if (!ElementType)
- return;
- Printer << '[' << Symbol.getCount() << ']';
- ElementType->dumpRight(*this);
-}
-
-void VariableDumper::dump(const PDBSymbolTypeBuiltin &Symbol) {
- BuiltinDumper Dumper(Printer);
- Dumper.start(Symbol);
-}
-
-void VariableDumper::dump(const PDBSymbolTypeEnum &Symbol) {
- WithColor(Printer, PDB_ColorItem::Type).get() << Symbol.getName();
-}
-
-void VariableDumper::dump(const PDBSymbolTypeFunctionSig &Symbol) {
- auto ReturnType = Symbol.getReturnType();
- ReturnType->dump(*this);
- Printer << " ";
-
- uint32_t ClassParentId = Symbol.getClassParentId();
- auto ClassParent =
- Symbol.getSession().getConcreteSymbolById<PDBSymbolTypeUDT>(
- ClassParentId);
-
- if (ClassParent) {
- WithColor(Printer, PDB_ColorItem::Identifier).get()
- << ClassParent->getName();
- Printer << "::";
- }
-}
-
-void VariableDumper::dumpRight(const PDBSymbolTypeFunctionSig &Symbol) {
- Printer << "(";
- if (auto Arguments = Symbol.getArguments()) {
- uint32_t Index = 0;
- while (auto Arg = Arguments->getNext()) {
- Arg->dump(*this);
- if (++Index < Arguments->getChildCount())
- Printer << ", ";
- }
- }
- Printer << ")";
-
- if (Symbol.isConstType())
- WithColor(Printer, PDB_ColorItem::Keyword).get() << " const";
- if (Symbol.isVolatileType())
- WithColor(Printer, PDB_ColorItem::Keyword).get() << " volatile";
-}
-
-void VariableDumper::dump(const PDBSymbolTypePointer &Symbol) {
- auto PointeeType = Symbol.getPointeeType();
- if (!PointeeType)
- return;
- PointeeType->dump(*this);
- if (auto FuncSig = unique_dyn_cast<PDBSymbolTypeFunctionSig>(PointeeType)) {
- // A hack to get the calling convention in the right spot.
- Printer << " (";
- PDB_CallingConv CC = FuncSig->getCallingConvention();
- WithColor(Printer, PDB_ColorItem::Keyword).get() << CC << " ";
- } else if (isa<PDBSymbolTypeArray>(PointeeType)) {
- Printer << " (";
- }
- Printer << (Symbol.isReference() ? "&" : "*");
- if (Symbol.isConstType())
- WithColor(Printer, PDB_ColorItem::Keyword).get() << " const ";
- if (Symbol.isVolatileType())
- WithColor(Printer, PDB_ColorItem::Keyword).get() << " volatile ";
-}
-
-void VariableDumper::dumpRight(const PDBSymbolTypePointer &Symbol) {
- auto PointeeType = Symbol.getPointeeType();
- assert(PointeeType);
- if (!PointeeType)
- return;
- if (isa<PDBSymbolTypeFunctionSig>(PointeeType) ||
- isa<PDBSymbolTypeArray>(PointeeType)) {
- Printer << ")";
- }
- PointeeType->dumpRight(*this);
-}
-
-void VariableDumper::dump(const PDBSymbolTypeTypedef &Symbol) {
- WithColor(Printer, PDB_ColorItem::Keyword).get() << "typedef ";
- WithColor(Printer, PDB_ColorItem::Type).get() << Symbol.getName();
-}
-
-void VariableDumper::dump(const PDBSymbolTypeUDT &Symbol) {
- WithColor(Printer, PDB_ColorItem::Type).get() << Symbol.getName();
-}
-
-void VariableDumper::dumpSymbolTypeAndName(const PDBSymbol &Type,
- StringRef Name) {
- Type.dump(*this);
- WithColor(Printer, PDB_ColorItem::Identifier).get() << " " << Name;
- Type.dumpRight(*this);
-}
diff --git a/llvm/tools/llvm-pdbdump/PrettyVariableDumper.h b/llvm/tools/llvm-pdbdump/PrettyVariableDumper.h
deleted file mode 100644
index cacf1ce9577..00000000000
--- a/llvm/tools/llvm-pdbdump/PrettyVariableDumper.h
+++ /dev/null
@@ -1,50 +0,0 @@
-//===- PrettyVariableDumper.h - PDBSymDumper variable dumper ----*- C++ -*-===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef LLVM_TOOLS_LLVMPDBDUMP_PRETTYVARIABLEDUMPER_H
-#define LLVM_TOOLS_LLVMPDBDUMP_PRETTYVARIABLEDUMPER_H
-
-#include "llvm/DebugInfo/PDB/PDBSymDumper.h"
-
-namespace llvm {
-
-class StringRef;
-
-namespace pdb {
-
-class LinePrinter;
-
-class VariableDumper : public PDBSymDumper {
-public:
- VariableDumper(LinePrinter &P);
-
- void start(const PDBSymbolData &Var, uint32_t Offset = 0);
- void start(const PDBSymbolTypeVTable &Var, uint32_t Offset = 0);
- void startVbptr(uint32_t Offset, uint32_t Size);
-
- void dump(const PDBSymbolTypeArray &Symbol) override;
- void dump(const PDBSymbolTypeBuiltin &Symbol) override;
- void dump(const PDBSymbolTypeEnum &Symbol) override;
- void dump(const PDBSymbolTypeFunctionSig &Symbol) override;
- void dump(const PDBSymbolTypePointer &Symbol) override;
- void dump(const PDBSymbolTypeTypedef &Symbol) override;
- void dump(const PDBSymbolTypeUDT &Symbol) override;
-
- void dumpRight(const PDBSymbolTypeArray &Symbol) override;
- void dumpRight(const PDBSymbolTypeFunctionSig &Symbol) override;
- void dumpRight(const PDBSymbolTypePointer &Symbol) override;
-
-private:
- void dumpSymbolTypeAndName(const PDBSymbol &Type, StringRef Name);
-
- LinePrinter &Printer;
-};
-}
-}
-#endif
diff --git a/llvm/tools/llvm-pdbdump/StreamUtil.cpp b/llvm/tools/llvm-pdbdump/StreamUtil.cpp
deleted file mode 100644
index 81aa256b500..00000000000
--- a/llvm/tools/llvm-pdbdump/StreamUtil.cpp
+++ /dev/null
@@ -1,139 +0,0 @@
-//===- StreamUtil.cpp - PDB stream utilities --------------------*- C++ -*-===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#include "StreamUtil.h"
-
-#include "llvm/ADT/DenseMap.h"
-#include "llvm/ADT/DenseMapInfo.h"
-#include "llvm/DebugInfo/PDB/Native/DbiModuleDescriptor.h"
-#include "llvm/DebugInfo/PDB/Native/DbiModuleList.h"
-#include "llvm/DebugInfo/PDB/Native/DbiStream.h"
-#include "llvm/DebugInfo/PDB/Native/InfoStream.h"
-#include "llvm/DebugInfo/PDB/Native/PDBFile.h"
-#include "llvm/DebugInfo/PDB/Native/TpiStream.h"
-
-namespace llvm {
-namespace pdb {
-void discoverStreamPurposes(PDBFile &File,
- SmallVectorImpl<std::string> &Purposes) {
-
- // It's OK if we fail to load some of these streams, we still attempt to print
- // what we can.
- auto Dbi = File.getPDBDbiStream();
- auto Tpi = File.getPDBTpiStream();
- auto Ipi = File.getPDBIpiStream();
- auto Info = File.getPDBInfoStream();
-
- uint32_t StreamCount = File.getNumStreams();
- DenseMap<uint16_t, DbiModuleDescriptor> ModStreams;
- DenseMap<uint16_t, std::string> NamedStreams;
-
- if (Dbi) {
- const DbiModuleList &Modules = Dbi->modules();
- for (uint32_t I = 0; I < Modules.getModuleCount(); ++I) {
- DbiModuleDescriptor Descriptor = Modules.getModuleDescriptor(I);
- uint16_t SN = Descriptor.getModuleStreamIndex();
- if (SN != kInvalidStreamIndex)
- ModStreams[SN] = Descriptor;
- }
- }
- if (Info) {
- for (auto &NSE : Info->named_streams()) {
- if (NSE.second != kInvalidStreamIndex)
- NamedStreams[NSE.second] = NSE.first();
- }
- }
-
- Purposes.resize(StreamCount);
- for (uint16_t StreamIdx = 0; StreamIdx < StreamCount; ++StreamIdx) {
- std::string Value;
- if (StreamIdx == OldMSFDirectory)
- Value = "Old MSF Directory";
- else if (StreamIdx == StreamPDB)
- Value = "PDB Stream";
- else if (StreamIdx == StreamDBI)
- Value = "DBI Stream";
- else if (StreamIdx == StreamTPI)
- Value = "TPI Stream";
- else if (StreamIdx == StreamIPI)
- Value = "IPI Stream";
- else if (Dbi && StreamIdx == Dbi->getGlobalSymbolStreamIndex())
- Value = "Global Symbol Hash";
- else if (Dbi && StreamIdx == Dbi->getPublicSymbolStreamIndex())
- Value = "Public Symbol Hash";
- else if (Dbi && StreamIdx == Dbi->getSymRecordStreamIndex())
- Value = "Public Symbol Records";
- else if (Tpi && StreamIdx == Tpi->getTypeHashStreamIndex())
- Value = "TPI Hash";
- else if (Tpi && StreamIdx == Tpi->getTypeHashStreamAuxIndex())
- Value = "TPI Aux Hash";
- else if (Ipi && StreamIdx == Ipi->getTypeHashStreamIndex())
- Value = "IPI Hash";
- else if (Ipi && StreamIdx == Ipi->getTypeHashStreamAuxIndex())
- Value = "IPI Aux Hash";
- else if (Dbi &&
- StreamIdx == Dbi->getDebugStreamIndex(DbgHeaderType::Exception))
- Value = "Exception Data";
- else if (Dbi && StreamIdx == Dbi->getDebugStreamIndex(DbgHeaderType::Fixup))
- Value = "Fixup Data";
- else if (Dbi && StreamIdx == Dbi->getDebugStreamIndex(DbgHeaderType::FPO))
- Value = "FPO Data";
- else if (Dbi &&
- StreamIdx == Dbi->getDebugStreamIndex(DbgHeaderType::NewFPO))
- Value = "New FPO Data";
- else if (Dbi &&
- StreamIdx == Dbi->getDebugStreamIndex(DbgHeaderType::OmapFromSrc))
- Value = "Omap From Source Data";
- else if (Dbi &&
- StreamIdx == Dbi->getDebugStreamIndex(DbgHeaderType::OmapToSrc))
- Value = "Omap To Source Data";
- else if (Dbi && StreamIdx == Dbi->getDebugStreamIndex(DbgHeaderType::Pdata))
- Value = "Pdata";
- else if (Dbi &&
- StreamIdx == Dbi->getDebugStreamIndex(DbgHeaderType::SectionHdr))
- Value = "Section Header Data";
- else if (Dbi &&
- StreamIdx ==
- Dbi->getDebugStreamIndex(DbgHeaderType::SectionHdrOrig))
- Value = "Section Header Original Data";
- else if (Dbi &&
- StreamIdx == Dbi->getDebugStreamIndex(DbgHeaderType::TokenRidMap))
- Value = "Token Rid Data";
- else if (Dbi && StreamIdx == Dbi->getDebugStreamIndex(DbgHeaderType::Xdata))
- Value = "Xdata";
- else {
- auto ModIter = ModStreams.find(StreamIdx);
- auto NSIter = NamedStreams.find(StreamIdx);
- if (ModIter != ModStreams.end()) {
- Value = "Module \"";
- Value += ModIter->second.getModuleName();
- Value += "\"";
- } else if (NSIter != NamedStreams.end()) {
- Value = "Named Stream \"";
- Value += NSIter->second;
- Value += "\"";
- } else {
- Value = "???";
- }
- }
- Purposes[StreamIdx] = Value;
- }
-
- // Consume errors from missing streams.
- if (!Dbi)
- consumeError(Dbi.takeError());
- if (!Tpi)
- consumeError(Tpi.takeError());
- if (!Ipi)
- consumeError(Ipi.takeError());
- if (!Info)
- consumeError(Info.takeError());
-}
-}
-}
diff --git a/llvm/tools/llvm-pdbdump/StreamUtil.h b/llvm/tools/llvm-pdbdump/StreamUtil.h
deleted file mode 100644
index b5c0beba44f..00000000000
--- a/llvm/tools/llvm-pdbdump/StreamUtil.h
+++ /dev/null
@@ -1,25 +0,0 @@
-//===- Streamutil.h - PDB stream utilities ----------------------*- C++ -*-===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef LLVM_TOOLS_LLVMPDBDUMP_STREAMUTIL_H
-#define LLVM_TOOLS_LLVMPDBDUMP_STREAMUTIL_H
-
-#include "llvm/ADT/SmallVector.h"
-
-#include <string>
-
-namespace llvm {
-namespace pdb {
-class PDBFile;
-void discoverStreamPurposes(PDBFile &File,
- SmallVectorImpl<std::string> &Purposes);
-}
-}
-
-#endif
diff --git a/llvm/tools/llvm-pdbdump/YAMLOutputStyle.cpp b/llvm/tools/llvm-pdbdump/YAMLOutputStyle.cpp
deleted file mode 100644
index 56175856097..00000000000
--- a/llvm/tools/llvm-pdbdump/YAMLOutputStyle.cpp
+++ /dev/null
@@ -1,317 +0,0 @@
-//===- YAMLOutputStyle.cpp ------------------------------------ *- C++ --*-===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#include "YAMLOutputStyle.h"
-
-#include "PdbYaml.h"
-#include "llvm-pdbdump.h"
-
-#include "llvm/DebugInfo/CodeView/DebugChecksumsSubsection.h"
-#include "llvm/DebugInfo/CodeView/DebugInlineeLinesSubsection.h"
-#include "llvm/DebugInfo/CodeView/DebugLinesSubsection.h"
-#include "llvm/DebugInfo/CodeView/DebugSubsection.h"
-#include "llvm/DebugInfo/CodeView/DebugUnknownSubsection.h"
-#include "llvm/DebugInfo/CodeView/Line.h"
-#include "llvm/DebugInfo/MSF/MappedBlockStream.h"
-#include "llvm/DebugInfo/PDB/Native/DbiStream.h"
-#include "llvm/DebugInfo/PDB/Native/InfoStream.h"
-#include "llvm/DebugInfo/PDB/Native/ModuleDebugStream.h"
-#include "llvm/DebugInfo/PDB/Native/PDBFile.h"
-#include "llvm/DebugInfo/PDB/Native/RawConstants.h"
-#include "llvm/DebugInfo/PDB/Native/RawError.h"
-#include "llvm/DebugInfo/PDB/Native/TpiStream.h"
-
-using namespace llvm;
-using namespace llvm::codeview;
-using namespace llvm::pdb;
-
-YAMLOutputStyle::YAMLOutputStyle(PDBFile &File)
- : File(File), Out(outs()), Obj(File.getAllocator()) {
- Out.setWriteDefaultValues(!opts::pdb2yaml::Minimal);
-}
-
-Error YAMLOutputStyle::dump() {
- if (opts::pdb2yaml::StreamDirectory)
- opts::pdb2yaml::StreamMetadata = true;
-
- if (auto EC = dumpFileHeaders())
- return EC;
-
- if (auto EC = dumpStreamMetadata())
- return EC;
-
- if (auto EC = dumpStreamDirectory())
- return EC;
-
- if (auto EC = dumpStringTable())
- return EC;
-
- if (auto EC = dumpPDBStream())
- return EC;
-
- if (auto EC = dumpDbiStream())
- return EC;
-
- if (auto EC = dumpTpiStream())
- return EC;
-
- if (auto EC = dumpIpiStream())
- return EC;
-
- flush();
- return Error::success();
-}
-
-
-Error YAMLOutputStyle::dumpFileHeaders() {
- if (opts::pdb2yaml::NoFileHeaders)
- return Error::success();
-
- yaml::MSFHeaders Headers;
- Obj.Headers.emplace();
- Obj.Headers->SuperBlock.NumBlocks = File.getBlockCount();
- Obj.Headers->SuperBlock.BlockMapAddr = File.getBlockMapIndex();
- Obj.Headers->SuperBlock.BlockSize = File.getBlockSize();
- auto Blocks = File.getDirectoryBlockArray();
- Obj.Headers->DirectoryBlocks.assign(Blocks.begin(), Blocks.end());
- Obj.Headers->NumDirectoryBlocks = File.getNumDirectoryBlocks();
- Obj.Headers->SuperBlock.NumDirectoryBytes = File.getNumDirectoryBytes();
- Obj.Headers->NumStreams =
- opts::pdb2yaml::StreamMetadata ? File.getNumStreams() : 0;
- Obj.Headers->SuperBlock.FreeBlockMapBlock = File.getFreeBlockMapBlock();
- Obj.Headers->SuperBlock.Unknown1 = File.getUnknown1();
- Obj.Headers->FileSize = File.getFileSize();
-
- return Error::success();
-}
-
-Error YAMLOutputStyle::dumpStringTable() {
- bool RequiresStringTable = opts::shared::DumpModuleFiles ||
- !opts::shared::DumpModuleSubsections.empty();
- bool RequestedStringTable = opts::pdb2yaml::StringTable;
- if (!RequiresStringTable && !RequestedStringTable)
- return Error::success();
-
- auto ExpectedST = File.getStringTable();
- if (!ExpectedST)
- return ExpectedST.takeError();
-
- Obj.StringTable.emplace();
- const auto &ST = ExpectedST.get();
- for (auto ID : ST.name_ids()) {
- auto S = ST.getStringForID(ID);
- if (!S)
- return S.takeError();
- if (S->empty())
- continue;
- Obj.StringTable->push_back(*S);
- }
- return Error::success();
-}
-
-Error YAMLOutputStyle::dumpStreamMetadata() {
- if (!opts::pdb2yaml::StreamMetadata)
- return Error::success();
-
- Obj.StreamSizes.emplace();
- Obj.StreamSizes->assign(File.getStreamSizes().begin(),
- File.getStreamSizes().end());
- return Error::success();
-}
-
-Error YAMLOutputStyle::dumpStreamDirectory() {
- if (!opts::pdb2yaml::StreamDirectory)
- return Error::success();
-
- auto StreamMap = File.getStreamMap();
- Obj.StreamMap.emplace();
- for (auto &Stream : StreamMap) {
- pdb::yaml::StreamBlockList BlockList;
- BlockList.Blocks.assign(Stream.begin(), Stream.end());
- Obj.StreamMap->push_back(BlockList);
- }
-
- return Error::success();
-}
-
-Error YAMLOutputStyle::dumpPDBStream() {
- if (!opts::pdb2yaml::PdbStream)
- return Error::success();
-
- auto IS = File.getPDBInfoStream();
- if (!IS)
- return IS.takeError();
-
- auto &InfoS = IS.get();
- Obj.PdbStream.emplace();
- Obj.PdbStream->Age = InfoS.getAge();
- Obj.PdbStream->Guid = InfoS.getGuid();
- Obj.PdbStream->Signature = InfoS.getSignature();
- Obj.PdbStream->Version = InfoS.getVersion();
- Obj.PdbStream->Features = InfoS.getFeatureSignatures();
-
- return Error::success();
-}
-
-static opts::ModuleSubsection convertSubsectionKind(DebugSubsectionKind K) {
- switch (K) {
- case DebugSubsectionKind::CrossScopeExports:
- return opts::ModuleSubsection::CrossScopeExports;
- case DebugSubsectionKind::CrossScopeImports:
- return opts::ModuleSubsection::CrossScopeImports;
- case DebugSubsectionKind::FileChecksums:
- return opts::ModuleSubsection::FileChecksums;
- case DebugSubsectionKind::InlineeLines:
- return opts::ModuleSubsection::InlineeLines;
- case DebugSubsectionKind::Lines:
- return opts::ModuleSubsection::Lines;
- case DebugSubsectionKind::Symbols:
- return opts::ModuleSubsection::Symbols;
- case DebugSubsectionKind::StringTable:
- return opts::ModuleSubsection::StringTable;
- case DebugSubsectionKind::FrameData:
- return opts::ModuleSubsection::FrameData;
- default:
- return opts::ModuleSubsection::Unknown;
- }
- llvm_unreachable("Unreachable!");
-}
-
-Error YAMLOutputStyle::dumpDbiStream() {
- if (!opts::pdb2yaml::DbiStream)
- return Error::success();
-
- auto DbiS = File.getPDBDbiStream();
- if (!DbiS)
- return DbiS.takeError();
-
- auto &DS = DbiS.get();
- Obj.DbiStream.emplace();
- Obj.DbiStream->Age = DS.getAge();
- Obj.DbiStream->BuildNumber = DS.getBuildNumber();
- Obj.DbiStream->Flags = DS.getFlags();
- Obj.DbiStream->MachineType = DS.getMachineType();
- Obj.DbiStream->PdbDllRbld = DS.getPdbDllRbld();
- Obj.DbiStream->PdbDllVersion = DS.getPdbDllVersion();
- Obj.DbiStream->VerHeader = DS.getDbiVersion();
- if (opts::shared::DumpModules) {
- const auto &Modules = DS.modules();
- for (uint32_t I = 0; I < Modules.getModuleCount(); ++I) {
- DbiModuleDescriptor MI = Modules.getModuleDescriptor(I);
-
- Obj.DbiStream->ModInfos.emplace_back();
- yaml::PdbDbiModuleInfo &DMI = Obj.DbiStream->ModInfos.back();
-
- DMI.Mod = MI.getModuleName();
- DMI.Obj = MI.getObjFileName();
- if (opts::shared::DumpModuleFiles) {
- auto Files = Modules.source_files(I);
- DMI.SourceFiles.assign(Files.begin(), Files.end());
- }
-
- uint16_t ModiStream = MI.getModuleStreamIndex();
- if (ModiStream == kInvalidStreamIndex)
- continue;
-
- auto ModStreamData = msf::MappedBlockStream::createIndexedStream(
- File.getMsfLayout(), File.getMsfBuffer(), ModiStream,
- File.getAllocator());
-
- pdb::ModuleDebugStreamRef ModS(MI, std::move(ModStreamData));
- if (auto EC = ModS.reload())
- return EC;
-
- auto ExpectedST = File.getStringTable();
- if (!ExpectedST)
- return ExpectedST.takeError();
- if (!opts::shared::DumpModuleSubsections.empty() &&
- ModS.hasDebugSubsections()) {
- auto ExpectedChecksums = ModS.findChecksumsSubsection();
- if (!ExpectedChecksums)
- return ExpectedChecksums.takeError();
-
- for (const auto &SS : ModS.subsections()) {
- opts::ModuleSubsection OptionKind = convertSubsectionKind(SS.kind());
- if (!opts::checkModuleSubsection(OptionKind))
- continue;
-
- auto Converted =
- CodeViewYAML::YAMLDebugSubsection::fromCodeViewSubection(
- ExpectedST->getStringTable(), *ExpectedChecksums, SS);
- if (!Converted)
- return Converted.takeError();
- DMI.Subsections.push_back(*Converted);
- }
- }
-
- if (opts::shared::DumpModuleSyms) {
- DMI.Modi.emplace();
-
- DMI.Modi->Signature = ModS.signature();
- bool HadError = false;
- for (auto &Sym : ModS.symbols(&HadError)) {
- auto ES = CodeViewYAML::SymbolRecord::fromCodeViewSymbol(Sym);
- if (!ES)
- return ES.takeError();
-
- DMI.Modi->Symbols.push_back(*ES);
- }
- }
- }
- }
- return Error::success();
-}
-
-Error YAMLOutputStyle::dumpTpiStream() {
- if (!opts::pdb2yaml::TpiStream)
- return Error::success();
-
- auto TpiS = File.getPDBTpiStream();
- if (!TpiS)
- return TpiS.takeError();
-
- auto &TS = TpiS.get();
- Obj.TpiStream.emplace();
- Obj.TpiStream->Version = TS.getTpiVersion();
- for (auto &Record : TS.types(nullptr)) {
- auto ExpectedRecord = CodeViewYAML::LeafRecord::fromCodeViewRecord(Record);
- if (!ExpectedRecord)
- return ExpectedRecord.takeError();
- Obj.TpiStream->Records.push_back(*ExpectedRecord);
- }
-
- return Error::success();
-}
-
-Error YAMLOutputStyle::dumpIpiStream() {
- if (!opts::pdb2yaml::IpiStream)
- return Error::success();
-
- auto IpiS = File.getPDBIpiStream();
- if (!IpiS)
- return IpiS.takeError();
-
- auto &IS = IpiS.get();
- Obj.IpiStream.emplace();
- Obj.IpiStream->Version = IS.getTpiVersion();
- for (auto &Record : IS.types(nullptr)) {
- auto ExpectedRecord = CodeViewYAML::LeafRecord::fromCodeViewRecord(Record);
- if (!ExpectedRecord)
- return ExpectedRecord.takeError();
-
- Obj.IpiStream->Records.push_back(*ExpectedRecord);
- }
-
- return Error::success();
-}
-
-void YAMLOutputStyle::flush() {
- Out << Obj;
- outs().flush();
-}
diff --git a/llvm/tools/llvm-pdbdump/YAMLOutputStyle.h b/llvm/tools/llvm-pdbdump/YAMLOutputStyle.h
deleted file mode 100644
index 3690e3529d4..00000000000
--- a/llvm/tools/llvm-pdbdump/YAMLOutputStyle.h
+++ /dev/null
@@ -1,49 +0,0 @@
-//===- YAMLOutputStyle.h -------------------------------------- *- C++ --*-===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef LLVM_TOOLS_LLVMPDBDUMP_YAMLOUTPUTSTYLE_H
-#define LLVM_TOOLS_LLVMPDBDUMP_YAMLOUTPUTSTYLE_H
-
-#include "OutputStyle.h"
-#include "PdbYaml.h"
-
-#include "llvm/Support/ScopedPrinter.h"
-#include "llvm/Support/YAMLTraits.h"
-
-namespace llvm {
-namespace pdb {
-class ModuleDebugStreamRef;
-
-class YAMLOutputStyle : public OutputStyle {
-public:
- YAMLOutputStyle(PDBFile &File);
-
- Error dump() override;
-
-private:
- Error dumpStringTable();
- Error dumpFileHeaders();
- Error dumpStreamMetadata();
- Error dumpStreamDirectory();
- Error dumpPDBStream();
- Error dumpDbiStream();
- Error dumpTpiStream();
- Error dumpIpiStream();
-
- void flush();
-
- PDBFile &File;
- llvm::yaml::Output Out;
-
- yaml::PdbObject Obj;
-};
-} // namespace pdb
-} // namespace llvm
-
-#endif // LLVM_TOOLS_LLVMPDBDUMP_YAMLOUTPUTSTYLE_H
diff --git a/llvm/tools/llvm-pdbdump/fuzzer/CMakeLists.txt b/llvm/tools/llvm-pdbdump/fuzzer/CMakeLists.txt
deleted file mode 100644
index cf5a0f70aab..00000000000
--- a/llvm/tools/llvm-pdbdump/fuzzer/CMakeLists.txt
+++ /dev/null
@@ -1,15 +0,0 @@
-set(LLVM_LINK_COMPONENTS
- DebugInfoCodeView
- DebugInfoPDB
- Object
- Support
- )
-
-add_llvm_executable(llvm-pdbdump-fuzzer
- EXCLUDE_FROM_ALL
- llvm-pdbdump-fuzzer.cpp
- )
-
-target_link_libraries(llvm-pdbdump-fuzzer
- LLVMFuzzer
- )
diff --git a/llvm/tools/llvm-pdbdump/fuzzer/llvm-pdbdump-fuzzer.cpp b/llvm/tools/llvm-pdbdump/fuzzer/llvm-pdbdump-fuzzer.cpp
deleted file mode 100644
index 5f09416a9ff..00000000000
--- a/llvm/tools/llvm-pdbdump/fuzzer/llvm-pdbdump-fuzzer.cpp
+++ /dev/null
@@ -1,105 +0,0 @@
-//===-- llvm-pdbdump-fuzzer.cpp - Fuzz the llvm-pdbdump tool --------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-///
-/// \file
-/// \brief This file implements a function that runs llvm-pdbdump
-/// on a single input. This function is then linked into the Fuzzer library.
-///
-//===----------------------------------------------------------------------===//
-#include "llvm/ADT/STLExtras.h"
-#include "llvm/DebugInfo/CodeView/BinaryByteStream.h"
-#include "llvm/DebugInfo/CodeView/SymbolDumper.h"
-#include "llvm/DebugInfo/CodeView/TypeDumper.h"
-#include "llvm/DebugInfo/PDB/Raw/DbiStream.h"
-#include "llvm/DebugInfo/PDB/Raw/IPDBStreamData.h"
-#include "llvm/DebugInfo/PDB/Raw/MappedBlockStream.h"
-#include "llvm/DebugInfo/PDB/Raw/ModuleDebugStream.h"
-#include "llvm/DebugInfo/PDB/Raw/PDBFile.h"
-#include "llvm/DebugInfo/PDB/Raw/RawSession.h"
-#include "llvm/Support/MemoryBuffer.h"
-#include "llvm/Support/ScopedPrinter.h"
-
-using namespace llvm;
-
-namespace {
-// We need a class which behaves like an immutable BinaryByteStream, but whose
-// data
-// is backed by an llvm::MemoryBuffer. It also needs to own the underlying
-// MemoryBuffer, so this simple adapter is a good way to achieve that.
-class InputByteStream : public codeview::BinaryByteStream<false> {
-public:
- explicit InputByteStream(std::unique_ptr<MemoryBuffer> Buffer)
- : BinaryByteStream(ArrayRef<uint8_t>(Buffer->getBuffer().bytes_begin(),
- Buffer->getBuffer().bytes_end())),
- MemBuffer(std::move(Buffer)) {}
-
- std::unique_ptr<MemoryBuffer> MemBuffer;
-};
-}
-
-extern "C" int LLVMFuzzerTestOneInput(uint8_t *data, size_t size) {
- std::unique_ptr<MemoryBuffer> Buff = MemoryBuffer::getMemBuffer(
- StringRef((const char *)data, size), "", false);
-
- ScopedPrinter P(nulls());
- codeview::CVTypeDumper TD(&P, false);
-
- auto InputStream = llvm::make_unique<InputByteStream>(std::move(Buff));
- std::unique_ptr<pdb::PDBFile> File(new pdb::PDBFile(std::move(InputStream)));
- if (auto E = File->parseFileHeaders()) {
- consumeError(std::move(E));
- return 0;
- }
- if (auto E = File->parseStreamData()) {
- consumeError(std::move(E));
- return 0;
- }
-
- auto DbiS = File->getPDBDbiStream();
- if (auto E = DbiS.takeError()) {
- consumeError(std::move(E));
- return 0;
- }
- auto TpiS = File->getPDBTpiStream();
- if (auto E = TpiS.takeError()) {
- consumeError(std::move(E));
- return 0;
- }
- auto IpiS = File->getPDBIpiStream();
- if (auto E = IpiS.takeError()) {
- consumeError(std::move(E));
- return 0;
- }
- auto InfoS = File->getPDBInfoStream();
- if (auto E = InfoS.takeError()) {
- consumeError(std::move(E));
- return 0;
- }
- pdb::DbiStream &DS = DbiS.get();
-
- for (auto &Modi : DS.modules()) {
- auto ModStreamData = pdb::MappedBlockStream::createIndexedStream(
- Modi.Info.getModuleStreamIndex(), *File, File->getAllocator());
- if (!ModStreamData) {
- consumeError(ModStreamData.takeError());
- return 0;
- }
- pdb::ModuleDebugStreamRef ModS(Modi.Info, std::move(*ModStreamData));
- if (auto E = ModS.reload()) {
- consumeError(std::move(E));
- return 0;
- }
- codeview::CVSymbolDumper SD(P, TD, nullptr, false);
- bool HadError = false;
- for (auto &S : ModS.symbols(&HadError)) {
- SD.dump(S);
- }
- }
- return 0;
-}
diff --git a/llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp b/llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp
deleted file mode 100644
index c6e2b613f4d..00000000000
--- a/llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp
+++ /dev/null
@@ -1,1023 +0,0 @@
-//===- llvm-pdbdump.cpp - Dump debug info from a PDB file -------*- C++ -*-===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-//
-// Dumps debug information present in PDB files.
-//
-//===----------------------------------------------------------------------===//
-
-#include "llvm-pdbdump.h"
-
-#include "Analyze.h"
-#include "Diff.h"
-#include "LLVMOutputStyle.h"
-#include "LinePrinter.h"
-#include "OutputStyle.h"
-#include "PrettyCompilandDumper.h"
-#include "PrettyExternalSymbolDumper.h"
-#include "PrettyFunctionDumper.h"
-#include "PrettyTypeDumper.h"
-#include "PrettyVariableDumper.h"
-#include "YAMLOutputStyle.h"
-
-#include "llvm/ADT/ArrayRef.h"
-#include "llvm/ADT/BitVector.h"
-#include "llvm/ADT/DenseMap.h"
-#include "llvm/ADT/STLExtras.h"
-#include "llvm/ADT/StringExtras.h"
-#include "llvm/Config/config.h"
-#include "llvm/DebugInfo/CodeView/DebugChecksumsSubsection.h"
-#include "llvm/DebugInfo/CodeView/DebugInlineeLinesSubsection.h"
-#include "llvm/DebugInfo/CodeView/DebugLinesSubsection.h"
-#include "llvm/DebugInfo/CodeView/LazyRandomTypeCollection.h"
-#include "llvm/DebugInfo/CodeView/TypeStreamMerger.h"
-#include "llvm/DebugInfo/CodeView/TypeTableBuilder.h"
-#include "llvm/DebugInfo/MSF/MSFBuilder.h"
-#include "llvm/DebugInfo/PDB/GenericError.h"
-#include "llvm/DebugInfo/PDB/IPDBEnumChildren.h"
-#include "llvm/DebugInfo/PDB/IPDBRawSymbol.h"
-#include "llvm/DebugInfo/PDB/IPDBSession.h"
-#include "llvm/DebugInfo/PDB/Native/DbiModuleDescriptorBuilder.h"
-#include "llvm/DebugInfo/PDB/Native/DbiStream.h"
-#include "llvm/DebugInfo/PDB/Native/DbiStreamBuilder.h"
-#include "llvm/DebugInfo/PDB/Native/InfoStream.h"
-#include "llvm/DebugInfo/PDB/Native/InfoStreamBuilder.h"
-#include "llvm/DebugInfo/PDB/Native/NativeSession.h"
-#include "llvm/DebugInfo/PDB/Native/PDBFile.h"
-#include "llvm/DebugInfo/PDB/Native/PDBFileBuilder.h"
-#include "llvm/DebugInfo/PDB/Native/PDBStringTableBuilder.h"
-#include "llvm/DebugInfo/PDB/Native/RawConstants.h"
-#include "llvm/DebugInfo/PDB/Native/RawError.h"
-#include "llvm/DebugInfo/PDB/Native/TpiStream.h"
-#include "llvm/DebugInfo/PDB/Native/TpiStreamBuilder.h"
-#include "llvm/DebugInfo/PDB/PDB.h"
-#include "llvm/DebugInfo/PDB/PDBSymbolCompiland.h"
-#include "llvm/DebugInfo/PDB/PDBSymbolData.h"
-#include "llvm/DebugInfo/PDB/PDBSymbolExe.h"
-#include "llvm/DebugInfo/PDB/PDBSymbolFunc.h"
-#include "llvm/DebugInfo/PDB/PDBSymbolThunk.h"
-#include "llvm/Support/BinaryByteStream.h"
-#include "llvm/Support/COM.h"
-#include "llvm/Support/CommandLine.h"
-#include "llvm/Support/ConvertUTF.h"
-#include "llvm/Support/FileOutputBuffer.h"
-#include "llvm/Support/FileSystem.h"
-#include "llvm/Support/Format.h"
-#include "llvm/Support/ManagedStatic.h"
-#include "llvm/Support/MemoryBuffer.h"
-#include "llvm/Support/Path.h"
-#include "llvm/Support/PrettyStackTrace.h"
-#include "llvm/Support/Process.h"
-#include "llvm/Support/Regex.h"
-#include "llvm/Support/ScopedPrinter.h"
-#include "llvm/Support/Signals.h"
-#include "llvm/Support/raw_ostream.h"
-
-using namespace llvm;
-using namespace llvm::codeview;
-using namespace llvm::msf;
-using namespace llvm::pdb;
-
-namespace opts {
-
-cl::SubCommand RawSubcommand("raw", "Dump raw structure of the PDB file");
-cl::SubCommand
- PrettySubcommand("pretty",
- "Dump semantic information about types and symbols");
-
-cl::SubCommand DiffSubcommand("diff", "Diff the contents of 2 PDB files");
-
-cl::SubCommand
- YamlToPdbSubcommand("yaml2pdb",
- "Generate a PDB file from a YAML description");
-cl::SubCommand
- PdbToYamlSubcommand("pdb2yaml",
- "Generate a detailed YAML description of a PDB File");
-
-cl::SubCommand
- AnalyzeSubcommand("analyze",
- "Analyze various aspects of a PDB's structure");
-
-cl::SubCommand MergeSubcommand("merge",
- "Merge multiple PDBs into a single PDB");
-
-cl::OptionCategory TypeCategory("Symbol Type Options");
-cl::OptionCategory FilterCategory("Filtering and Sorting Options");
-cl::OptionCategory OtherOptions("Other Options");
-
-namespace pretty {
-cl::list<std::string> InputFilenames(cl::Positional,
- cl::desc("<input PDB files>"),
- cl::OneOrMore, cl::sub(PrettySubcommand));
-
-cl::opt<bool> Compilands("compilands", cl::desc("Display compilands"),
- cl::cat(TypeCategory), cl::sub(PrettySubcommand));
-cl::opt<bool> Symbols("module-syms",
- cl::desc("Display symbols for each compiland"),
- cl::cat(TypeCategory), cl::sub(PrettySubcommand));
-cl::opt<bool> Globals("globals", cl::desc("Dump global symbols"),
- cl::cat(TypeCategory), cl::sub(PrettySubcommand));
-cl::opt<bool> Externals("externals", cl::desc("Dump external symbols"),
- cl::cat(TypeCategory), cl::sub(PrettySubcommand));
-cl::list<SymLevel> SymTypes(
- "sym-types", cl::desc("Type of symbols to dump (default all)"),
- cl::cat(TypeCategory), cl::sub(PrettySubcommand), cl::ZeroOrMore,
- cl::values(
- clEnumValN(SymLevel::Thunks, "thunks", "Display thunk symbols"),
- clEnumValN(SymLevel::Data, "data", "Display data symbols"),
- clEnumValN(SymLevel::Functions, "funcs", "Display function symbols"),
- clEnumValN(SymLevel::All, "all", "Display all symbols (default)")));
-
-cl::opt<bool>
- Types("types",
- cl::desc("Display all types (implies -classes, -enums, -typedefs)"),
- cl::cat(TypeCategory), cl::sub(PrettySubcommand));
-cl::opt<bool> Classes("classes", cl::desc("Display class types"),
- cl::cat(TypeCategory), cl::sub(PrettySubcommand));
-cl::opt<bool> Enums("enums", cl::desc("Display enum types"),
- cl::cat(TypeCategory), cl::sub(PrettySubcommand));
-cl::opt<bool> Typedefs("typedefs", cl::desc("Display typedef types"),
- cl::cat(TypeCategory), cl::sub(PrettySubcommand));
-cl::opt<SymbolSortMode> SymbolOrder(
- "symbol-order", cl::desc("symbol sort order"),
- cl::init(SymbolSortMode::None),
- cl::values(clEnumValN(SymbolSortMode::None, "none",
- "Undefined / no particular sort order"),
- clEnumValN(SymbolSortMode::Name, "name", "Sort symbols by name"),
- clEnumValN(SymbolSortMode::Size, "size",
- "Sort symbols by size")),
- cl::cat(TypeCategory), cl::sub(PrettySubcommand));
-
-cl::opt<ClassSortMode> ClassOrder(
- "class-order", cl::desc("Class sort order"), cl::init(ClassSortMode::None),
- cl::values(
- clEnumValN(ClassSortMode::None, "none",
- "Undefined / no particular sort order"),
- clEnumValN(ClassSortMode::Name, "name", "Sort classes by name"),
- clEnumValN(ClassSortMode::Size, "size", "Sort classes by size"),
- clEnumValN(ClassSortMode::Padding, "padding",
- "Sort classes by amount of padding"),
- clEnumValN(ClassSortMode::PaddingPct, "padding-pct",
- "Sort classes by percentage of space consumed by padding"),
- clEnumValN(ClassSortMode::PaddingImmediate, "padding-imm",
- "Sort classes by amount of immediate padding"),
- clEnumValN(ClassSortMode::PaddingPctImmediate, "padding-pct-imm",
- "Sort classes by percentage of space consumed by immediate "
- "padding")),
- cl::cat(TypeCategory), cl::sub(PrettySubcommand));
-
-cl::opt<ClassDefinitionFormat> ClassFormat(
- "class-definitions", cl::desc("Class definition format"),
- cl::init(ClassDefinitionFormat::All),
- cl::values(
- clEnumValN(ClassDefinitionFormat::All, "all",
- "Display all class members including data, constants, "
- "typedefs, functions, etc"),
- clEnumValN(ClassDefinitionFormat::Layout, "layout",
- "Only display members that contribute to class size."),
- clEnumValN(ClassDefinitionFormat::None, "none",
- "Don't display class definitions")),
- cl::cat(TypeCategory), cl::sub(PrettySubcommand));
-cl::opt<uint32_t> ClassRecursionDepth(
- "class-recurse-depth", cl::desc("Class recursion depth (0=no limit)"),
- cl::init(0), cl::cat(TypeCategory), cl::sub(PrettySubcommand));
-
-cl::opt<bool> Lines("lines", cl::desc("Line tables"), cl::cat(TypeCategory),
- cl::sub(PrettySubcommand));
-cl::opt<bool>
- All("all", cl::desc("Implies all other options in 'Symbol Types' category"),
- cl::cat(TypeCategory), cl::sub(PrettySubcommand));
-
-cl::opt<uint64_t> LoadAddress(
- "load-address",
- cl::desc("Assume the module is loaded at the specified address"),
- cl::cat(OtherOptions), cl::sub(PrettySubcommand));
-cl::opt<bool> Native("native", cl::desc("Use native PDB reader instead of DIA"),
- cl::cat(OtherOptions), cl::sub(PrettySubcommand));
-cl::opt<cl::boolOrDefault>
- ColorOutput("color-output",
- cl::desc("Override use of color (default = isatty)"),
- cl::cat(OtherOptions), cl::sub(PrettySubcommand));
-cl::list<std::string> ExcludeTypes(
- "exclude-types", cl::desc("Exclude types by regular expression"),
- cl::ZeroOrMore, cl::cat(FilterCategory), cl::sub(PrettySubcommand));
-cl::list<std::string> ExcludeSymbols(
- "exclude-symbols", cl::desc("Exclude symbols by regular expression"),
- cl::ZeroOrMore, cl::cat(FilterCategory), cl::sub(PrettySubcommand));
-cl::list<std::string> ExcludeCompilands(
- "exclude-compilands", cl::desc("Exclude compilands by regular expression"),
- cl::ZeroOrMore, cl::cat(FilterCategory), cl::sub(PrettySubcommand));
-
-cl::list<std::string> IncludeTypes(
- "include-types",
- cl::desc("Include only types which match a regular expression"),
- cl::ZeroOrMore, cl::cat(FilterCategory), cl::sub(PrettySubcommand));
-cl::list<std::string> IncludeSymbols(
- "include-symbols",
- cl::desc("Include only symbols which match a regular expression"),
- cl::ZeroOrMore, cl::cat(FilterCategory), cl::sub(PrettySubcommand));
-cl::list<std::string> IncludeCompilands(
- "include-compilands",
- cl::desc("Include only compilands those which match a regular expression"),
- cl::ZeroOrMore, cl::cat(FilterCategory), cl::sub(PrettySubcommand));
-cl::opt<uint32_t> SizeThreshold(
- "min-type-size", cl::desc("Displays only those types which are greater "
- "than or equal to the specified size."),
- cl::init(0), cl::cat(FilterCategory), cl::sub(PrettySubcommand));
-cl::opt<uint32_t> PaddingThreshold(
- "min-class-padding", cl::desc("Displays only those classes which have at "
- "least the specified amount of padding."),
- cl::init(0), cl::cat(FilterCategory), cl::sub(PrettySubcommand));
-cl::opt<uint32_t> ImmediatePaddingThreshold(
- "min-class-padding-imm",
- cl::desc("Displays only those classes which have at least the specified "
- "amount of immediate padding, ignoring padding internal to bases "
- "and aggregates."),
- cl::init(0), cl::cat(FilterCategory), cl::sub(PrettySubcommand));
-
-cl::opt<bool> ExcludeCompilerGenerated(
- "no-compiler-generated",
- cl::desc("Don't show compiler generated types and symbols"),
- cl::cat(FilterCategory), cl::sub(PrettySubcommand));
-cl::opt<bool>
- ExcludeSystemLibraries("no-system-libs",
- cl::desc("Don't show symbols from system libraries"),
- cl::cat(FilterCategory), cl::sub(PrettySubcommand));
-
-cl::opt<bool> NoEnumDefs("no-enum-definitions",
- cl::desc("Don't display full enum definitions"),
- cl::cat(FilterCategory), cl::sub(PrettySubcommand));
-}
-
-namespace diff {
-cl::opt<bool> Pedantic("pedantic",
- cl::desc("Finds all differences (even structural ones "
- "that produce otherwise identical PDBs)"),
- cl::sub(DiffSubcommand));
-
-cl::list<std::string> InputFilenames(cl::Positional,
- cl::desc("<first> <second>"),
- cl::OneOrMore, cl::sub(DiffSubcommand));
-}
-
-namespace raw {
-
-cl::OptionCategory MsfOptions("MSF Container Options");
-cl::OptionCategory TypeOptions("Type Record Options");
-cl::OptionCategory SymbolOptions("Symbol Options");
-cl::OptionCategory MiscOptions("Miscellaneous Options");
-
-// MSF OPTIONS
-cl::opt<bool> DumpHeaders("headers", cl::desc("dump PDB headers"),
- cl::cat(MsfOptions), cl::sub(RawSubcommand));
-cl::opt<bool> DumpStreamBlocks("stream-blocks",
- cl::desc("dump PDB stream blocks"),
- cl::cat(MsfOptions), cl::sub(RawSubcommand));
-cl::opt<bool> DumpStreamSummary("stream-summary",
- cl::desc("dump summary of the PDB streams"),
- cl::cat(MsfOptions), cl::sub(RawSubcommand));
-cl::opt<bool> DumpPageStats(
- "page-stats",
- cl::desc("dump allocation stats of the pages in the MSF file"),
- cl::cat(MsfOptions), cl::sub(RawSubcommand));
-cl::opt<std::string>
- DumpBlockRangeOpt("block-data", cl::value_desc("start[-end]"),
- cl::desc("Dump binary data from specified range."),
- cl::cat(MsfOptions), cl::sub(RawSubcommand));
-llvm::Optional<BlockRange> DumpBlockRange;
-
-cl::list<std::string>
- DumpStreamData("stream-data", cl::CommaSeparated, cl::ZeroOrMore,
- cl::desc("Dump binary data from specified streams. Format "
- "is SN[:Start][@Size]"),
- cl::cat(MsfOptions), cl::sub(RawSubcommand));
-
-// TYPE OPTIONS
-cl::opt<bool>
- CompactRecords("compact-records",
- cl::desc("Dump type and symbol records with less detail"),
- cl::cat(TypeOptions), cl::sub(RawSubcommand));
-
-cl::opt<bool>
- DumpTpiRecords("tpi-records",
- cl::desc("dump CodeView type records from TPI stream"),
- cl::cat(TypeOptions), cl::sub(RawSubcommand));
-cl::opt<bool> DumpTpiRecordBytes(
- "tpi-record-bytes",
- cl::desc("dump CodeView type record raw bytes from TPI stream"),
- cl::cat(TypeOptions), cl::sub(RawSubcommand));
-cl::opt<bool> DumpTpiHash("tpi-hash", cl::desc("dump CodeView TPI hash stream"),
- cl::cat(TypeOptions), cl::sub(RawSubcommand));
-cl::opt<bool>
- DumpIpiRecords("ipi-records",
- cl::desc("dump CodeView type records from IPI stream"),
- cl::cat(TypeOptions), cl::sub(RawSubcommand));
-cl::opt<bool> DumpIpiRecordBytes(
- "ipi-record-bytes",
- cl::desc("dump CodeView type record raw bytes from IPI stream"),
- cl::cat(TypeOptions), cl::sub(RawSubcommand));
-
-// SYMBOL OPTIONS
-cl::opt<bool> DumpGlobals("globals", cl::desc("dump globals stream data"),
- cl::cat(SymbolOptions), cl::sub(RawSubcommand));
-cl::opt<bool> DumpPublics("publics", cl::desc("dump Publics stream data"),
- cl::cat(SymbolOptions), cl::sub(RawSubcommand));
-cl::opt<bool>
- DumpSymRecordBytes("sym-record-bytes",
- cl::desc("dump CodeView symbol record raw bytes"),
- cl::cat(SymbolOptions), cl::sub(RawSubcommand));
-
-// MISCELLANEOUS OPTIONS
-cl::opt<bool> DumpStringTable("string-table", cl::desc("dump PDB String Table"),
- cl::cat(MiscOptions), cl::sub(RawSubcommand));
-
-cl::opt<bool> DumpSectionContribs("section-contribs",
- cl::desc("dump section contributions"),
- cl::cat(MiscOptions), cl::sub(RawSubcommand));
-cl::opt<bool> DumpSectionMap("section-map", cl::desc("dump section map"),
- cl::cat(MiscOptions), cl::sub(RawSubcommand));
-cl::opt<bool> DumpSectionHeaders("section-headers",
- cl::desc("dump section headers"),
- cl::cat(MiscOptions), cl::sub(RawSubcommand));
-cl::opt<bool> DumpFpo("fpo", cl::desc("dump FPO records"), cl::cat(MiscOptions),
- cl::sub(RawSubcommand));
-
-cl::opt<bool> RawAll("all", cl::desc("Implies most other options."),
- cl::cat(MiscOptions), cl::sub(RawSubcommand));
-
-cl::list<std::string> InputFilenames(cl::Positional,
- cl::desc("<input PDB files>"),
- cl::OneOrMore, cl::sub(RawSubcommand));
-}
-
-namespace yaml2pdb {
-cl::opt<std::string>
- YamlPdbOutputFile("pdb", cl::desc("the name of the PDB file to write"),
- cl::sub(YamlToPdbSubcommand));
-
-cl::opt<std::string> InputFilename(cl::Positional,
- cl::desc("<input YAML file>"), cl::Required,
- cl::sub(YamlToPdbSubcommand));
-}
-
-namespace pdb2yaml {
-cl::opt<bool> All("all",
- cl::desc("Dump everything we know how to dump."),
- cl::sub(PdbToYamlSubcommand), cl::init(false));
-cl::opt<bool> NoFileHeaders("no-file-headers",
- cl::desc("Do not dump MSF file headers"),
- cl::sub(PdbToYamlSubcommand), cl::init(false));
-cl::opt<bool> Minimal("minimal",
- cl::desc("Don't write fields with default values"),
- cl::sub(PdbToYamlSubcommand), cl::init(false));
-
-cl::opt<bool> StreamMetadata(
- "stream-metadata",
- cl::desc("Dump the number of streams and each stream's size"),
- cl::sub(PdbToYamlSubcommand), cl::init(false));
-cl::opt<bool> StreamDirectory(
- "stream-directory",
- cl::desc("Dump each stream's block map (implies -stream-metadata)"),
- cl::sub(PdbToYamlSubcommand), cl::init(false));
-cl::opt<bool> PdbStream("pdb-stream",
- cl::desc("Dump the PDB Stream (Stream 1)"),
- cl::sub(PdbToYamlSubcommand), cl::init(false));
-
-cl::opt<bool> StringTable("string-table", cl::desc("Dump the PDB String Table"),
- cl::sub(PdbToYamlSubcommand), cl::init(false));
-
-cl::opt<bool> DbiStream("dbi-stream",
- cl::desc("Dump the DBI Stream Headers (Stream 2)"),
- cl::sub(PdbToYamlSubcommand), cl::init(false));
-
-cl::opt<bool> TpiStream("tpi-stream",
- cl::desc("Dump the TPI Stream (Stream 3)"),
- cl::sub(PdbToYamlSubcommand), cl::init(false));
-
-cl::opt<bool> IpiStream("ipi-stream",
- cl::desc("Dump the IPI Stream (Stream 5)"),
- cl::sub(PdbToYamlSubcommand), cl::init(false));
-
-cl::list<std::string> InputFilename(cl::Positional,
- cl::desc("<input PDB file>"), cl::Required,
- cl::sub(PdbToYamlSubcommand));
-}
-
-namespace shared {
-cl::OptionCategory FileOptions("Module & File Options");
-
-// MODULE & FILE OPTIONS
-cl::opt<bool> DumpModules("modules", cl::desc("dump compiland information"),
- cl::cat(FileOptions), cl::sub(RawSubcommand),
- cl::sub(PdbToYamlSubcommand));
-cl::opt<bool> DumpModuleFiles("module-files", cl::desc("dump file information"),
- cl::cat(FileOptions), cl::sub(RawSubcommand),
- cl::sub(PdbToYamlSubcommand));
-cl::list<ModuleSubsection> DumpModuleSubsections(
- "subsections", cl::ZeroOrMore, cl::CommaSeparated,
- cl::desc("dump subsections from each module's debug stream"),
- cl::values(
- clEnumValN(
- ModuleSubsection::CrossScopeExports, "cme",
- "Cross module exports (DEBUG_S_CROSSSCOPEEXPORTS subsection)"),
- clEnumValN(
- ModuleSubsection::CrossScopeImports, "cmi",
- "Cross module imports (DEBUG_S_CROSSSCOPEIMPORTS subsection)"),
- clEnumValN(ModuleSubsection::FileChecksums, "fc",
- "File checksums (DEBUG_S_CHECKSUMS subsection)"),
- clEnumValN(ModuleSubsection::InlineeLines, "ilines",
- "Inlinee lines (DEBUG_S_INLINEELINES subsection)"),
- clEnumValN(ModuleSubsection::Lines, "lines",
- "Lines (DEBUG_S_LINES subsection)"),
- clEnumValN(ModuleSubsection::StringTable, "strings",
- "String Table (DEBUG_S_STRINGTABLE subsection) (not "
- "typically present in PDB file)"),
- clEnumValN(ModuleSubsection::FrameData, "frames",
- "Frame Data (DEBUG_S_FRAMEDATA subsection)"),
- clEnumValN(ModuleSubsection::Symbols, "symbols",
- "Symbols (DEBUG_S_SYMBOLS subsection) (not typically "
- "present in PDB file)"),
- clEnumValN(ModuleSubsection::Unknown, "unknown",
- "Any subsection not covered by another option"),
- clEnumValN(ModuleSubsection::All, "all", "All known subsections")),
- cl::cat(FileOptions), cl::sub(RawSubcommand), cl::sub(PdbToYamlSubcommand));
-cl::opt<bool> DumpModuleSyms("module-syms", cl::desc("dump module symbols"),
- cl::cat(FileOptions), cl::sub(RawSubcommand),
- cl::sub(PdbToYamlSubcommand));
-} // namespace shared
-
-namespace analyze {
-cl::opt<bool> StringTable("hash-collisions", cl::desc("Find hash collisions"),
- cl::sub(AnalyzeSubcommand), cl::init(false));
-cl::list<std::string> InputFilename(cl::Positional,
- cl::desc("<input PDB file>"), cl::Required,
- cl::sub(AnalyzeSubcommand));
-}
-
-namespace merge {
-cl::list<std::string> InputFilenames(cl::Positional,
- cl::desc("<input PDB files>"),
- cl::OneOrMore, cl::sub(MergeSubcommand));
-cl::opt<std::string>
- PdbOutputFile("pdb", cl::desc("the name of the PDB file to write"),
- cl::sub(MergeSubcommand));
-}
-}
-
-static ExitOnError ExitOnErr;
-
-bool opts::checkModuleSubsection(opts::ModuleSubsection MS) {
- return any_of(opts::shared::DumpModuleSubsections,
- [=](opts::ModuleSubsection M) {
- return M == MS || M == opts::ModuleSubsection::All;
- });
-}
-
-static void yamlToPdb(StringRef Path) {
- BumpPtrAllocator Allocator;
- ErrorOr<std::unique_ptr<MemoryBuffer>> ErrorOrBuffer =
- MemoryBuffer::getFileOrSTDIN(Path, /*FileSize=*/-1,
- /*RequiresNullTerminator=*/false);
-
- if (ErrorOrBuffer.getError()) {
- ExitOnErr(make_error<GenericError>(generic_error_code::invalid_path, Path));
- }
-
- std::unique_ptr<MemoryBuffer> &Buffer = ErrorOrBuffer.get();
-
- llvm::yaml::Input In(Buffer->getBuffer());
- pdb::yaml::PdbObject YamlObj(Allocator);
- In >> YamlObj;
-
- PDBFileBuilder Builder(Allocator);
-
- uint32_t BlockSize = 4096;
- if (YamlObj.Headers.hasValue())
- BlockSize = YamlObj.Headers->SuperBlock.BlockSize;
- ExitOnErr(Builder.initialize(BlockSize));
- // Add each of the reserved streams. We ignore stream metadata in the
- // yaml, because we will reconstruct our own view of the streams. For
- // example, the YAML may say that there were 20 streams in the original
- // PDB, but maybe we only dump a subset of those 20 streams, so we will
- // have fewer, and the ones we do have may end up with different indices
- // than the ones in the original PDB. So we just start with a clean slate.
- for (uint32_t I = 0; I < kSpecialStreamCount; ++I)
- ExitOnErr(Builder.getMsfBuilder().addStream(0));
-
- if (YamlObj.StringTable.hasValue()) {
- auto &Strings = Builder.getStringTableBuilder();
- for (auto S : *YamlObj.StringTable)
- Strings.insert(S);
- }
-
- pdb::yaml::PdbInfoStream DefaultInfoStream;
- pdb::yaml::PdbDbiStream DefaultDbiStream;
- pdb::yaml::PdbTpiStream DefaultTpiStream;
- pdb::yaml::PdbTpiStream DefaultIpiStream;
-
- const auto &Info = YamlObj.PdbStream.getValueOr(DefaultInfoStream);
-
- auto &InfoBuilder = Builder.getInfoBuilder();
- InfoBuilder.setAge(Info.Age);
- InfoBuilder.setGuid(Info.Guid);
- InfoBuilder.setSignature(Info.Signature);
- InfoBuilder.setVersion(Info.Version);
- for (auto F : Info.Features)
- InfoBuilder.addFeature(F);
-
- auto &Strings = Builder.getStringTableBuilder().getStrings();
-
- const auto &Dbi = YamlObj.DbiStream.getValueOr(DefaultDbiStream);
- auto &DbiBuilder = Builder.getDbiBuilder();
- DbiBuilder.setAge(Dbi.Age);
- DbiBuilder.setBuildNumber(Dbi.BuildNumber);
- DbiBuilder.setFlags(Dbi.Flags);
- DbiBuilder.setMachineType(Dbi.MachineType);
- DbiBuilder.setPdbDllRbld(Dbi.PdbDllRbld);
- DbiBuilder.setPdbDllVersion(Dbi.PdbDllVersion);
- DbiBuilder.setVersionHeader(Dbi.VerHeader);
- for (const auto &MI : Dbi.ModInfos) {
- auto &ModiBuilder = ExitOnErr(DbiBuilder.addModuleInfo(MI.Mod));
- ModiBuilder.setObjFileName(MI.Obj);
-
- for (auto S : MI.SourceFiles)
- ExitOnErr(DbiBuilder.addModuleSourceFile(MI.Mod, S));
- if (MI.Modi.hasValue()) {
- const auto &ModiStream = *MI.Modi;
- for (auto Symbol : ModiStream.Symbols) {
- ModiBuilder.addSymbol(
- Symbol.toCodeViewSymbol(Allocator, CodeViewContainer::Pdb));
- }
- }
-
- auto CodeViewSubsections = ExitOnErr(CodeViewYAML::toCodeViewSubsectionList(
- Allocator, MI.Subsections, Strings));
- for (auto &SS : CodeViewSubsections) {
- ModiBuilder.addDebugSubsection(std::move(SS));
- }
- }
-
- auto &TpiBuilder = Builder.getTpiBuilder();
- const auto &Tpi = YamlObj.TpiStream.getValueOr(DefaultTpiStream);
- TpiBuilder.setVersionHeader(Tpi.Version);
- for (const auto &R : Tpi.Records) {
- CVType Type = R.toCodeViewRecord(Allocator);
- TpiBuilder.addTypeRecord(Type.RecordData, None);
- }
-
- const auto &Ipi = YamlObj.IpiStream.getValueOr(DefaultIpiStream);
- auto &IpiBuilder = Builder.getIpiBuilder();
- IpiBuilder.setVersionHeader(Ipi.Version);
- for (const auto &R : Ipi.Records) {
- CVType Type = R.toCodeViewRecord(Allocator);
- IpiBuilder.addTypeRecord(Type.RecordData, None);
- }
-
- ExitOnErr(Builder.commit(opts::yaml2pdb::YamlPdbOutputFile));
-}
-
-static PDBFile &loadPDB(StringRef Path, std::unique_ptr<IPDBSession> &Session) {
- ExitOnErr(loadDataForPDB(PDB_ReaderType::Native, Path, Session));
-
- NativeSession *NS = static_cast<NativeSession *>(Session.get());
- return NS->getPDBFile();
-}
-
-static void pdb2Yaml(StringRef Path) {
- std::unique_ptr<IPDBSession> Session;
- auto &File = loadPDB(Path, Session);
-
- auto O = llvm::make_unique<YAMLOutputStyle>(File);
- O = llvm::make_unique<YAMLOutputStyle>(File);
-
- ExitOnErr(O->dump());
-}
-
-static void dumpRaw(StringRef Path) {
- std::unique_ptr<IPDBSession> Session;
- auto &File = loadPDB(Path, Session);
-
- auto O = llvm::make_unique<LLVMOutputStyle>(File);
-
- ExitOnErr(O->dump());
-}
-
-static void dumpAnalysis(StringRef Path) {
- std::unique_ptr<IPDBSession> Session;
- auto &File = loadPDB(Path, Session);
- auto O = llvm::make_unique<AnalysisStyle>(File);
-
- ExitOnErr(O->dump());
-}
-
-static void diff(StringRef Path1, StringRef Path2) {
- std::unique_ptr<IPDBSession> Session1;
- std::unique_ptr<IPDBSession> Session2;
-
- auto &File1 = loadPDB(Path1, Session1);
- auto &File2 = loadPDB(Path2, Session2);
-
- auto O = llvm::make_unique<DiffStyle>(File1, File2);
-
- ExitOnErr(O->dump());
-}
-
-bool opts::pretty::shouldDumpSymLevel(SymLevel Search) {
- if (SymTypes.empty())
- return true;
- if (llvm::find(SymTypes, Search) != SymTypes.end())
- return true;
- if (llvm::find(SymTypes, SymLevel::All) != SymTypes.end())
- return true;
- return false;
-}
-
-uint32_t llvm::pdb::getTypeLength(const PDBSymbolData &Symbol) {
- auto SymbolType = Symbol.getType();
- const IPDBRawSymbol &RawType = SymbolType->getRawSymbol();
-
- return RawType.getLength();
-}
-
-bool opts::pretty::compareFunctionSymbols(
- const std::unique_ptr<PDBSymbolFunc> &F1,
- const std::unique_ptr<PDBSymbolFunc> &F2) {
- assert(opts::pretty::SymbolOrder != opts::pretty::SymbolSortMode::None);
-
- if (opts::pretty::SymbolOrder == opts::pretty::SymbolSortMode::Name)
- return F1->getName() < F2->getName();
-
- // Note that we intentionally sort in descending order on length, since
- // long functions are more interesting than short functions.
- return F1->getLength() > F2->getLength();
-}
-
-bool opts::pretty::compareDataSymbols(
- const std::unique_ptr<PDBSymbolData> &F1,
- const std::unique_ptr<PDBSymbolData> &F2) {
- assert(opts::pretty::SymbolOrder != opts::pretty::SymbolSortMode::None);
-
- if (opts::pretty::SymbolOrder == opts::pretty::SymbolSortMode::Name)
- return F1->getName() < F2->getName();
-
- // Note that we intentionally sort in descending order on length, since
- // large types are more interesting than short ones.
- return getTypeLength(*F1) > getTypeLength(*F2);
-}
-
-static void dumpPretty(StringRef Path) {
- std::unique_ptr<IPDBSession> Session;
-
- const auto ReaderType =
- opts::pretty::Native ? PDB_ReaderType::Native : PDB_ReaderType::DIA;
- ExitOnErr(loadDataForPDB(ReaderType, Path, Session));
-
- if (opts::pretty::LoadAddress)
- Session->setLoadAddress(opts::pretty::LoadAddress);
-
- auto &Stream = outs();
- const bool UseColor = opts::pretty::ColorOutput == cl::BOU_UNSET
- ? Stream.has_colors()
- : opts::pretty::ColorOutput == cl::BOU_TRUE;
- LinePrinter Printer(2, UseColor, Stream);
-
- auto GlobalScope(Session->getGlobalScope());
- std::string FileName(GlobalScope->getSymbolsFileName());
-
- WithColor(Printer, PDB_ColorItem::None).get() << "Summary for ";
- WithColor(Printer, PDB_ColorItem::Path).get() << FileName;
- Printer.Indent();
- uint64_t FileSize = 0;
-
- Printer.NewLine();
- WithColor(Printer, PDB_ColorItem::Identifier).get() << "Size";
- if (!sys::fs::file_size(FileName, FileSize)) {
- Printer << ": " << FileSize << " bytes";
- } else {
- Printer << ": (Unable to obtain file size)";
- }
-
- Printer.NewLine();
- WithColor(Printer, PDB_ColorItem::Identifier).get() << "Guid";
- Printer << ": " << GlobalScope->getGuid();
-
- Printer.NewLine();
- WithColor(Printer, PDB_ColorItem::Identifier).get() << "Age";
- Printer << ": " << GlobalScope->getAge();
-
- Printer.NewLine();
- WithColor(Printer, PDB_ColorItem::Identifier).get() << "Attributes";
- Printer << ": ";
- if (GlobalScope->hasCTypes())
- outs() << "HasCTypes ";
- if (GlobalScope->hasPrivateSymbols())
- outs() << "HasPrivateSymbols ";
- Printer.Unindent();
-
- if (opts::pretty::Compilands) {
- Printer.NewLine();
- WithColor(Printer, PDB_ColorItem::SectionHeader).get()
- << "---COMPILANDS---";
- Printer.Indent();
- auto Compilands = GlobalScope->findAllChildren<PDBSymbolCompiland>();
- CompilandDumper Dumper(Printer);
- CompilandDumpFlags options = CompilandDumper::Flags::None;
- if (opts::pretty::Lines)
- options = options | CompilandDumper::Flags::Lines;
- while (auto Compiland = Compilands->getNext())
- Dumper.start(*Compiland, options);
- Printer.Unindent();
- }
-
- if (opts::pretty::Classes || opts::pretty::Enums || opts::pretty::Typedefs) {
- Printer.NewLine();
- WithColor(Printer, PDB_ColorItem::SectionHeader).get() << "---TYPES---";
- Printer.Indent();
- TypeDumper Dumper(Printer);
- Dumper.start(*GlobalScope);
- Printer.Unindent();
- }
-
- if (opts::pretty::Symbols) {
- Printer.NewLine();
- WithColor(Printer, PDB_ColorItem::SectionHeader).get() << "---SYMBOLS---";
- Printer.Indent();
- auto Compilands = GlobalScope->findAllChildren<PDBSymbolCompiland>();
- CompilandDumper Dumper(Printer);
- while (auto Compiland = Compilands->getNext())
- Dumper.start(*Compiland, true);
- Printer.Unindent();
- }
-
- if (opts::pretty::Globals) {
- Printer.NewLine();
- WithColor(Printer, PDB_ColorItem::SectionHeader).get() << "---GLOBALS---";
- Printer.Indent();
- if (shouldDumpSymLevel(opts::pretty::SymLevel::Functions)) {
- FunctionDumper Dumper(Printer);
- auto Functions = GlobalScope->findAllChildren<PDBSymbolFunc>();
- if (opts::pretty::SymbolOrder == opts::pretty::SymbolSortMode::None) {
- while (auto Function = Functions->getNext()) {
- Printer.NewLine();
- Dumper.start(*Function, FunctionDumper::PointerType::None);
- }
- } else {
- std::vector<std::unique_ptr<PDBSymbolFunc>> Funcs;
- while (auto Func = Functions->getNext())
- Funcs.push_back(std::move(Func));
- std::sort(Funcs.begin(), Funcs.end(),
- opts::pretty::compareFunctionSymbols);
- for (const auto &Func : Funcs) {
- Printer.NewLine();
- Dumper.start(*Func, FunctionDumper::PointerType::None);
- }
- }
- }
- if (shouldDumpSymLevel(opts::pretty::SymLevel::Data)) {
- auto Vars = GlobalScope->findAllChildren<PDBSymbolData>();
- VariableDumper Dumper(Printer);
- if (opts::pretty::SymbolOrder == opts::pretty::SymbolSortMode::None) {
- while (auto Var = Vars->getNext())
- Dumper.start(*Var);
- } else {
- std::vector<std::unique_ptr<PDBSymbolData>> Datas;
- while (auto Var = Vars->getNext())
- Datas.push_back(std::move(Var));
- std::sort(Datas.begin(), Datas.end(), opts::pretty::compareDataSymbols);
- for (const auto &Var : Datas)
- Dumper.start(*Var);
- }
- }
- if (shouldDumpSymLevel(opts::pretty::SymLevel::Thunks)) {
- auto Thunks = GlobalScope->findAllChildren<PDBSymbolThunk>();
- CompilandDumper Dumper(Printer);
- while (auto Thunk = Thunks->getNext())
- Dumper.dump(*Thunk);
- }
- Printer.Unindent();
- }
- if (opts::pretty::Externals) {
- Printer.NewLine();
- WithColor(Printer, PDB_ColorItem::SectionHeader).get() << "---EXTERNALS---";
- Printer.Indent();
- ExternalSymbolDumper Dumper(Printer);
- Dumper.start(*GlobalScope);
- }
- if (opts::pretty::Lines) {
- Printer.NewLine();
- }
- outs().flush();
-}
-
-static void mergePdbs() {
- BumpPtrAllocator Allocator;
- TypeTableBuilder MergedTpi(Allocator);
- TypeTableBuilder MergedIpi(Allocator);
-
- // Create a Tpi and Ipi type table with all types from all input files.
- for (const auto &Path : opts::merge::InputFilenames) {
- std::unique_ptr<IPDBSession> Session;
- auto &File = loadPDB(Path, Session);
- SmallVector<TypeIndex, 128> TypeMap;
- SmallVector<TypeIndex, 128> IdMap;
- if (File.hasPDBTpiStream()) {
- auto &Tpi = ExitOnErr(File.getPDBTpiStream());
- ExitOnErr(codeview::mergeTypeRecords(MergedTpi, TypeMap, nullptr,
- Tpi.typeArray()));
- }
- if (File.hasPDBIpiStream()) {
- auto &Ipi = ExitOnErr(File.getPDBIpiStream());
- ExitOnErr(codeview::mergeIdRecords(MergedIpi, TypeMap, IdMap,
- Ipi.typeArray()));
- }
- }
-
- // Then write the PDB.
- PDBFileBuilder Builder(Allocator);
- ExitOnErr(Builder.initialize(4096));
- // Add each of the reserved streams. We might not put any data in them,
- // but at least they have to be present.
- for (uint32_t I = 0; I < kSpecialStreamCount; ++I)
- ExitOnErr(Builder.getMsfBuilder().addStream(0));
-
- auto &DestTpi = Builder.getTpiBuilder();
- auto &DestIpi = Builder.getIpiBuilder();
- MergedTpi.ForEachRecord([&DestTpi](TypeIndex TI, ArrayRef<uint8_t> Data) {
- DestTpi.addTypeRecord(Data, None);
- });
- MergedIpi.ForEachRecord([&DestIpi](TypeIndex TI, ArrayRef<uint8_t> Data) {
- DestIpi.addTypeRecord(Data, None);
- });
-
- SmallString<64> OutFile(opts::merge::PdbOutputFile);
- if (OutFile.empty()) {
- OutFile = opts::merge::InputFilenames[0];
- llvm::sys::path::replace_extension(OutFile, "merged.pdb");
- }
- ExitOnErr(Builder.commit(OutFile));
-}
-
-int main(int argc_, const char *argv_[]) {
- // Print a stack trace if we signal out.
- sys::PrintStackTraceOnErrorSignal(argv_[0]);
- PrettyStackTraceProgram X(argc_, argv_);
-
- ExitOnErr.setBanner("llvm-pdbdump: ");
-
- SmallVector<const char *, 256> argv;
- SpecificBumpPtrAllocator<char> ArgAllocator;
- ExitOnErr(errorCodeToError(sys::Process::GetArgumentVector(
- argv, makeArrayRef(argv_, argc_), ArgAllocator)));
-
- llvm_shutdown_obj Y; // Call llvm_shutdown() on exit.
-
- cl::ParseCommandLineOptions(argv.size(), argv.data(), "LLVM PDB Dumper\n");
- if (!opts::raw::DumpBlockRangeOpt.empty()) {
- llvm::Regex R("^([0-9]+)(-([0-9]+))?$");
- llvm::SmallVector<llvm::StringRef, 2> Matches;
- if (!R.match(opts::raw::DumpBlockRangeOpt, &Matches)) {
- errs() << "Argument '" << opts::raw::DumpBlockRangeOpt
- << "' invalid format.\n";
- errs().flush();
- exit(1);
- }
- opts::raw::DumpBlockRange.emplace();
- Matches[1].getAsInteger(10, opts::raw::DumpBlockRange->Min);
- if (!Matches[3].empty()) {
- opts::raw::DumpBlockRange->Max.emplace();
- Matches[3].getAsInteger(10, *opts::raw::DumpBlockRange->Max);
- }
- }
-
- if ((opts::RawSubcommand && opts::raw::RawAll) ||
- (opts::PdbToYamlSubcommand && opts::pdb2yaml::All)) {
- opts::shared::DumpModules = true;
- opts::shared::DumpModuleFiles = true;
- opts::shared::DumpModuleSyms = true;
- opts::shared::DumpModuleSubsections.push_back(opts::ModuleSubsection::All);
- if (llvm::is_contained(opts::shared::DumpModuleSubsections,
- opts::ModuleSubsection::All)) {
- opts::shared::DumpModuleSubsections.reset();
- opts::shared::DumpModuleSubsections.push_back(
- opts::ModuleSubsection::All);
- }
- }
-
- if (opts::shared::DumpModuleSyms || opts::shared::DumpModuleFiles)
- opts::shared::DumpModules = true;
-
- if (opts::shared::DumpModules)
- opts::pdb2yaml::DbiStream = true;
-
- if (opts::RawSubcommand) {
- if (opts::raw::RawAll) {
- opts::raw::DumpHeaders = true;
- opts::raw::DumpGlobals = true;
- opts::raw::DumpPublics = true;
- opts::raw::DumpSectionHeaders = true;
- opts::raw::DumpStreamSummary = true;
- opts::raw::DumpPageStats = true;
- opts::raw::DumpStreamBlocks = true;
- opts::raw::DumpTpiRecords = true;
- opts::raw::DumpTpiHash = true;
- opts::raw::DumpIpiRecords = true;
- opts::raw::DumpSectionMap = true;
- opts::raw::DumpSectionContribs = true;
- opts::raw::DumpFpo = true;
- opts::raw::DumpStringTable = true;
- }
-
- if (opts::raw::CompactRecords &&
- (opts::raw::DumpTpiRecordBytes || opts::raw::DumpIpiRecordBytes)) {
- errs() << "-compact-records is incompatible with -tpi-record-bytes and "
- "-ipi-record-bytes.\n";
- exit(1);
- }
- }
- if (opts::PdbToYamlSubcommand) {
- if (opts::pdb2yaml::All) {
- opts::pdb2yaml::StreamMetadata = true;
- opts::pdb2yaml::StreamDirectory = true;
- opts::pdb2yaml::PdbStream = true;
- opts::pdb2yaml::StringTable = true;
- opts::pdb2yaml::DbiStream = true;
- opts::pdb2yaml::TpiStream = true;
- opts::pdb2yaml::IpiStream = true;
- }
- }
-
- llvm::sys::InitializeCOMRAII COM(llvm::sys::COMThreadingMode::MultiThreaded);
-
- if (opts::PdbToYamlSubcommand) {
- pdb2Yaml(opts::pdb2yaml::InputFilename.front());
- } else if (opts::YamlToPdbSubcommand) {
- if (opts::yaml2pdb::YamlPdbOutputFile.empty()) {
- SmallString<16> OutputFilename(opts::yaml2pdb::InputFilename.getValue());
- sys::path::replace_extension(OutputFilename, ".pdb");
- opts::yaml2pdb::YamlPdbOutputFile = OutputFilename.str();
- }
- yamlToPdb(opts::yaml2pdb::InputFilename);
- } else if (opts::AnalyzeSubcommand) {
- dumpAnalysis(opts::analyze::InputFilename.front());
- } else if (opts::PrettySubcommand) {
- if (opts::pretty::Lines)
- opts::pretty::Compilands = true;
-
- if (opts::pretty::All) {
- opts::pretty::Compilands = true;
- opts::pretty::Symbols = true;
- opts::pretty::Globals = true;
- opts::pretty::Types = true;
- opts::pretty::Externals = true;
- opts::pretty::Lines = true;
- }
-
- if (opts::pretty::Types) {
- opts::pretty::Classes = true;
- opts::pretty::Typedefs = true;
- opts::pretty::Enums = true;
- }
-
- // When adding filters for excluded compilands and types, we need to
- // remember that these are regexes. So special characters such as * and \
- // need to be escaped in the regex. In the case of a literal \, this means
- // it needs to be escaped again in the C++. So matching a single \ in the
- // input requires 4 \es in the C++.
- if (opts::pretty::ExcludeCompilerGenerated) {
- opts::pretty::ExcludeTypes.push_back("__vc_attributes");
- opts::pretty::ExcludeCompilands.push_back("\\* Linker \\*");
- }
- if (opts::pretty::ExcludeSystemLibraries) {
- opts::pretty::ExcludeCompilands.push_back(
- "f:\\\\binaries\\\\Intermediate\\\\vctools\\\\crt_bld");
- opts::pretty::ExcludeCompilands.push_back("f:\\\\dd\\\\vctools\\\\crt");
- opts::pretty::ExcludeCompilands.push_back(
- "d:\\\\th.obj.x86fre\\\\minkernel");
- }
- std::for_each(opts::pretty::InputFilenames.begin(),
- opts::pretty::InputFilenames.end(), dumpPretty);
- } else if (opts::RawSubcommand) {
- std::for_each(opts::raw::InputFilenames.begin(),
- opts::raw::InputFilenames.end(), dumpRaw);
- } else if (opts::DiffSubcommand) {
- if (opts::diff::InputFilenames.size() != 2) {
- errs() << "diff subcommand expects exactly 2 arguments.\n";
- exit(1);
- }
- diff(opts::diff::InputFilenames[0], opts::diff::InputFilenames[1]);
- } else if (opts::MergeSubcommand) {
- if (opts::merge::InputFilenames.size() < 2) {
- errs() << "merge subcommand requires at least 2 input files.\n";
- exit(1);
- }
- mergePdbs();
- }
-
- outs().flush();
- return 0;
-}
diff --git a/llvm/tools/llvm-pdbdump/llvm-pdbdump.h b/llvm/tools/llvm-pdbdump/llvm-pdbdump.h
deleted file mode 100644
index 2858ac35a9d..00000000000
--- a/llvm/tools/llvm-pdbdump/llvm-pdbdump.h
+++ /dev/null
@@ -1,156 +0,0 @@
-//===- llvm-pdbdump.h ----------------------------------------- *- C++ --*-===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef LLVM_TOOLS_LLVMPDBDUMP_LLVMPDBDUMP_H
-#define LLVM_TOOLS_LLVMPDBDUMP_LLVMPDBDUMP_H
-
-#include "llvm/ADT/Optional.h"
-#include "llvm/Support/CommandLine.h"
-#include "llvm/Support/raw_ostream.h"
-
-#include <memory>
-#include <stdint.h>
-
-namespace llvm {
-namespace pdb {
-class PDBSymbolData;
-class PDBSymbolFunc;
-uint32_t getTypeLength(const PDBSymbolData &Symbol);
-}
-}
-
-namespace opts {
-
-enum class ModuleSubsection {
- Unknown,
- Lines,
- FileChecksums,
- InlineeLines,
- CrossScopeImports,
- CrossScopeExports,
- StringTable,
- Symbols,
- FrameData,
- All
-};
-
-bool checkModuleSubsection(ModuleSubsection Kind);
-
-template <typename... Ts>
-bool checkModuleSubsection(ModuleSubsection K1, ModuleSubsection K2,
- Ts &&... Rest) {
- return checkModuleSubsection(K1) ||
- checkModuleSubsection(K2, std::forward<Ts>(Rest)...);
-}
-
-namespace pretty {
-
-enum class ClassDefinitionFormat { None, Layout, All };
-enum class ClassSortMode {
- None,
- Name,
- Size,
- Padding,
- PaddingPct,
- PaddingImmediate,
- PaddingPctImmediate
-};
-
-enum class SymbolSortMode { None, Name, Size };
-
-enum class SymLevel { Functions, Data, Thunks, All };
-
-bool shouldDumpSymLevel(SymLevel Level);
-bool compareFunctionSymbols(
- const std::unique_ptr<llvm::pdb::PDBSymbolFunc> &F1,
- const std::unique_ptr<llvm::pdb::PDBSymbolFunc> &F2);
-bool compareDataSymbols(const std::unique_ptr<llvm::pdb::PDBSymbolData> &F1,
- const std::unique_ptr<llvm::pdb::PDBSymbolData> &F2);
-
-extern llvm::cl::opt<bool> Compilands;
-extern llvm::cl::opt<bool> Symbols;
-extern llvm::cl::opt<bool> Globals;
-extern llvm::cl::opt<bool> Classes;
-extern llvm::cl::opt<bool> Enums;
-extern llvm::cl::opt<bool> Typedefs;
-extern llvm::cl::opt<bool> All;
-extern llvm::cl::opt<bool> ExcludeCompilerGenerated;
-
-extern llvm::cl::opt<bool> NoEnumDefs;
-extern llvm::cl::list<std::string> ExcludeTypes;
-extern llvm::cl::list<std::string> ExcludeSymbols;
-extern llvm::cl::list<std::string> ExcludeCompilands;
-extern llvm::cl::list<std::string> IncludeTypes;
-extern llvm::cl::list<std::string> IncludeSymbols;
-extern llvm::cl::list<std::string> IncludeCompilands;
-extern llvm::cl::opt<SymbolSortMode> SymbolOrder;
-extern llvm::cl::opt<ClassSortMode> ClassOrder;
-extern llvm::cl::opt<uint32_t> SizeThreshold;
-extern llvm::cl::opt<uint32_t> PaddingThreshold;
-extern llvm::cl::opt<uint32_t> ImmediatePaddingThreshold;
-extern llvm::cl::opt<ClassDefinitionFormat> ClassFormat;
-extern llvm::cl::opt<uint32_t> ClassRecursionDepth;
-}
-
-namespace raw {
-struct BlockRange {
- uint32_t Min;
- llvm::Optional<uint32_t> Max;
-};
-
-extern llvm::Optional<BlockRange> DumpBlockRange;
-extern llvm::cl::list<std::string> DumpStreamData;
-
-extern llvm::cl::opt<bool> CompactRecords;
-extern llvm::cl::opt<bool> DumpGlobals;
-extern llvm::cl::opt<bool> DumpHeaders;
-extern llvm::cl::opt<bool> DumpStreamBlocks;
-extern llvm::cl::opt<bool> DumpStreamSummary;
-extern llvm::cl::opt<bool> DumpPageStats;
-extern llvm::cl::opt<bool> DumpTpiHash;
-extern llvm::cl::opt<bool> DumpTpiRecordBytes;
-extern llvm::cl::opt<bool> DumpTpiRecords;
-extern llvm::cl::opt<bool> DumpIpiRecords;
-extern llvm::cl::opt<bool> DumpIpiRecordBytes;
-extern llvm::cl::opt<bool> DumpPublics;
-extern llvm::cl::opt<bool> DumpSectionContribs;
-extern llvm::cl::opt<bool> DumpSectionMap;
-extern llvm::cl::opt<bool> DumpSymRecordBytes;
-extern llvm::cl::opt<bool> DumpSectionHeaders;
-extern llvm::cl::opt<bool> DumpFpo;
-extern llvm::cl::opt<bool> DumpStringTable;
-}
-
-namespace diff {
-extern llvm::cl::opt<bool> Pedantic;
-}
-
-namespace pdb2yaml {
-extern llvm::cl::opt<bool> All;
-extern llvm::cl::opt<bool> NoFileHeaders;
-extern llvm::cl::opt<bool> Minimal;
-extern llvm::cl::opt<bool> StreamMetadata;
-extern llvm::cl::opt<bool> StreamDirectory;
-extern llvm::cl::opt<bool> StringTable;
-extern llvm::cl::opt<bool> PdbStream;
-extern llvm::cl::opt<bool> DbiStream;
-extern llvm::cl::opt<bool> TpiStream;
-extern llvm::cl::opt<bool> IpiStream;
-extern llvm::cl::list<std::string> InputFilename;
-}
-
-namespace shared {
-extern llvm::cl::opt<bool> DumpModules;
-extern llvm::cl::opt<bool> DumpModuleFiles;
-extern llvm::cl::list<ModuleSubsection> DumpModuleSubsections;
-extern llvm::cl::opt<bool> DumpModuleSyms;
-} // namespace shared
-}
-
-#endif
OpenPOWER on IntegriCloud