summaryrefslogtreecommitdiffstats
path: root/llvm/tools/llvm-pdbdump
diff options
context:
space:
mode:
authorZachary Turner <zturner@google.com>2016-07-22 15:46:37 +0000
committerZachary Turner <zturner@google.com>2016-07-22 15:46:37 +0000
commitd218c261247edb8b44132fcff3588a67494effb6 (patch)
treea0f8928f13397f9e1491638ca3a040241e96f4d1 /llvm/tools/llvm-pdbdump
parentb772151a17a508355ad46db63d13da1dbec32b09 (diff)
downloadbcm5719-llvm-d218c261247edb8b44132fcff3588a67494effb6.tar.gz
bcm5719-llvm-d218c261247edb8b44132fcff3588a67494effb6.zip
[pdb] Round-trip module & file info to/from YAML.
This implements support for writing compiland and compiland source file info to a binary PDB. This is tested by adding support for dumping these fields from an existing PDB to yaml, reading them back in, and dumping them again and verifying the values are as expected. llvm-svn: 276426
Diffstat (limited to 'llvm/tools/llvm-pdbdump')
-rw-r--r--llvm/tools/llvm-pdbdump/PdbYaml.cpp7
-rw-r--r--llvm/tools/llvm-pdbdump/PdbYaml.h14
-rw-r--r--llvm/tools/llvm-pdbdump/YAMLOutputStyle.cpp14
-rw-r--r--llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp15
-rw-r--r--llvm/tools/llvm-pdbdump/llvm-pdbdump.h2
5 files changed, 52 insertions, 0 deletions
diff --git a/llvm/tools/llvm-pdbdump/PdbYaml.cpp b/llvm/tools/llvm-pdbdump/PdbYaml.cpp
index e83f24e8774..9674ded4927 100644
--- a/llvm/tools/llvm-pdbdump/PdbYaml.cpp
+++ b/llvm/tools/llvm-pdbdump/PdbYaml.cpp
@@ -153,6 +153,7 @@ void MappingTraits<PdbDbiStream>::mapping(IO &IO, PdbDbiStream &Obj) {
IO.mapRequired("PdbDllRbld", Obj.PdbDllRbld);
IO.mapRequired("Flags", Obj.Flags);
IO.mapRequired("MachineType", Obj.MachineType);
+ IO.mapOptional("Modules", Obj.ModInfos);
}
void MappingTraits<NamedStreamMapping>::mapping(IO &IO,
@@ -160,3 +161,9 @@ void MappingTraits<NamedStreamMapping>::mapping(IO &IO,
IO.mapRequired("Name", Obj.StreamName);
IO.mapRequired("StreamNum", Obj.StreamNumber);
}
+
+void MappingTraits<PdbDbiModuleInfo>::mapping(IO &IO, PdbDbiModuleInfo &Obj) {
+ IO.mapRequired("Module", Obj.Mod);
+ IO.mapRequired("ObjFile", Obj.Obj);
+ IO.mapOptional("SourceFiles", Obj.SourceFiles);
+}
diff --git a/llvm/tools/llvm-pdbdump/PdbYaml.h b/llvm/tools/llvm-pdbdump/PdbYaml.h
index 08150832ca5..4488d742410 100644
--- a/llvm/tools/llvm-pdbdump/PdbYaml.h
+++ b/llvm/tools/llvm-pdbdump/PdbYaml.h
@@ -51,6 +51,12 @@ struct PdbInfoStream {
std::vector<NamedStreamMapping> NamedStreams;
};
+struct PdbDbiModuleInfo {
+ StringRef Obj;
+ StringRef Mod;
+ std::vector<StringRef> SourceFiles;
+};
+
struct PdbDbiStream {
PdbRaw_DbiVer VerHeader;
uint32_t Age;
@@ -59,6 +65,8 @@ struct PdbDbiStream {
uint16_t PdbDllRbld;
uint16_t Flags;
PDB_Machine MachineType;
+
+ std::vector<PdbDbiModuleInfo> ModInfos;
};
struct PdbObject {
@@ -102,11 +110,17 @@ template <> struct MappingTraits<pdb::yaml::PdbDbiStream> {
template <> struct MappingTraits<pdb::yaml::NamedStreamMapping> {
static void mapping(IO &IO, pdb::yaml::NamedStreamMapping &Obj);
};
+
+template <> struct MappingTraits<pdb::yaml::PdbDbiModuleInfo> {
+ static void mapping(IO &IO, pdb::yaml::PdbDbiModuleInfo &Obj);
+};
}
}
LLVM_YAML_IS_FLOW_SEQUENCE_VECTOR(uint32_t)
+LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::StringRef)
LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::pdb::yaml::NamedStreamMapping)
+LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::pdb::yaml::PdbDbiModuleInfo)
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 a8b6202d5d1..745cfa7b0d1 100644
--- a/llvm/tools/llvm-pdbdump/YAMLOutputStyle.cpp
+++ b/llvm/tools/llvm-pdbdump/YAMLOutputStyle.cpp
@@ -25,6 +25,10 @@ YAMLOutputStyle::YAMLOutputStyle(PDBFile &File) : File(File), Out(outs()) {}
Error YAMLOutputStyle::dump() {
if (opts::pdb2yaml::StreamDirectory)
opts::pdb2yaml::StreamMetadata = true;
+ if (opts::pdb2yaml::DbiModuleSourceFileInfo)
+ opts::pdb2yaml::DbiModuleInfo = true;
+ if (opts::pdb2yaml::DbiModuleInfo)
+ opts::pdb2yaml::DbiStream = true;
if (auto EC = dumpFileHeaders())
return EC;
@@ -133,6 +137,16 @@ Error YAMLOutputStyle::dumpDbiStream() {
Obj.DbiStream->PdbDllRbld = DS.getPdbDllRbld();
Obj.DbiStream->PdbDllVersion = DS.getPdbDllVersion();
Obj.DbiStream->VerHeader = DS.getDbiVersion();
+ if (opts::pdb2yaml::DbiModuleInfo) {
+ for (const auto &MI : DS.modules()) {
+ yaml::PdbDbiModuleInfo DMI;
+ DMI.Mod = MI.Info.getModuleName();
+ DMI.Obj = MI.Info.getObjFileName();
+ if (opts::pdb2yaml::DbiModuleSourceFileInfo)
+ DMI.SourceFiles = MI.SourceFiles;
+ Obj.DbiStream->ModInfos.push_back(DMI);
+ }
+ }
return Error::success();
}
diff --git a/llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp b/llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp
index 62f215ddc8a..0600bcd952c 100644
--- a/llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp
+++ b/llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp
@@ -285,6 +285,16 @@ cl::opt<bool> PdbStream("pdb-stream",
cl::opt<bool> DbiStream("dbi-stream",
cl::desc("Dump the DBI Stream (Stream 2)"),
cl::sub(PdbToYamlSubcommand), cl::init(false));
+cl::opt<bool>
+ DbiModuleInfo("dbi-module-info",
+ cl::desc("Dump DBI Module Information (implies -dbi-stream)"),
+ cl::sub(PdbToYamlSubcommand), cl::init(false));
+
+cl::opt<bool> DbiModuleSourceFileInfo(
+ "dbi-module-source-info",
+ cl::desc(
+ "Dump DBI Module Source File Information (implies -dbi-module-info"),
+ cl::sub(PdbToYamlSubcommand), cl::init(false));
cl::list<std::string> InputFilename(cl::Positional,
cl::desc("<input PDB file>"), cl::Required,
@@ -375,6 +385,11 @@ static void yamlToPdb(StringRef Path) {
DbiBuilder.setPdbDllRbld(YamlObj.DbiStream->PdbDllRbld);
DbiBuilder.setPdbDllVersion(YamlObj.DbiStream->PdbDllVersion);
DbiBuilder.setVersionHeader(YamlObj.DbiStream->VerHeader);
+ for (const auto &MI : YamlObj.DbiStream->ModInfos) {
+ ExitOnErr(DbiBuilder.addModuleInfo(MI.Obj, MI.Mod));
+ for (auto S : MI.SourceFiles)
+ ExitOnErr(DbiBuilder.addModuleSourceFile(MI.Mod, S));
+ }
}
auto Pdb = Builder.build();
diff --git a/llvm/tools/llvm-pdbdump/llvm-pdbdump.h b/llvm/tools/llvm-pdbdump/llvm-pdbdump.h
index 0a66515f4a0..510dd465080 100644
--- a/llvm/tools/llvm-pdbdump/llvm-pdbdump.h
+++ b/llvm/tools/llvm-pdbdump/llvm-pdbdump.h
@@ -62,6 +62,8 @@ 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::opt<bool> DbiModuleInfo;
+extern llvm::cl::opt<bool> DbiModuleSourceFileInfo;
extern llvm::cl::list<std::string> InputFilename;
}
}
OpenPOWER on IntegriCloud