diff options
Diffstat (limited to 'llvm/tools')
-rw-r--r-- | llvm/tools/llvm-pdbdump/LLVMOutputStyle.cpp | 1 | ||||
-rw-r--r-- | llvm/tools/llvm-pdbdump/PdbYaml.cpp | 6 | ||||
-rw-r--r-- | llvm/tools/llvm-pdbdump/PdbYaml.h | 16 | ||||
-rw-r--r-- | llvm/tools/llvm-pdbdump/YAMLOutputStyle.cpp | 10 | ||||
-rw-r--r-- | llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp | 49 |
5 files changed, 47 insertions, 35 deletions
diff --git a/llvm/tools/llvm-pdbdump/LLVMOutputStyle.cpp b/llvm/tools/llvm-pdbdump/LLVMOutputStyle.cpp index d8eefa08377..6fee3a2b026 100644 --- a/llvm/tools/llvm-pdbdump/LLVMOutputStyle.cpp +++ b/llvm/tools/llvm-pdbdump/LLVMOutputStyle.cpp @@ -101,7 +101,6 @@ Error LLVMOutputStyle::dumpFileHeaders() { P.printNumber("Unknown1", File.getUnknown1()); P.printNumber("BlockMapAddr", File.getBlockMapIndex()); P.printNumber("NumDirectoryBlocks", File.getNumDirectoryBlocks()); - P.printNumber("BlockMapOffset", File.getBlockMapOffset()); // The directory is not contiguous. Instead, the block map contains a // contiguous list of block numbers whose contents, when concatenated in diff --git a/llvm/tools/llvm-pdbdump/PdbYaml.cpp b/llvm/tools/llvm-pdbdump/PdbYaml.cpp index a341ab07308..6525e3c165b 100644 --- a/llvm/tools/llvm-pdbdump/PdbYaml.cpp +++ b/llvm/tools/llvm-pdbdump/PdbYaml.cpp @@ -115,16 +115,14 @@ void MappingTraits<PdbObject>::mapping(IO &IO, PdbObject &Obj) { void MappingTraits<MsfHeaders>::mapping(IO &IO, MsfHeaders &Obj) { IO.mapRequired("SuperBlock", Obj.SuperBlock); IO.mapRequired("NumDirectoryBlocks", Obj.NumDirectoryBlocks); - IO.mapRequired("BlockMapOffset", Obj.BlockMapOffset); IO.mapRequired("DirectoryBlocks", Obj.DirectoryBlocks); IO.mapRequired("NumStreams", Obj.NumStreams); IO.mapRequired("FileSize", Obj.FileSize); } -void MappingTraits<PDBFile::SuperBlock>::mapping(IO &IO, - PDBFile::SuperBlock &SB) { +void MappingTraits<msf::SuperBlock>::mapping(IO &IO, msf::SuperBlock &SB) { if (!IO.outputting()) { - ::memcpy(SB.MagicBytes, MsfMagic, sizeof(MsfMagic)); + ::memcpy(SB.MagicBytes, msf::Magic, sizeof(msf::Magic)); } IO.mapRequired("BlockSize", SB.BlockSize); diff --git a/llvm/tools/llvm-pdbdump/PdbYaml.h b/llvm/tools/llvm-pdbdump/PdbYaml.h index 91c0a585926..8a964a354c0 100644 --- a/llvm/tools/llvm-pdbdump/PdbYaml.h +++ b/llvm/tools/llvm-pdbdump/PdbYaml.h @@ -14,6 +14,7 @@ #include "llvm/ADT/Optional.h" #include "llvm/DebugInfo/PDB/PDBTypes.h" +#include "llvm/DebugInfo/PDB/Raw/MsfCommon.h" #include "llvm/DebugInfo/PDB/Raw/PDBFile.h" #include "llvm/DebugInfo/PDB/Raw/RawConstants.h" #include "llvm/Support/Endian.h" @@ -26,16 +27,15 @@ namespace pdb { namespace yaml { struct MsfHeaders { - PDBFile::SuperBlock SuperBlock; + msf::SuperBlock SuperBlock; uint32_t NumDirectoryBlocks; - uint32_t BlockMapOffset; - std::vector<support::ulittle32_t> DirectoryBlocks; + std::vector<uint32_t> DirectoryBlocks; uint32_t NumStreams; uint32_t FileSize; }; struct StreamBlockList { - std::vector<support::ulittle32_t> Blocks; + std::vector<uint32_t> Blocks; }; struct PdbInfoStream { @@ -57,7 +57,7 @@ struct PdbDbiStream { struct PdbObject { Optional<MsfHeaders> Headers; - Optional<std::vector<support::ulittle32_t>> StreamSizes; + Optional<std::vector<uint32_t>> StreamSizes; Optional<std::vector<StreamBlockList>> StreamMap; Optional<PdbInfoStream> PdbStream; Optional<PdbDbiStream> DbiStream; @@ -77,8 +77,8 @@ template <> struct MappingTraits<pdb::yaml::MsfHeaders> { static void mapping(IO &IO, pdb::yaml::MsfHeaders &Obj); }; -template <> struct MappingTraits<pdb::PDBFile::SuperBlock> { - static void mapping(IO &IO, pdb::PDBFile::SuperBlock &SB); +template <> struct MappingTraits<pdb::msf::SuperBlock> { + static void mapping(IO &IO, pdb::msf::SuperBlock &SB); }; template <> struct MappingTraits<pdb::yaml::StreamBlockList> { @@ -95,7 +95,7 @@ template <> struct MappingTraits<pdb::yaml::PdbDbiStream> { } } -LLVM_YAML_IS_SEQUENCE_VECTOR(support::ulittle32_t) +LLVM_YAML_IS_SEQUENCE_VECTOR(uint32_t) LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::pdb::yaml::StreamBlockList) #endif // LLVM_TOOLS_LLVMPDBDUMP_PDBYAML_H diff --git a/llvm/tools/llvm-pdbdump/YAMLOutputStyle.cpp b/llvm/tools/llvm-pdbdump/YAMLOutputStyle.cpp index aa68128cd80..e216ab98c13 100644 --- a/llvm/tools/llvm-pdbdump/YAMLOutputStyle.cpp +++ b/llvm/tools/llvm-pdbdump/YAMLOutputStyle.cpp @@ -23,8 +23,7 @@ using namespace llvm::pdb; YAMLOutputStyle::YAMLOutputStyle(PDBFile &File) : File(File), Out(outs()) {} Error YAMLOutputStyle::dump() { - if (opts::pdb2yaml::StreamDirectory || opts::pdb2yaml::PdbStream || - opts::pdb2yaml::DbiStream) + if (opts::pdb2yaml::StreamDirectory) opts::pdb2yaml::StreamMetadata = true; if (auto EC = dumpFileHeaders()) @@ -54,7 +53,6 @@ Error YAMLOutputStyle::dumpFileHeaders() { Obj.Headers.emplace(); Obj.Headers->SuperBlock.NumBlocks = File.getBlockCount(); Obj.Headers->SuperBlock.BlockMapAddr = File.getBlockMapIndex(); - Obj.Headers->BlockMapOffset = File.getBlockMapOffset(); Obj.Headers->SuperBlock.BlockSize = File.getBlockSize(); auto Blocks = File.getDirectoryBlockArray(); Obj.Headers->DirectoryBlocks.assign(Blocks.begin(), Blocks.end()); @@ -73,7 +71,9 @@ Error YAMLOutputStyle::dumpStreamMetadata() { if (!opts::pdb2yaml::StreamMetadata) return Error::success(); - Obj.StreamSizes = File.getStreamSizes(); + Obj.StreamSizes.emplace(); + Obj.StreamSizes->assign(File.getStreamSizes().begin(), + File.getStreamSizes().end()); return Error::success(); } @@ -85,7 +85,7 @@ Error YAMLOutputStyle::dumpStreamDirectory() { Obj.StreamMap.emplace(); for (auto &Stream : StreamMap) { pdb::yaml::StreamBlockList BlockList; - BlockList.Blocks = Stream; + BlockList.Blocks.assign(Stream.begin(), Stream.end()); Obj.StreamMap->push_back(BlockList); } diff --git a/llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp b/llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp index 5a3ced37a9d..467b5bfe1b6 100644 --- a/llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp +++ b/llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp @@ -279,14 +279,12 @@ cl::opt<bool> StreamDirectory( "stream-directory", cl::desc("Dump each stream's block map (implies -stream-metadata)"), cl::sub(PdbToYamlSubcommand), cl::init(false)); -cl::opt<bool> PdbStream( - "pdb-stream", - cl::desc("Dump the PDB Stream (Stream 1) (implies -stream-metadata)"), - cl::sub(PdbToYamlSubcommand), cl::init(false)); -cl::opt<bool> DbiStream( - "dbi-stream", - cl::desc("Dump the DBI Stream (Stream 2) (implies -stream-metadata)"), - cl::sub(PdbToYamlSubcommand), cl::init(false)); +cl::opt<bool> PdbStream("pdb-stream", + cl::desc("Dump the PDB Stream (Stream 1)"), + cl::sub(PdbToYamlSubcommand), cl::init(false)); +cl::opt<bool> DbiStream("dbi-stream", + cl::desc("Dump the DBI Stream (Stream 2)"), + cl::sub(PdbToYamlSubcommand), cl::init(false)); cl::list<std::string> InputFilename(cl::Positional, cl::desc("<input PDB file>"), cl::Required, @@ -324,20 +322,37 @@ static void yamlToPdb(StringRef Path) { llvm::make_unique<FileBufferByteStream>(std::move(*OutFileOrError)); PDBFileBuilder Builder(std::move(FileByteStream)); - ExitOnErr(Builder.setSuperBlock(YamlObj.Headers->SuperBlock)); - if (YamlObj.StreamSizes.hasValue()) { - Builder.setStreamSizes(YamlObj.StreamSizes.getValue()); + ExitOnErr(Builder.initialize(YamlObj.Headers->SuperBlock)); + ExitOnErr(Builder.getMsfBuilder().setDirectoryBlocksHint( + YamlObj.Headers->DirectoryBlocks)); + if (!YamlObj.StreamSizes.hasValue()) { + ExitOnErr(make_error<GenericError>( + generic_error_code::unspecified, + "Cannot generate a PDB when stream sizes are not known")); } - Builder.setDirectoryBlocks(YamlObj.Headers->DirectoryBlocks); if (YamlObj.StreamMap.hasValue()) { - std::vector<ArrayRef<support::ulittle32_t>> StreamMap; - for (auto &E : YamlObj.StreamMap.getValue()) { - StreamMap.push_back(E.Blocks); + if (YamlObj.StreamMap->size() != YamlObj.StreamSizes->size()) { + ExitOnErr(make_error<GenericError>(generic_error_code::unspecified, + "YAML specifies different number of " + "streams in stream sizes and stream " + "map")); + } + + auto &Sizes = *YamlObj.StreamSizes; + auto &Map = *YamlObj.StreamMap; + for (uint32_t I = 0; I < Sizes.size(); ++I) { + uint32_t Size = Sizes[I]; + std::vector<uint32_t> Blocks; + for (auto E : Map[I].Blocks) + Blocks.push_back(E); + ExitOnErr(Builder.getMsfBuilder().addStream(Size, Blocks)); } - Builder.setStreamMap(StreamMap); } else { - ExitOnErr(Builder.generateSimpleStreamMap()); + auto &Sizes = *YamlObj.StreamSizes; + for (auto S : Sizes) { + ExitOnErr(Builder.getMsfBuilder().addStream(S)); + } } if (YamlObj.PdbStream.hasValue()) { |