diff options
| author | Zachary Turner <zturner@google.com> | 2016-07-22 15:46:37 +0000 |
|---|---|---|
| committer | Zachary Turner <zturner@google.com> | 2016-07-22 15:46:37 +0000 |
| commit | d218c261247edb8b44132fcff3588a67494effb6 (patch) | |
| tree | a0f8928f13397f9e1491638ca3a040241e96f4d1 /llvm/tools/llvm-pdbdump | |
| parent | b772151a17a508355ad46db63d13da1dbec32b09 (diff) | |
| download | bcm5719-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.cpp | 7 | ||||
| -rw-r--r-- | llvm/tools/llvm-pdbdump/PdbYaml.h | 14 | ||||
| -rw-r--r-- | llvm/tools/llvm-pdbdump/YAMLOutputStyle.cpp | 14 | ||||
| -rw-r--r-- | llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp | 15 | ||||
| -rw-r--r-- | llvm/tools/llvm-pdbdump/llvm-pdbdump.h | 2 |
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; } } |

