From 6035f1ffb5f81e33b1c29971d62ba8e65808a27c Mon Sep 17 00:00:00 2001 From: Zachary Turner Date: Thu, 17 Aug 2017 20:04:51 +0000 Subject: [PATCH] [llvm-pdbutil] Fix some dumping issues. When dumping, we were treating the S_INLINESITESYM as referring to a type record, when it actually refers to an id record. We had this correct in TypeIndexDiscovery, so our merging algorithm should be fine, but we had it wrong in the dumper, which means it would appear to work most of the time, unless the index was out of bounds in the type stream, when it would fail. Fixed this, and audited a few other cases to make them match the behavior in TypeIndexDiscovery. Also, I've now observed a new symbol record with kind 0x1168 which I have no clue what it is, so to avoid crashing we have to just print "Unknown Symbol Kind". git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@311117 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/DebugInfo/CodeView/LazyRandomTypeCollection.cpp | 4 +++- tools/llvm-pdbutil/MinimalSymbolDumper.cpp | 13 +++++++------ 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/lib/DebugInfo/CodeView/LazyRandomTypeCollection.cpp b/lib/DebugInfo/CodeView/LazyRandomTypeCollection.cpp index 6db921ed939..7133109ea84 100644 --- a/lib/DebugInfo/CodeView/LazyRandomTypeCollection.cpp +++ b/lib/DebugInfo/CodeView/LazyRandomTypeCollection.cpp @@ -83,7 +83,9 @@ uint32_t LazyRandomTypeCollection::getOffsetOfType(TypeIndex Index) { } CVType LazyRandomTypeCollection::getType(TypeIndex Index) { - error(ensureTypeExists(Index)); + uint32_t I = Index.getIndex(); + auto EC = ensureTypeExists(Index); + error(std::move(EC)); assert(contains(Index)); return Records[Index.toArrayIndex()].Type; diff --git a/tools/llvm-pdbutil/MinimalSymbolDumper.cpp b/tools/llvm-pdbutil/MinimalSymbolDumper.cpp index a6816bde0ea..ce813bf8366 100644 --- a/tools/llvm-pdbutil/MinimalSymbolDumper.cpp +++ b/tools/llvm-pdbutil/MinimalSymbolDumper.cpp @@ -24,15 +24,16 @@ using namespace llvm; using namespace llvm::codeview; using namespace llvm::pdb; -static StringRef getSymbolKindName(SymbolKind K) { +static std::string getSymbolKindName(SymbolKind K) { switch (K) { #define SYMBOL_RECORD(EnumName, value, name) \ case EnumName: \ return #EnumName; #define CV_SYMBOL(EnumName, value) SYMBOL_RECORD(EnumName, value, EnumName) #include "llvm/DebugInfo/CodeView/CodeViewSymbols.def" - default: - llvm_unreachable("Unknown symbol kind!"); + default: { + return formatv("Unknown Symbol Kind [{0:X}]", uint32_t(K)).str(); + } } return ""; } @@ -674,7 +675,7 @@ Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, FrameProcSym &FP) { Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, HeapAllocationSiteSym &HAS) { AutoIndent Indent(P, 7); - P.formatLine("type = {0}, addr = {1} call size = {2}", typeIndex(HAS.Type), + P.formatLine("type = {0}, addr = {1} call size = {2}", idIndex(HAS.Type), formatSegmentOffset(HAS.Segment, HAS.CodeOffset), HAS.CallInstructionSize); return Error::success(); @@ -686,7 +687,7 @@ Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, InlineSiteSym &IS) { StringRef Annotations(reinterpret_cast(Bytes.begin()), Bytes.size()); - P.formatLine("inlinee = {0}, parent = {1}, end = {2}", typeIndex(IS.Inlinee), + P.formatLine("inlinee = {0}, parent = {1}, end = {2}", idIndex(IS.Inlinee), IS.Parent, IS.End); P.formatLine("annotations = {0}", toHex(Annotations)); return Error::success(); @@ -776,7 +777,7 @@ Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, CallerSym &Caller) { AutoIndent Indent(P, 7); for (const auto &I : Caller.Indices) { - P.formatLine("callee: {0}", typeIndex(I)); + P.formatLine("callee: {0}", idIndex(I)); } return Error::success(); } -- 2.50.1