]> granicus.if.org Git - llvm/commitdiff
[llvm-pdbutil] Fix some dumping issues.
authorZachary Turner <zturner@google.com>
Thu, 17 Aug 2017 20:04:51 +0000 (20:04 +0000)
committerZachary Turner <zturner@google.com>
Thu, 17 Aug 2017 20:04:51 +0000 (20:04 +0000)
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
tools/llvm-pdbutil/MinimalSymbolDumper.cpp

index 6db921ed93958be8be6f2525de5fdc25d66a7f13..7133109ea842a1542ab8edf6e3b6de4c425e4c03 100644 (file)
@@ -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;
index a6816bde0ea7506f8c1f9d64d7a6165765380394..ce813bf83662d87bc56cad6782d1ada32b47ed49 100644 (file)
@@ -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<const char *>(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();
 }