}
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();
}
}
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,
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));
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;