summaryrefslogtreecommitdiffstats
path: root/llvm/tools
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/tools')
-rw-r--r--llvm/tools/llvm-pdbdump/LLVMOutputStyle.cpp1
-rw-r--r--llvm/tools/llvm-pdbdump/PdbYaml.cpp6
-rw-r--r--llvm/tools/llvm-pdbdump/PdbYaml.h16
-rw-r--r--llvm/tools/llvm-pdbdump/YAMLOutputStyle.cpp10
-rw-r--r--llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp49
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()) {
OpenPOWER on IntegriCloud