diff --git a/llvm/test/DebugInfo/PDB/pdbdump-yaml.test b/llvm/test/DebugInfo/PDB/pdbdump-yaml.test index 2d48489e3902..3ccc6c25be1b 100644 --- a/llvm/test/DebugInfo/PDB/pdbdump-yaml.test +++ b/llvm/test/DebugInfo/PDB/pdbdump-yaml.test @@ -1,5 +1,7 @@ ; RUN: llvm-pdbdump pdb2yaml -stream-metadata -stream-directory -pdb-stream %p/Inputs/empty.pdb \ ; RUN: | FileCheck -check-prefix=YAML %s +; RUN: llvm-pdbdump pdb2yaml -no-file-headers -stream-metadata -stream-directory -pdb-stream \ +; RUN: %p/Inputs/empty.pdb | FileCheck -check-prefix=NO-HEADERS %s ; YAML: --- ; YAML-NEXT: MSF: @@ -74,3 +76,8 @@ ; YAML-NEXT: Signature: 1424295906 ; YAML-NEXT: Version: 20000404 ; YAML-NEXT: ... + +; NO-HEADERS: --- +; NO-HEADERS-NOT: MSF: +; NO-HEADERS-NOT: SuperBlock: +; NO-HEADERS: ... \ No newline at end of file diff --git a/llvm/tools/llvm-pdbdump/PdbYaml.h b/llvm/tools/llvm-pdbdump/PdbYaml.h index 96b7d7c8db2e..d243f9b12b1a 100644 --- a/llvm/tools/llvm-pdbdump/PdbYaml.h +++ b/llvm/tools/llvm-pdbdump/PdbYaml.h @@ -46,7 +46,7 @@ struct PdbInfoStream { }; struct PdbObject { - MsfHeaders Headers; + Optional<MsfHeaders> Headers; Optional<std::vector<support::ulittle32_t>> StreamSizes; Optional<std::vector<StreamBlockList>> StreamMap; Optional<PdbInfoStream> PdbStream; diff --git a/llvm/tools/llvm-pdbdump/YAMLOutputStyle.cpp b/llvm/tools/llvm-pdbdump/YAMLOutputStyle.cpp index 32f19414dd9e..f3c730fc6b39 100644 --- a/llvm/tools/llvm-pdbdump/YAMLOutputStyle.cpp +++ b/llvm/tools/llvm-pdbdump/YAMLOutputStyle.cpp @@ -42,20 +42,24 @@ Error YAMLOutputStyle::dump() { } Error YAMLOutputStyle::dumpFileHeaders() { + if (opts::pdb2yaml::NoFileHeaders) + return Error::success(); + yaml::MsfHeaders Headers; - Obj.Headers.SuperBlock.NumBlocks = File.getBlockCount(); - Obj.Headers.SuperBlock.BlockMapAddr = File.getBlockMapIndex(); - Obj.Headers.BlockMapOffset = File.getBlockMapOffset(); - Obj.Headers.SuperBlock.BlockSize = File.getBlockSize(); + 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()); - Obj.Headers.NumDirectoryBlocks = File.getNumDirectoryBlocks(); - Obj.Headers.SuperBlock.NumDirectoryBytes = File.getNumDirectoryBytes(); - Obj.Headers.NumStreams = + Obj.Headers->DirectoryBlocks.assign(Blocks.begin(), Blocks.end()); + Obj.Headers->NumDirectoryBlocks = File.getNumDirectoryBlocks(); + Obj.Headers->SuperBlock.NumDirectoryBytes = File.getNumDirectoryBytes(); + Obj.Headers->NumStreams = opts::pdb2yaml::StreamMetadata ? File.getNumStreams() : 0; - Obj.Headers.SuperBlock.Unknown0 = File.getUnknown0(); - Obj.Headers.SuperBlock.Unknown1 = File.getUnknown1(); - Obj.Headers.FileSize = File.getFileSize(); + Obj.Headers->SuperBlock.Unknown0 = File.getUnknown0(); + Obj.Headers->SuperBlock.Unknown1 = File.getUnknown1(); + Obj.Headers->FileSize = File.getFileSize(); return Error::success(); } diff --git a/llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp b/llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp index 1b72a1927ca1..ffb71ba04107 100644 --- a/llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp +++ b/llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp @@ -261,18 +261,24 @@ cl::list<std::string> InputFilename(cl::Positional, } namespace pdb2yaml { +cl::opt<bool> + NoFileHeaders("no-file-headers", + cl::desc("Do not dump MSF file headers (you will not be able " + "to generate a fresh PDB from the resulting YAML)"), + cl::sub(PdbToYamlSubcommand), cl::init(false)); + cl::opt<bool> StreamMetadata( "stream-metadata", cl::desc("Dump the number of streams and each stream's size"), - cl::sub(PdbToYamlSubcommand)); + cl::sub(PdbToYamlSubcommand), cl::init(false)); cl::opt<bool> StreamDirectory( "stream-directory", cl::desc("Dump each stream's block map (implies -stream-metadata)"), - cl::sub(PdbToYamlSubcommand)); + 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::sub(PdbToYamlSubcommand), cl::init(false)); cl::list<std::string> InputFilename(cl::Positional, cl::desc("<input PDB file>"), cl::Required, @@ -296,9 +302,12 @@ static void yamlToPdb(StringRef Path) { llvm::yaml::Input In(Buffer->getBuffer()); pdb::yaml::PdbObject YamlObj; In >> YamlObj; + if (!YamlObj.Headers.hasValue()) + ExitOnErr(make_error<GenericError>(generic_error_code::unspecified, + "Yaml does not contain MSF headers")); auto OutFileOrError = FileOutputBuffer::create( - opts::yaml2pdb::YamlPdbOutputFile, YamlObj.Headers.FileSize); + opts::yaml2pdb::YamlPdbOutputFile, YamlObj.Headers->FileSize); if (OutFileOrError.getError()) ExitOnErr(make_error<GenericError>(generic_error_code::invalid_path, opts::yaml2pdb::YamlPdbOutputFile)); @@ -306,11 +315,11 @@ static void yamlToPdb(StringRef Path) { auto FileByteStream = llvm::make_unique<FileBufferByteStream>(std::move(*OutFileOrError)); PDBFile Pdb(std::move(FileByteStream)); - ExitOnErr(Pdb.setSuperBlock(&YamlObj.Headers.SuperBlock)); + ExitOnErr(Pdb.setSuperBlock(&YamlObj.Headers->SuperBlock)); if (YamlObj.StreamSizes.hasValue()) { Pdb.setStreamSizes(YamlObj.StreamSizes.getValue()); } - Pdb.setDirectoryBlocks(YamlObj.Headers.DirectoryBlocks); + Pdb.setDirectoryBlocks(YamlObj.Headers->DirectoryBlocks); if (YamlObj.StreamMap.hasValue()) { std::vector<ArrayRef<support::ulittle32_t>> StreamMap; diff --git a/llvm/tools/llvm-pdbdump/llvm-pdbdump.h b/llvm/tools/llvm-pdbdump/llvm-pdbdump.h index 412edaaec968..7ccf4d5c2b4f 100644 --- a/llvm/tools/llvm-pdbdump/llvm-pdbdump.h +++ b/llvm/tools/llvm-pdbdump/llvm-pdbdump.h @@ -57,6 +57,7 @@ extern llvm::cl::opt<bool> DumpFpo; } namespace pdb2yaml { +extern llvm::cl::opt<bool> NoFileHeaders; extern llvm::cl::opt<bool> StreamMetadata; extern llvm::cl::opt<bool> StreamDirectory; extern llvm::cl::opt<bool> PdbStream;