[llvm] r271939 - [llvm-pdbdump] Dump MSF headers to YAML.

Zachary Turner via llvm-commits llvm-commits at lists.llvm.org
Mon Jun 6 13:37:06 PDT 2016


Author: zturner
Date: Mon Jun  6 15:37:05 2016
New Revision: 271939

URL: http://llvm.org/viewvc/llvm-project?rev=271939&view=rev
Log:
[llvm-pdbdump] Dump MSF headers to YAML.

This is the simplest possible patch to get some kind of YAML
output.  All it dumps is the MSF header fields so that in
theory an empty MSF file could be reconstructed.

Reviewed By: ruiu, majnemer
Differential Revision: http://reviews.llvm.org/D20971

Added:
    llvm/trunk/test/DebugInfo/PDB/pdbdump-yaml.test
    llvm/trunk/tools/llvm-pdbdump/PdbYaml.cpp
    llvm/trunk/tools/llvm-pdbdump/PdbYaml.h
    llvm/trunk/tools/llvm-pdbdump/YAMLOutputStyle.cpp
    llvm/trunk/tools/llvm-pdbdump/YAMLOutputStyle.h
      - copied, changed from r271936, llvm/trunk/tools/llvm-pdbdump/LLVMOutputStyle.h
Modified:
    llvm/trunk/tools/llvm-pdbdump/CMakeLists.txt
    llvm/trunk/tools/llvm-pdbdump/LLVMOutputStyle.cpp
    llvm/trunk/tools/llvm-pdbdump/LLVMOutputStyle.h
    llvm/trunk/tools/llvm-pdbdump/OutputStyle.h
    llvm/trunk/tools/llvm-pdbdump/llvm-pdbdump.cpp

Added: llvm/trunk/test/DebugInfo/PDB/pdbdump-yaml.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/PDB/pdbdump-yaml.test?rev=271939&view=auto
==============================================================================
--- llvm/trunk/test/DebugInfo/PDB/pdbdump-yaml.test (added)
+++ llvm/trunk/test/DebugInfo/PDB/pdbdump-yaml.test Mon Jun  6 15:37:05 2016
@@ -0,0 +1,17 @@
+; RUN: llvm-pdbdump -raw-headers -raw-output-style=YAML %p/Inputs/empty.pdb \
+; RUN:               | FileCheck -check-prefix=YAML %s
+
+; YAML:      ---
+; YAML-NEXT: MSF:
+; YAML-NEXT:   BlockSize:       4096
+; YAML-NEXT:   Unknown0:        2
+; YAML-NEXT:   NumBlocks:       25
+; YAML-NEXT:   NumDirectoryBytes: 136
+; YAML-NEXT:   Unknown1:        0
+; YAML-NEXT:   BlockMapAddr:    24
+; YAML-NEXT:   NumDirectoryBlocks: 1
+; YAML-NEXT:   BlockMapOffset:  98304
+; YAML-NEXT:   DirectoryBlocks:
+; YAML-NEXT:     - 23
+; YAML-NEXT:   NumStreams:      17
+; YAML-NEXT: ...

Modified: llvm/trunk/tools/llvm-pdbdump/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-pdbdump/CMakeLists.txt?rev=271939&r1=271938&r2=271939&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-pdbdump/CMakeLists.txt (original)
+++ llvm/trunk/tools/llvm-pdbdump/CMakeLists.txt Mon Jun  6 15:37:05 2016
@@ -15,9 +15,11 @@ add_llvm_tool(llvm-pdbdump
   FunctionDumper.cpp
   LinePrinter.cpp
   LLVMOutputStyle.cpp
+  PdbYaml.cpp
   TypeDumper.cpp
   TypedefDumper.cpp
   VariableDumper.cpp
+  YAMLOutputStyle.cpp
   )
 
 if(LLVM_USE_SANITIZE_COVERAGE)

Modified: llvm/trunk/tools/llvm-pdbdump/LLVMOutputStyle.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-pdbdump/LLVMOutputStyle.cpp?rev=271939&r1=271938&r2=271939&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-pdbdump/LLVMOutputStyle.cpp (original)
+++ llvm/trunk/tools/llvm-pdbdump/LLVMOutputStyle.cpp Mon Jun  6 15:37:05 2016
@@ -694,3 +694,4 @@ Error LLVMOutputStyle::dumpFpoStream() {
   }
   return Error::success();
 }
+void LLVMOutputStyle::flush() { P.flush(); }

Modified: llvm/trunk/tools/llvm-pdbdump/LLVMOutputStyle.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-pdbdump/LLVMOutputStyle.h?rev=271939&r1=271938&r2=271939&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-pdbdump/LLVMOutputStyle.h (original)
+++ llvm/trunk/tools/llvm-pdbdump/LLVMOutputStyle.h Mon Jun  6 15:37:05 2016
@@ -35,6 +35,8 @@ public:
   Error dumpSectionHeaders() override;
   Error dumpFpoStream() override;
 
+  void flush() override;
+
 private:
   PDBFile &File;
   ScopedPrinter P;

Modified: llvm/trunk/tools/llvm-pdbdump/OutputStyle.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-pdbdump/OutputStyle.h?rev=271939&r1=271938&r2=271939&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-pdbdump/OutputStyle.h (original)
+++ llvm/trunk/tools/llvm-pdbdump/OutputStyle.h Mon Jun  6 15:37:05 2016
@@ -32,6 +32,8 @@ public:
   virtual Error dumpPublicsStream() = 0;
   virtual Error dumpSectionHeaders() = 0;
   virtual Error dumpFpoStream() = 0;
+
+  virtual void flush() = 0;
 };
 }
 }

Added: llvm/trunk/tools/llvm-pdbdump/PdbYaml.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-pdbdump/PdbYaml.cpp?rev=271939&view=auto
==============================================================================
--- llvm/trunk/tools/llvm-pdbdump/PdbYaml.cpp (added)
+++ llvm/trunk/tools/llvm-pdbdump/PdbYaml.cpp Mon Jun  6 15:37:05 2016
@@ -0,0 +1,35 @@
+//===- 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/DebugInfo/PDB/Raw/PDBFile.h"
+
+using namespace llvm;
+using namespace llvm::pdb;
+using namespace llvm::pdb::yaml;
+
+void llvm::yaml::MappingTraits<MsfHeaders>::mapping(
+    IO &IO, pdb::yaml::MsfHeaders &Obj) {
+  IO.mapRequired("BlockSize", Obj.BlockSize);
+  IO.mapRequired("Unknown0", Obj.Unknown0);
+  IO.mapRequired("NumBlocks", Obj.BlockCount);
+  IO.mapRequired("NumDirectoryBytes", Obj.NumDirectoryBytes);
+  IO.mapRequired("Unknown1", Obj.Unknown1);
+  IO.mapRequired("BlockMapAddr", Obj.BlockMapIndex);
+  IO.mapRequired("NumDirectoryBlocks", Obj.NumDirectoryBlocks);
+  IO.mapRequired("BlockMapOffset", Obj.BlockMapOffset);
+  IO.mapRequired("DirectoryBlocks", Obj.DirectoryBlocks);
+  IO.mapRequired("NumStreams", Obj.NumStreams);
+}
+
+void llvm::yaml::MappingTraits<pdb::yaml::PdbObject>::mapping(
+    IO &IO, pdb::yaml::PdbObject &Obj) {
+  IO.mapOptional("MSF", Obj.Headers);
+}

Added: llvm/trunk/tools/llvm-pdbdump/PdbYaml.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-pdbdump/PdbYaml.h?rev=271939&view=auto
==============================================================================
--- llvm/trunk/tools/llvm-pdbdump/PdbYaml.h (added)
+++ llvm/trunk/tools/llvm-pdbdump/PdbYaml.h Mon Jun  6 15:37:05 2016
@@ -0,0 +1,57 @@
+//===- 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/Support/Endian.h"
+#include "llvm/Support/YAMLTraits.h"
+
+#include <vector>
+
+namespace llvm {
+namespace pdb {
+class PDBFile;
+
+namespace yaml {
+struct MsfHeaders {
+  uint32_t BlockSize;
+  uint32_t Unknown0;
+  uint32_t BlockCount;
+  uint32_t NumDirectoryBytes;
+  uint32_t Unknown1;
+  uint32_t BlockMapIndex;
+  uint32_t NumDirectoryBlocks;
+  uint32_t BlockMapOffset;
+  std::vector<uint32_t> DirectoryBlocks;
+  uint32_t NumStreams;
+};
+
+struct PdbObject {
+  Optional<MsfHeaders> Headers;
+};
+}
+}
+
+namespace yaml {
+template <> struct MappingTraits<pdb::yaml::MsfHeaders> {
+  static void mapping(IO &IO, pdb::yaml::MsfHeaders &Obj);
+};
+template <> struct MappingTraits<pdb::yaml::PdbObject> {
+  static void mapping(IO &IO, pdb::yaml::PdbObject &Obj);
+};
+}
+}
+
+LLVM_YAML_IS_SEQUENCE_VECTOR(uint32_t)
+
+#endif // LLVM_TOOLS_LLVMPDBDUMP_PDBYAML_H

Added: llvm/trunk/tools/llvm-pdbdump/YAMLOutputStyle.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-pdbdump/YAMLOutputStyle.cpp?rev=271939&view=auto
==============================================================================
--- llvm/trunk/tools/llvm-pdbdump/YAMLOutputStyle.cpp (added)
+++ llvm/trunk/tools/llvm-pdbdump/YAMLOutputStyle.cpp Mon Jun  6 15:37:05 2016
@@ -0,0 +1,126 @@
+//===- 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/PDB/Raw/PDBFile.h"
+
+using namespace llvm;
+using namespace llvm::pdb;
+
+YAMLOutputStyle::YAMLOutputStyle(PDBFile &File) : File(File), Out(outs()) {}
+
+Error YAMLOutputStyle::dumpFileHeaders() {
+  if (!opts::DumpHeaders)
+    return Error::success();
+
+  yaml::MsfHeaders Headers;
+  Headers.BlockCount = File.getBlockCount();
+  Headers.BlockMapIndex = File.getBlockMapIndex();
+  Headers.BlockMapOffset = File.getBlockMapOffset();
+  Headers.BlockSize = File.getBlockSize();
+  auto Blocks = File.getDirectoryBlockArray();
+  Headers.DirectoryBlocks.assign(Blocks.begin(), Blocks.end());
+  Headers.NumDirectoryBlocks = File.getNumDirectoryBlocks();
+  Headers.NumDirectoryBytes = File.getNumDirectoryBytes();
+  Headers.NumStreams = File.getNumStreams();
+  Headers.Unknown0 = File.getUnknown0();
+  Headers.Unknown1 = File.getUnknown1();
+
+  Obj.Headers.emplace(Headers);
+
+  return Error::success();
+}
+
+Error YAMLOutputStyle::dumpStreamSummary() {
+  if (!opts::DumpStreamSummary)
+    return Error::success();
+
+  return Error::success();
+}
+
+Error YAMLOutputStyle::dumpStreamBlocks() {
+  if (!opts::DumpStreamBlocks)
+    return Error::success();
+
+  return Error::success();
+}
+
+Error YAMLOutputStyle::dumpStreamData() {
+  uint32_t StreamCount = File.getNumStreams();
+  StringRef DumpStreamStr = opts::DumpStreamDataIdx;
+  uint32_t DumpStreamNum;
+  if (DumpStreamStr.getAsInteger(/*Radix=*/0U, DumpStreamNum) ||
+      DumpStreamNum >= StreamCount)
+    return Error::success();
+
+  return Error::success();
+}
+
+Error YAMLOutputStyle::dumpInfoStream() {
+  if (!opts::DumpHeaders)
+    return Error::success();
+  return Error::success();
+}
+
+Error YAMLOutputStyle::dumpNamedStream() {
+  if (opts::DumpStreamDataName.empty())
+    return Error::success();
+
+  return Error::success();
+}
+
+Error YAMLOutputStyle::dumpTpiStream(uint32_t StreamIdx) {
+  return Error::success();
+}
+
+Error YAMLOutputStyle::dumpDbiStream() { return Error::success(); }
+
+Error YAMLOutputStyle::dumpSectionContribs() {
+  if (!opts::DumpSectionContribs)
+    return Error::success();
+
+  return Error::success();
+}
+
+Error YAMLOutputStyle::dumpSectionMap() {
+  if (!opts::DumpSectionMap)
+    return Error::success();
+
+  return Error::success();
+}
+
+Error YAMLOutputStyle::dumpPublicsStream() {
+  if (!opts::DumpPublics)
+    return Error::success();
+
+  return Error::success();
+}
+
+Error YAMLOutputStyle::dumpSectionHeaders() {
+  if (!opts::DumpSectionHeaders)
+    return Error::success();
+
+  return Error::success();
+}
+
+Error YAMLOutputStyle::dumpFpoStream() {
+  if (!opts::DumpFpo)
+    return Error::success();
+
+  return Error::success();
+}
+
+void YAMLOutputStyle::flush() {
+  Out << Obj;
+  outs().flush();
+}

Copied: llvm/trunk/tools/llvm-pdbdump/YAMLOutputStyle.h (from r271936, llvm/trunk/tools/llvm-pdbdump/LLVMOutputStyle.h)
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-pdbdump/YAMLOutputStyle.h?p2=llvm/trunk/tools/llvm-pdbdump/YAMLOutputStyle.h&p1=llvm/trunk/tools/llvm-pdbdump/LLVMOutputStyle.h&r1=271936&r2=271939&rev=271939&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-pdbdump/LLVMOutputStyle.h (original)
+++ llvm/trunk/tools/llvm-pdbdump/YAMLOutputStyle.h Mon Jun  6 15:37:05 2016
@@ -1,4 +1,4 @@
-//===- LLVMOutputStyle.h -------------------------------------- *- C++ --*-===//
+//===- YAMLOutputStyle.h -------------------------------------- *- C++ --*-===//
 //
 //                     The LLVM Compiler Infrastructure
 //
@@ -7,19 +7,21 @@
 //
 //===----------------------------------------------------------------------===//
 
-#ifndef LLVM_TOOLS_LLVMPDBDUMP_LLVMOUTPUTSTYLE_H
-#define LLVM_TOOLS_LLVMPDBDUMP_LLVMOUTPUTSTYLE_H
+#ifndef LLVM_TOOLS_LLVMPDBDUMP_YAMLOUTPUTSTYLE_H
+#define LLVM_TOOLS_LLVMPDBDUMP_YAMLOUTPUTSTYLE_H
 
 #include "OutputStyle.h"
+#include "PdbYaml.h"
 
 #include "llvm/DebugInfo/CodeView/TypeDumper.h"
 #include "llvm/Support/ScopedPrinter.h"
+#include "llvm/Support/YAMLTraits.h"
 
 namespace llvm {
 namespace pdb {
-class LLVMOutputStyle : public OutputStyle {
+class YAMLOutputStyle : public OutputStyle {
 public:
-  LLVMOutputStyle(PDBFile &File);
+  YAMLOutputStyle(PDBFile &File);
 
   Error dumpFileHeaders() override;
   Error dumpStreamSummary() override;
@@ -35,12 +37,15 @@ public:
   Error dumpSectionHeaders() override;
   Error dumpFpoStream() override;
 
+  void flush() override;
+
 private:
   PDBFile &File;
-  ScopedPrinter P;
-  codeview::CVTypeDumper TD;
+  llvm::yaml::Output Out;
+
+  yaml::PdbObject Obj;
 };
-}
-}
+} // namespace pdb
+} // namespace llvm
 
-#endif
+#endif // LLVM_TOOLS_LLVMPDBDUMP_YAMLOUTPUTSTYLE_H

Modified: llvm/trunk/tools/llvm-pdbdump/llvm-pdbdump.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-pdbdump/llvm-pdbdump.cpp?rev=271939&r1=271938&r2=271939&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-pdbdump/llvm-pdbdump.cpp (original)
+++ llvm/trunk/tools/llvm-pdbdump/llvm-pdbdump.cpp Mon Jun  6 15:37:05 2016
@@ -22,6 +22,7 @@
 #include "OutputStyle.h"
 #include "TypeDumper.h"
 #include "VariableDumper.h"
+#include "YAMLOutputStyle.h"
 
 #include "llvm/ADT/ArrayRef.h"
 #include "llvm/ADT/BitVector.h"
@@ -211,6 +212,8 @@ static Error dumpStructure(RawSession &R
   std::unique_ptr<OutputStyle> O;
   if (opts::RawOutputStyle == opts::OutputStyleTy::LLVM)
     O = llvm::make_unique<LLVMOutputStyle>(File);
+  else if (opts::RawOutputStyle == opts::OutputStyleTy::YAML)
+    O = llvm::make_unique<YAMLOutputStyle>(File);
   else
     return make_error<RawError>(raw_error_code::feature_unsupported,
                                 "Requested output style unsupported");
@@ -256,6 +259,7 @@ static Error dumpStructure(RawSession &R
 
   if (auto EC = O->dumpFpoStream())
     return EC;
+  O->flush();
   return Error::success();
 }
 




More information about the llvm-commits mailing list