blob: d4a3582f26191976b1dcd1cb1bb52b2d19339fbc [file] [log] [blame]
Zachary Turner7120a472016-06-06 20:37:05 +00001//===- YAMLOutputStyle.cpp ------------------------------------ *- C++ --*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "YAMLOutputStyle.h"
11
12#include "PdbYaml.h"
13#include "llvm-pdbdump.h"
14
15#include "llvm/DebugInfo/PDB/Raw/PDBFile.h"
Zachary Turnerab58ae82016-06-30 17:43:00 +000016#include "llvm/DebugInfo/PDB/Raw/RawConstants.h"
Zachary Turner7120a472016-06-06 20:37:05 +000017
18using namespace llvm;
19using namespace llvm::pdb;
20
21YAMLOutputStyle::YAMLOutputStyle(PDBFile &File) : File(File), Out(outs()) {}
22
Zachary Turnera30bd1a2016-06-30 17:42:48 +000023Error YAMLOutputStyle::dump() {
24 if (auto EC = dumpFileHeaders())
25 return EC;
Zachary Turner7120a472016-06-06 20:37:05 +000026
Zachary Turnera30bd1a2016-06-30 17:42:48 +000027 if (auto EC = dumpStreamMetadata())
28 return EC;
29
30 if (auto EC = dumpStreamDirectory())
31 return EC;
32
33 flush();
34 return Error::success();
35}
36
37Error YAMLOutputStyle::dumpFileHeaders() {
Zachary Turner7120a472016-06-06 20:37:05 +000038 yaml::MsfHeaders Headers;
Zachary Turner1dc9fd32016-06-14 20:48:36 +000039 Obj.Headers.SuperBlock.NumBlocks = File.getBlockCount();
40 Obj.Headers.SuperBlock.BlockMapAddr = File.getBlockMapIndex();
41 Obj.Headers.BlockMapOffset = File.getBlockMapOffset();
42 Obj.Headers.SuperBlock.BlockSize = File.getBlockSize();
Zachary Turner7120a472016-06-06 20:37:05 +000043 auto Blocks = File.getDirectoryBlockArray();
Zachary Turner1dc9fd32016-06-14 20:48:36 +000044 Obj.Headers.DirectoryBlocks.assign(Blocks.begin(), Blocks.end());
45 Obj.Headers.NumDirectoryBlocks = File.getNumDirectoryBlocks();
46 Obj.Headers.SuperBlock.NumDirectoryBytes = File.getNumDirectoryBytes();
Zachary Turnerab58ae82016-06-30 17:43:00 +000047 Obj.Headers.NumStreams =
48 opts::pdb2yaml::StreamMetadata ? File.getNumStreams() : 0;
Zachary Turner1dc9fd32016-06-14 20:48:36 +000049 Obj.Headers.SuperBlock.Unknown0 = File.getUnknown0();
50 Obj.Headers.SuperBlock.Unknown1 = File.getUnknown1();
51 Obj.Headers.FileSize = File.getFileSize();
Zachary Turner7120a472016-06-06 20:37:05 +000052
53 return Error::success();
54}
55
Zachary Turnera30bd1a2016-06-30 17:42:48 +000056Error YAMLOutputStyle::dumpStreamMetadata() {
57 if (!opts::pdb2yaml::StreamMetadata)
Zachary Turner7120a472016-06-06 20:37:05 +000058 return Error::success();
59
Zachary Turner1dc9fd32016-06-14 20:48:36 +000060 Obj.StreamSizes = File.getStreamSizes();
Zachary Turner7120a472016-06-06 20:37:05 +000061 return Error::success();
62}
63
Zachary Turnera30bd1a2016-06-30 17:42:48 +000064Error YAMLOutputStyle::dumpStreamDirectory() {
65 if (!opts::pdb2yaml::StreamDirectory)
Zachary Turner7120a472016-06-06 20:37:05 +000066 return Error::success();
67
Zachary Turner1dc9fd32016-06-14 20:48:36 +000068 auto StreamMap = File.getStreamMap();
69 Obj.StreamMap.emplace();
70 for (auto &Stream : StreamMap) {
71 pdb::yaml::StreamBlockList BlockList;
72 BlockList.Blocks = Stream;
73 Obj.StreamMap->push_back(BlockList);
Zachary Turner25e8b052016-06-06 20:37:17 +000074 }
Zachary Turner25e8b052016-06-06 20:37:17 +000075
Zachary Turner7120a472016-06-06 20:37:05 +000076 return Error::success();
77}
78
Zachary Turner7120a472016-06-06 20:37:05 +000079void YAMLOutputStyle::flush() {
80 Out << Obj;
81 outs().flush();
82}