diff options
Diffstat (limited to 'llvm/tools')
| -rw-r--r-- | llvm/tools/llvm-pdbdump/PdbYaml.cpp | 93 | ||||
| -rw-r--r-- | llvm/tools/llvm-pdbdump/PdbYaml.h | 33 | ||||
| -rw-r--r-- | llvm/tools/llvm-pdbdump/YAMLOutputStyle.cpp | 27 | ||||
| -rw-r--r-- | llvm/tools/llvm-pdbdump/YAMLOutputStyle.h | 1 | ||||
| -rw-r--r-- | llvm/tools/llvm-pdbdump/llvm-pdbdump.cpp | 50 | ||||
| -rw-r--r-- | llvm/tools/llvm-pdbdump/llvm-pdbdump.h | 1 |
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; } } |

