summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/test/DebugInfo/PDB/pdbdump-yaml.test7
-rw-r--r--llvm/tools/llvm-pdbdump/PdbYaml.h2
-rw-r--r--llvm/tools/llvm-pdbdump/YAMLOutputStyle.cpp26
-rw-r--r--llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp21
-rw-r--r--llvm/tools/llvm-pdbdump/llvm-pdbdump.h1
5 files changed, 39 insertions, 18 deletions
diff --git a/llvm/test/DebugInfo/PDB/pdbdump-yaml.test b/llvm/test/DebugInfo/PDB/pdbdump-yaml.test
index 2d48489e390..3ccc6c25be1 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 96b7d7c8db2..d243f9b12b1 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 32f19414dd9..f3c730fc6b3 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 1b72a1927ca..ffb71ba0410 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 412edaaec96..7ccf4d5c2b4 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;
OpenPOWER on IntegriCloud