1*9880d681SAndroid Build Coastguard Worker //===- YAMLOutputStyle.cpp ------------------------------------ *- C++ --*-===// 2*9880d681SAndroid Build Coastguard Worker // 3*9880d681SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure 4*9880d681SAndroid Build Coastguard Worker // 5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source 6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details. 7*9880d681SAndroid Build Coastguard Worker // 8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 9*9880d681SAndroid Build Coastguard Worker 10*9880d681SAndroid Build Coastguard Worker #include "YAMLOutputStyle.h" 11*9880d681SAndroid Build Coastguard Worker 12*9880d681SAndroid Build Coastguard Worker #include "PdbYaml.h" 13*9880d681SAndroid Build Coastguard Worker #include "llvm-pdbdump.h" 14*9880d681SAndroid Build Coastguard Worker 15*9880d681SAndroid Build Coastguard Worker #include "llvm/DebugInfo/PDB/Raw/DbiStream.h" 16*9880d681SAndroid Build Coastguard Worker #include "llvm/DebugInfo/PDB/Raw/InfoStream.h" 17*9880d681SAndroid Build Coastguard Worker #include "llvm/DebugInfo/PDB/Raw/PDBFile.h" 18*9880d681SAndroid Build Coastguard Worker #include "llvm/DebugInfo/PDB/Raw/RawConstants.h" 19*9880d681SAndroid Build Coastguard Worker 20*9880d681SAndroid Build Coastguard Worker using namespace llvm; 21*9880d681SAndroid Build Coastguard Worker using namespace llvm::pdb; 22*9880d681SAndroid Build Coastguard Worker YAMLOutputStyle(PDBFile & File)23*9880d681SAndroid Build Coastguard WorkerYAMLOutputStyle::YAMLOutputStyle(PDBFile &File) : File(File), Out(outs()) {} 24*9880d681SAndroid Build Coastguard Worker dump()25*9880d681SAndroid Build Coastguard WorkerError YAMLOutputStyle::dump() { 26*9880d681SAndroid Build Coastguard Worker if (opts::pdb2yaml::StreamDirectory || opts::pdb2yaml::PdbStream || 27*9880d681SAndroid Build Coastguard Worker opts::pdb2yaml::DbiStream) 28*9880d681SAndroid Build Coastguard Worker opts::pdb2yaml::StreamMetadata = true; 29*9880d681SAndroid Build Coastguard Worker 30*9880d681SAndroid Build Coastguard Worker if (auto EC = dumpFileHeaders()) 31*9880d681SAndroid Build Coastguard Worker return EC; 32*9880d681SAndroid Build Coastguard Worker 33*9880d681SAndroid Build Coastguard Worker if (auto EC = dumpStreamMetadata()) 34*9880d681SAndroid Build Coastguard Worker return EC; 35*9880d681SAndroid Build Coastguard Worker 36*9880d681SAndroid Build Coastguard Worker if (auto EC = dumpStreamDirectory()) 37*9880d681SAndroid Build Coastguard Worker return EC; 38*9880d681SAndroid Build Coastguard Worker 39*9880d681SAndroid Build Coastguard Worker if (auto EC = dumpPDBStream()) 40*9880d681SAndroid Build Coastguard Worker return EC; 41*9880d681SAndroid Build Coastguard Worker 42*9880d681SAndroid Build Coastguard Worker if (auto EC = dumpDbiStream()) 43*9880d681SAndroid Build Coastguard Worker return EC; 44*9880d681SAndroid Build Coastguard Worker 45*9880d681SAndroid Build Coastguard Worker flush(); 46*9880d681SAndroid Build Coastguard Worker return Error::success(); 47*9880d681SAndroid Build Coastguard Worker } 48*9880d681SAndroid Build Coastguard Worker dumpFileHeaders()49*9880d681SAndroid Build Coastguard WorkerError YAMLOutputStyle::dumpFileHeaders() { 50*9880d681SAndroid Build Coastguard Worker if (opts::pdb2yaml::NoFileHeaders) 51*9880d681SAndroid Build Coastguard Worker return Error::success(); 52*9880d681SAndroid Build Coastguard Worker 53*9880d681SAndroid Build Coastguard Worker yaml::MsfHeaders Headers; 54*9880d681SAndroid Build Coastguard Worker Obj.Headers.emplace(); 55*9880d681SAndroid Build Coastguard Worker Obj.Headers->SuperBlock.NumBlocks = File.getBlockCount(); 56*9880d681SAndroid Build Coastguard Worker Obj.Headers->SuperBlock.BlockMapAddr = File.getBlockMapIndex(); 57*9880d681SAndroid Build Coastguard Worker Obj.Headers->BlockMapOffset = File.getBlockMapOffset(); 58*9880d681SAndroid Build Coastguard Worker Obj.Headers->SuperBlock.BlockSize = File.getBlockSize(); 59*9880d681SAndroid Build Coastguard Worker auto Blocks = File.getDirectoryBlockArray(); 60*9880d681SAndroid Build Coastguard Worker Obj.Headers->DirectoryBlocks.assign(Blocks.begin(), Blocks.end()); 61*9880d681SAndroid Build Coastguard Worker Obj.Headers->NumDirectoryBlocks = File.getNumDirectoryBlocks(); 62*9880d681SAndroid Build Coastguard Worker Obj.Headers->SuperBlock.NumDirectoryBytes = File.getNumDirectoryBytes(); 63*9880d681SAndroid Build Coastguard Worker Obj.Headers->NumStreams = 64*9880d681SAndroid Build Coastguard Worker opts::pdb2yaml::StreamMetadata ? File.getNumStreams() : 0; 65*9880d681SAndroid Build Coastguard Worker Obj.Headers->SuperBlock.Unknown0 = File.getUnknown0(); 66*9880d681SAndroid Build Coastguard Worker Obj.Headers->SuperBlock.Unknown1 = File.getUnknown1(); 67*9880d681SAndroid Build Coastguard Worker Obj.Headers->FileSize = File.getFileSize(); 68*9880d681SAndroid Build Coastguard Worker 69*9880d681SAndroid Build Coastguard Worker return Error::success(); 70*9880d681SAndroid Build Coastguard Worker } 71*9880d681SAndroid Build Coastguard Worker dumpStreamMetadata()72*9880d681SAndroid Build Coastguard WorkerError YAMLOutputStyle::dumpStreamMetadata() { 73*9880d681SAndroid Build Coastguard Worker if (!opts::pdb2yaml::StreamMetadata) 74*9880d681SAndroid Build Coastguard Worker return Error::success(); 75*9880d681SAndroid Build Coastguard Worker 76*9880d681SAndroid Build Coastguard Worker Obj.StreamSizes = File.getStreamSizes(); 77*9880d681SAndroid Build Coastguard Worker return Error::success(); 78*9880d681SAndroid Build Coastguard Worker } 79*9880d681SAndroid Build Coastguard Worker dumpStreamDirectory()80*9880d681SAndroid Build Coastguard WorkerError YAMLOutputStyle::dumpStreamDirectory() { 81*9880d681SAndroid Build Coastguard Worker if (!opts::pdb2yaml::StreamDirectory) 82*9880d681SAndroid Build Coastguard Worker return Error::success(); 83*9880d681SAndroid Build Coastguard Worker 84*9880d681SAndroid Build Coastguard Worker auto StreamMap = File.getStreamMap(); 85*9880d681SAndroid Build Coastguard Worker Obj.StreamMap.emplace(); 86*9880d681SAndroid Build Coastguard Worker for (auto &Stream : StreamMap) { 87*9880d681SAndroid Build Coastguard Worker pdb::yaml::StreamBlockList BlockList; 88*9880d681SAndroid Build Coastguard Worker BlockList.Blocks = Stream; 89*9880d681SAndroid Build Coastguard Worker Obj.StreamMap->push_back(BlockList); 90*9880d681SAndroid Build Coastguard Worker } 91*9880d681SAndroid Build Coastguard Worker 92*9880d681SAndroid Build Coastguard Worker return Error::success(); 93*9880d681SAndroid Build Coastguard Worker } 94*9880d681SAndroid Build Coastguard Worker dumpPDBStream()95*9880d681SAndroid Build Coastguard WorkerError YAMLOutputStyle::dumpPDBStream() { 96*9880d681SAndroid Build Coastguard Worker if (!opts::pdb2yaml::PdbStream) 97*9880d681SAndroid Build Coastguard Worker return Error::success(); 98*9880d681SAndroid Build Coastguard Worker 99*9880d681SAndroid Build Coastguard Worker auto IS = File.getPDBInfoStream(); 100*9880d681SAndroid Build Coastguard Worker if (!IS) 101*9880d681SAndroid Build Coastguard Worker return IS.takeError(); 102*9880d681SAndroid Build Coastguard Worker 103*9880d681SAndroid Build Coastguard Worker auto &InfoS = IS.get(); 104*9880d681SAndroid Build Coastguard Worker Obj.PdbStream.emplace(); 105*9880d681SAndroid Build Coastguard Worker Obj.PdbStream->Age = InfoS.getAge(); 106*9880d681SAndroid Build Coastguard Worker Obj.PdbStream->Guid = InfoS.getGuid(); 107*9880d681SAndroid Build Coastguard Worker Obj.PdbStream->Signature = InfoS.getSignature(); 108*9880d681SAndroid Build Coastguard Worker Obj.PdbStream->Version = InfoS.getVersion(); 109*9880d681SAndroid Build Coastguard Worker 110*9880d681SAndroid Build Coastguard Worker return Error::success(); 111*9880d681SAndroid Build Coastguard Worker } 112*9880d681SAndroid Build Coastguard Worker dumpDbiStream()113*9880d681SAndroid Build Coastguard WorkerError YAMLOutputStyle::dumpDbiStream() { 114*9880d681SAndroid Build Coastguard Worker if (!opts::pdb2yaml::DbiStream) 115*9880d681SAndroid Build Coastguard Worker return Error::success(); 116*9880d681SAndroid Build Coastguard Worker 117*9880d681SAndroid Build Coastguard Worker auto DbiS = File.getPDBDbiStream(); 118*9880d681SAndroid Build Coastguard Worker if (!DbiS) 119*9880d681SAndroid Build Coastguard Worker return DbiS.takeError(); 120*9880d681SAndroid Build Coastguard Worker 121*9880d681SAndroid Build Coastguard Worker auto &DS = DbiS.get(); 122*9880d681SAndroid Build Coastguard Worker Obj.DbiStream.emplace(); 123*9880d681SAndroid Build Coastguard Worker Obj.DbiStream->Age = DS.getAge(); 124*9880d681SAndroid Build Coastguard Worker Obj.DbiStream->BuildNumber = DS.getBuildNumber(); 125*9880d681SAndroid Build Coastguard Worker Obj.DbiStream->Flags = DS.getFlags(); 126*9880d681SAndroid Build Coastguard Worker Obj.DbiStream->MachineType = DS.getMachineType(); 127*9880d681SAndroid Build Coastguard Worker Obj.DbiStream->PdbDllRbld = DS.getPdbDllRbld(); 128*9880d681SAndroid Build Coastguard Worker Obj.DbiStream->PdbDllVersion = DS.getPdbDllVersion(); 129*9880d681SAndroid Build Coastguard Worker Obj.DbiStream->VerHeader = DS.getDbiVersion(); 130*9880d681SAndroid Build Coastguard Worker return Error::success(); 131*9880d681SAndroid Build Coastguard Worker } 132*9880d681SAndroid Build Coastguard Worker flush()133*9880d681SAndroid Build Coastguard Workervoid YAMLOutputStyle::flush() { 134*9880d681SAndroid Build Coastguard Worker Out << Obj; 135*9880d681SAndroid Build Coastguard Worker outs().flush(); 136*9880d681SAndroid Build Coastguard Worker } 137