summaryrefslogtreecommitdiffstats
path: root/llvm/tools
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/tools')
-rw-r--r--llvm/tools/llvm-pdbdump/PdbYaml.cpp93
-rw-r--r--llvm/tools/llvm-pdbdump/PdbYaml.h33
-rw-r--r--llvm/tools/llvm-pdbdump/YAMLOutputStyle.cpp27
-rw-r--r--llvm/tools/llvm-pdbdump/YAMLOutputStyle.h1
-rw-r--r--llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp50
-rw-r--r--llvm/tools/llvm-pdbdump/llvm-pdbdump.h1
6 files changed, 164 insertions, 41 deletions
diff --git a/llvm/tools/llvm-pdbdump/PdbYaml.cpp b/llvm/tools/llvm-pdbdump/PdbYaml.cpp
index b43316a601d..a341ab07308 100644
--- a/llvm/tools/llvm-pdbdump/PdbYaml.cpp
+++ b/llvm/tools/llvm-pdbdump/PdbYaml.cpp
@@ -53,9 +53,74 @@ template <> struct ScalarTraits<llvm::pdb::PDB_UniqueId> {
static bool mustQuote(StringRef Scalar) { return needsQuotes(Scalar); }
};
+
+template <> struct ScalarEnumerationTraits<llvm::pdb::PDB_Machine> {
+ static void enumeration(IO &io, llvm::pdb::PDB_Machine &Value) {
+ io.enumCase(Value, "Invalid", PDB_Machine::Invalid);
+ io.enumCase(Value, "Am33", PDB_Machine::Am33);
+ io.enumCase(Value, "Amd64", PDB_Machine::Amd64);
+ io.enumCase(Value, "Arm", PDB_Machine::Arm);
+ io.enumCase(Value, "ArmNT", PDB_Machine::ArmNT);
+ io.enumCase(Value, "Ebc", PDB_Machine::Ebc);
+ io.enumCase(Value, "x86", PDB_Machine::x86);
+ io.enumCase(Value, "Ia64", PDB_Machine::Ia64);
+ io.enumCase(Value, "M32R", PDB_Machine::M32R);
+ io.enumCase(Value, "Mips16", PDB_Machine::Mips16);
+ io.enumCase(Value, "MipsFpu", PDB_Machine::MipsFpu);
+ io.enumCase(Value, "MipsFpu16", PDB_Machine::MipsFpu16);
+ io.enumCase(Value, "PowerPCFP", PDB_Machine::PowerPCFP);
+ io.enumCase(Value, "R4000", PDB_Machine::R4000);
+ io.enumCase(Value, "SH3", PDB_Machine::SH3);
+ io.enumCase(Value, "SH3DSP", PDB_Machine::SH3DSP);
+ io.enumCase(Value, "Thumb", PDB_Machine::Thumb);
+ io.enumCase(Value, "WceMipsV2", PDB_Machine::WceMipsV2);
+ }
+};
+
+template <> struct ScalarEnumerationTraits<llvm::pdb::PdbRaw_DbiVer> {
+ static void enumeration(IO &io, llvm::pdb::PdbRaw_DbiVer &Value) {
+ io.enumCase(Value, "V41", llvm::pdb::PdbRaw_DbiVer::PdbDbiVC41);
+ io.enumCase(Value, "V50", llvm::pdb::PdbRaw_DbiVer::PdbDbiV50);
+ io.enumCase(Value, "V60", llvm::pdb::PdbRaw_DbiVer::PdbDbiV60);
+ io.enumCase(Value, "V70", llvm::pdb::PdbRaw_DbiVer::PdbDbiV70);
+ io.enumCase(Value, "V110", llvm::pdb::PdbRaw_DbiVer::PdbDbiV110);
+ }
+};
+
+template <> struct ScalarEnumerationTraits<llvm::pdb::PdbRaw_ImplVer> {
+ static void enumeration(IO &io, llvm::pdb::PdbRaw_ImplVer &Value) {
+ io.enumCase(Value, "VC2", llvm::pdb::PdbRaw_ImplVer::PdbImplVC2);
+ io.enumCase(Value, "VC4", llvm::pdb::PdbRaw_ImplVer::PdbImplVC4);
+ io.enumCase(Value, "VC41", llvm::pdb::PdbRaw_ImplVer::PdbImplVC41);
+ io.enumCase(Value, "VC50", llvm::pdb::PdbRaw_ImplVer::PdbImplVC50);
+ io.enumCase(Value, "VC98", llvm::pdb::PdbRaw_ImplVer::PdbImplVC98);
+ io.enumCase(Value, "VC70Dep", llvm::pdb::PdbRaw_ImplVer::PdbImplVC70Dep);
+ io.enumCase(Value, "VC70", llvm::pdb::PdbRaw_ImplVer::PdbImplVC70);
+ io.enumCase(Value, "VC80", llvm::pdb::PdbRaw_ImplVer::PdbImplVC80);
+ io.enumCase(Value, "VC110", llvm::pdb::PdbRaw_ImplVer::PdbImplVC110);
+ io.enumCase(Value, "VC140", llvm::pdb::PdbRaw_ImplVer::PdbImplVC140);
+ }
+};
}
}
+void MappingTraits<PdbObject>::mapping(IO &IO, PdbObject &Obj) {
+ IO.mapOptional("MSF", Obj.Headers);
+ IO.mapOptional("StreamSizes", Obj.StreamSizes);
+ IO.mapOptional("StreamMap", Obj.StreamMap);
+ IO.mapOptional("PdbStream", Obj.PdbStream);
+ IO.mapOptional("DbiStream", Obj.DbiStream);
+}
+
+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) {
if (!IO.outputting()) {
@@ -74,25 +139,19 @@ void MappingTraits<StreamBlockList>::mapping(IO &IO, StreamBlockList &SB) {
IO.mapRequired("Stream", SB.Blocks);
}
-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<PdbObject>::mapping(IO &IO, PdbObject &Obj) {
- IO.mapOptional("MSF", Obj.Headers);
- IO.mapOptional("StreamSizes", Obj.StreamSizes);
- IO.mapOptional("StreamMap", Obj.StreamMap);
- IO.mapOptional("PdbStream", Obj.PdbStream);
-}
-
void MappingTraits<PdbInfoStream>::mapping(IO &IO, PdbInfoStream &Obj) {
IO.mapRequired("Age", Obj.Age);
IO.mapRequired("Guid", Obj.Guid);
IO.mapRequired("Signature", Obj.Signature);
IO.mapRequired("Version", Obj.Version);
-} \ No newline at end of file
+}
+
+void MappingTraits<PdbDbiStream>::mapping(IO &IO, PdbDbiStream &Obj) {
+ IO.mapRequired("VerHeader", Obj.VerHeader);
+ IO.mapRequired("Age", Obj.Age);
+ IO.mapRequired("BuildNumber", Obj.BuildNumber);
+ IO.mapRequired("PdbDllVersion", Obj.PdbDllVersion);
+ IO.mapRequired("PdbDllRbld", Obj.PdbDllRbld);
+ IO.mapRequired("Flags", Obj.Flags);
+ IO.mapRequired("MachineType", Obj.MachineType);
+}
diff --git a/llvm/tools/llvm-pdbdump/PdbYaml.h b/llvm/tools/llvm-pdbdump/PdbYaml.h
index d243f9b12b1..91c0a585926 100644
--- a/llvm/tools/llvm-pdbdump/PdbYaml.h
+++ b/llvm/tools/llvm-pdbdump/PdbYaml.h
@@ -39,17 +39,28 @@ struct StreamBlockList {
};
struct PdbInfoStream {
- uint32_t Version;
+ PdbRaw_ImplVer Version;
uint32_t Signature;
uint32_t Age;
PDB_UniqueId Guid;
};
+struct PdbDbiStream {
+ PdbRaw_DbiVer VerHeader;
+ uint32_t Age;
+ uint16_t BuildNumber;
+ uint32_t PdbDllVersion;
+ uint16_t PdbDllRbld;
+ uint16_t Flags;
+ PDB_Machine MachineType;
+};
+
struct PdbObject {
Optional<MsfHeaders> Headers;
Optional<std::vector<support::ulittle32_t>> StreamSizes;
Optional<std::vector<StreamBlockList>> StreamMap;
Optional<PdbInfoStream> PdbStream;
+ Optional<PdbDbiStream> DbiStream;
};
}
}
@@ -58,25 +69,29 @@ struct PdbObject {
namespace llvm {
namespace yaml {
-template <> struct MappingTraits<pdb::PDBFile::SuperBlock> {
- static void mapping(IO &IO, pdb::PDBFile::SuperBlock &SB);
-};
-
-template <> struct MappingTraits<pdb::yaml::StreamBlockList> {
- static void mapping(IO &IO, pdb::yaml::StreamBlockList &SB);
+template <> struct MappingTraits<pdb::yaml::PdbObject> {
+ static void mapping(IO &IO, pdb::yaml::PdbObject &Obj);
};
template <> struct MappingTraits<pdb::yaml::MsfHeaders> {
static void mapping(IO &IO, pdb::yaml::MsfHeaders &Obj);
};
-template <> struct MappingTraits<pdb::yaml::PdbObject> {
- static void mapping(IO &IO, pdb::yaml::PdbObject &Obj);
+template <> struct MappingTraits<pdb::PDBFile::SuperBlock> {
+ static void mapping(IO &IO, pdb::PDBFile::SuperBlock &SB);
+};
+
+template <> struct MappingTraits<pdb::yaml::StreamBlockList> {
+ static void mapping(IO &IO, pdb::yaml::StreamBlockList &SB);
};
template <> struct MappingTraits<pdb::yaml::PdbInfoStream> {
static void mapping(IO &IO, pdb::yaml::PdbInfoStream &Obj);
};
+
+template <> struct MappingTraits<pdb::yaml::PdbDbiStream> {
+ static void mapping(IO &IO, pdb::yaml::PdbDbiStream &Obj);
+};
}
}
diff --git a/llvm/tools/llvm-pdbdump/YAMLOutputStyle.cpp b/llvm/tools/llvm-pdbdump/YAMLOutputStyle.cpp
index f3c730fc6b3..aa68128cd80 100644
--- a/llvm/tools/llvm-pdbdump/YAMLOutputStyle.cpp
+++ b/llvm/tools/llvm-pdbdump/YAMLOutputStyle.cpp
@@ -12,6 +12,7 @@
#include "PdbYaml.h"
#include "llvm-pdbdump.h"
+#include "llvm/DebugInfo/PDB/Raw/DbiStream.h"
#include "llvm/DebugInfo/PDB/Raw/InfoStream.h"
#include "llvm/DebugInfo/PDB/Raw/PDBFile.h"
#include "llvm/DebugInfo/PDB/Raw/RawConstants.h"
@@ -22,7 +23,8 @@ using namespace llvm::pdb;
YAMLOutputStyle::YAMLOutputStyle(PDBFile &File) : File(File), Out(outs()) {}
Error YAMLOutputStyle::dump() {
- if (opts::pdb2yaml::StreamDirectory || opts::pdb2yaml::PdbStream)
+ if (opts::pdb2yaml::StreamDirectory || opts::pdb2yaml::PdbStream ||
+ opts::pdb2yaml::DbiStream)
opts::pdb2yaml::StreamMetadata = true;
if (auto EC = dumpFileHeaders())
@@ -37,6 +39,9 @@ Error YAMLOutputStyle::dump() {
if (auto EC = dumpPDBStream())
return EC;
+ if (auto EC = dumpDbiStream())
+ return EC;
+
flush();
return Error::success();
}
@@ -105,6 +110,26 @@ Error YAMLOutputStyle::dumpPDBStream() {
return Error::success();
}
+Error YAMLOutputStyle::dumpDbiStream() {
+ if (!opts::pdb2yaml::DbiStream)
+ return Error::success();
+
+ auto DbiS = File.getPDBDbiStream();
+ if (!DbiS)
+ return DbiS.takeError();
+
+ auto &DS = DbiS.get();
+ Obj.DbiStream.emplace();
+ Obj.DbiStream->Age = DS.getAge();
+ Obj.DbiStream->BuildNumber = DS.getBuildNumber();
+ Obj.DbiStream->Flags = DS.getFlags();
+ Obj.DbiStream->MachineType = DS.getMachineType();
+ Obj.DbiStream->PdbDllRbld = DS.getPdbDllRbld();
+ Obj.DbiStream->PdbDllVersion = DS.getPdbDllVersion();
+ Obj.DbiStream->VerHeader = DS.getDbiVersion();
+ return Error::success();
+}
+
void YAMLOutputStyle::flush() {
Out << Obj;
outs().flush();
diff --git a/llvm/tools/llvm-pdbdump/YAMLOutputStyle.h b/llvm/tools/llvm-pdbdump/YAMLOutputStyle.h
index 1c7e8ace5ea..d36dfec5f25 100644
--- a/llvm/tools/llvm-pdbdump/YAMLOutputStyle.h
+++ b/llvm/tools/llvm-pdbdump/YAMLOutputStyle.h
@@ -30,6 +30,7 @@ private:
Error dumpStreamMetadata();
Error dumpStreamDirectory();
Error dumpPDBStream();
+ Error dumpDbiStream();
void flush();
diff --git a/llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp b/llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp
index ffb71ba0410..5a3ced37a9d 100644
--- a/llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp
+++ b/llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp
@@ -40,8 +40,12 @@
#include "llvm/DebugInfo/PDB/PDBSymbolExe.h"
#include "llvm/DebugInfo/PDB/PDBSymbolFunc.h"
#include "llvm/DebugInfo/PDB/PDBSymbolThunk.h"
+#include "llvm/DebugInfo/PDB/Raw/DbiStream.h"
+#include "llvm/DebugInfo/PDB/Raw/DbiStreamBuilder.h"
#include "llvm/DebugInfo/PDB/Raw/InfoStream.h"
+#include "llvm/DebugInfo/PDB/Raw/InfoStreamBuilder.h"
#include "llvm/DebugInfo/PDB/Raw/PDBFile.h"
+#include "llvm/DebugInfo/PDB/Raw/PDBFileBuilder.h"
#include "llvm/DebugInfo/PDB/Raw/RawConstants.h"
#include "llvm/DebugInfo/PDB/Raw/RawError.h"
#include "llvm/DebugInfo/PDB/Raw/RawSession.h"
@@ -279,6 +283,10 @@ 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::list<std::string> InputFilename(cl::Positional,
cl::desc("<input PDB file>"), cl::Required,
@@ -314,34 +322,48 @@ 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));
+ PDBFileBuilder Builder(std::move(FileByteStream));
+
+ ExitOnErr(Builder.setSuperBlock(YamlObj.Headers->SuperBlock));
if (YamlObj.StreamSizes.hasValue()) {
- Pdb.setStreamSizes(YamlObj.StreamSizes.getValue());
+ Builder.setStreamSizes(YamlObj.StreamSizes.getValue());
}
- Pdb.setDirectoryBlocks(YamlObj.Headers->DirectoryBlocks);
+ 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);
}
- Pdb.setStreamMap(StreamMap);
+ Builder.setStreamMap(StreamMap);
} else {
- ExitOnErr(Pdb.generateSimpleStreamMap());
+ ExitOnErr(Builder.generateSimpleStreamMap());
}
if (YamlObj.PdbStream.hasValue()) {
- auto IS = Pdb.emplacePDBInfoStream();
- ExitOnErr(IS.takeError());
- auto &InfoS = IS.get();
- InfoS.setAge(YamlObj.PdbStream->Age);
- InfoS.setGuid(YamlObj.PdbStream->Guid);
- InfoS.setSignature(YamlObj.PdbStream->Signature);
- InfoS.setVersion(static_cast<PdbRaw_ImplVer>(YamlObj.PdbStream->Version));
+ auto &InfoBuilder = Builder.getInfoBuilder();
+ InfoBuilder.setAge(YamlObj.PdbStream->Age);
+ InfoBuilder.setGuid(YamlObj.PdbStream->Guid);
+ InfoBuilder.setSignature(YamlObj.PdbStream->Signature);
+ InfoBuilder.setVersion(YamlObj.PdbStream->Version);
}
- ExitOnErr(Pdb.commit());
+ if (YamlObj.DbiStream.hasValue()) {
+ auto &DbiBuilder = Builder.getDbiBuilder();
+ DbiBuilder.setAge(YamlObj.DbiStream->Age);
+ DbiBuilder.setBuildNumber(YamlObj.DbiStream->BuildNumber);
+ DbiBuilder.setFlags(YamlObj.DbiStream->Flags);
+ DbiBuilder.setMachineType(YamlObj.DbiStream->MachineType);
+ DbiBuilder.setPdbDllRbld(YamlObj.DbiStream->PdbDllRbld);
+ DbiBuilder.setPdbDllVersion(YamlObj.DbiStream->PdbDllVersion);
+ DbiBuilder.setVersionHeader(YamlObj.DbiStream->VerHeader);
+ }
+
+ auto Pdb = Builder.build();
+ ExitOnErr(Pdb.takeError());
+
+ auto &PdbFile = *Pdb;
+ ExitOnErr(PdbFile->commit());
}
static void pdb2Yaml(StringRef Path) {
diff --git a/llvm/tools/llvm-pdbdump/llvm-pdbdump.h b/llvm/tools/llvm-pdbdump/llvm-pdbdump.h
index 7ccf4d5c2b4..0a66515f4a0 100644
--- a/llvm/tools/llvm-pdbdump/llvm-pdbdump.h
+++ b/llvm/tools/llvm-pdbdump/llvm-pdbdump.h
@@ -61,6 +61,7 @@ extern llvm::cl::opt<bool> NoFileHeaders;
extern llvm::cl::opt<bool> StreamMetadata;
extern llvm::cl::opt<bool> StreamDirectory;
extern llvm::cl::opt<bool> PdbStream;
+extern llvm::cl::opt<bool> DbiStream;
extern llvm::cl::list<std::string> InputFilename;
}
}
OpenPOWER on IntegriCloud