diff options
author | Zachary Turner <zturner@google.com> | 2018-10-26 00:17:31 +0000 |
---|---|---|
committer | Zachary Turner <zturner@google.com> | 2018-10-26 00:17:31 +0000 |
commit | ed2597e9090d56ce2e6247688f0411737a5f8eb6 (patch) | |
tree | 0520fc185f49acc4adbb95a2dde4d08db31fbca5 /llvm | |
parent | e2c5cbc1643f8324fa84c2a44918262cacbbe2c4 (diff) | |
download | bcm5719-llvm-ed2597e9090d56ce2e6247688f0411737a5f8eb6.tar.gz bcm5719-llvm-ed2597e9090d56ce2e6247688f0411737a5f8eb6.zip |
Dump public symbol records in pdb2yaml mode
llvm-svn: 345348
Diffstat (limited to 'llvm')
-rw-r--r-- | llvm/tools/llvm-pdbutil/PdbYaml.cpp | 6 | ||||
-rw-r--r-- | llvm/tools/llvm-pdbutil/PdbYaml.h | 6 | ||||
-rw-r--r-- | llvm/tools/llvm-pdbutil/YAMLOutputStyle.cpp | 42 | ||||
-rw-r--r-- | llvm/tools/llvm-pdbutil/YAMLOutputStyle.h | 1 | ||||
-rw-r--r-- | llvm/tools/llvm-pdbutil/llvm-pdbutil.cpp | 5 | ||||
-rw-r--r-- | llvm/tools/llvm-pdbutil/llvm-pdbutil.h | 1 |
6 files changed, 61 insertions, 0 deletions
diff --git a/llvm/tools/llvm-pdbutil/PdbYaml.cpp b/llvm/tools/llvm-pdbutil/PdbYaml.cpp index eb39708a27e..3ea33360831 100644 --- a/llvm/tools/llvm-pdbutil/PdbYaml.cpp +++ b/llvm/tools/llvm-pdbutil/PdbYaml.cpp @@ -110,6 +110,7 @@ void MappingTraits<PdbObject>::mapping(IO &IO, PdbObject &Obj) { IO.mapOptional("DbiStream", Obj.DbiStream); IO.mapOptional("TpiStream", Obj.TpiStream); IO.mapOptional("IpiStream", Obj.IpiStream); + IO.mapOptional("PublicsStream", Obj.PublicsStream); } void MappingTraits<MSFHeaders>::mapping(IO &IO, MSFHeaders &Obj) { @@ -163,6 +164,11 @@ void MappingTraits<PdbTpiStream>::mapping(IO &IO, IO.mapRequired("Records", Obj.Records); } +void MappingTraits<PdbPublicsStream>::mapping( + IO &IO, pdb::yaml::PdbPublicsStream &Obj) { + IO.mapRequired("Records", Obj.PubSyms); +} + void MappingTraits<NamedStreamMapping>::mapping(IO &IO, NamedStreamMapping &Obj) { IO.mapRequired("Name", Obj.StreamName); diff --git a/llvm/tools/llvm-pdbutil/PdbYaml.h b/llvm/tools/llvm-pdbutil/PdbYaml.h index 91e054490a5..97ba87266cc 100644 --- a/llvm/tools/llvm-pdbutil/PdbYaml.h +++ b/llvm/tools/llvm-pdbutil/PdbYaml.h @@ -92,6 +92,10 @@ struct PdbTpiStream { std::vector<CodeViewYAML::LeafRecord> Records; }; +struct PdbPublicsStream { + std::vector<CodeViewYAML::SymbolRecord> PubSyms; +}; + struct PdbObject { explicit PdbObject(BumpPtrAllocator &Allocator) : Allocator(Allocator) {} @@ -102,6 +106,7 @@ struct PdbObject { Optional<PdbDbiStream> DbiStream; Optional<PdbTpiStream> TpiStream; Optional<PdbTpiStream> IpiStream; + Optional<PdbPublicsStream> PublicsStream; Optional<std::vector<StringRef>> StringTable; @@ -118,6 +123,7 @@ LLVM_YAML_DECLARE_MAPPING_TRAITS(pdb::yaml::StreamBlockList) LLVM_YAML_DECLARE_MAPPING_TRAITS(pdb::yaml::PdbInfoStream) LLVM_YAML_DECLARE_MAPPING_TRAITS(pdb::yaml::PdbDbiStream) LLVM_YAML_DECLARE_MAPPING_TRAITS(pdb::yaml::PdbTpiStream) +LLVM_YAML_DECLARE_MAPPING_TRAITS(pdb::yaml::PdbPublicsStream) LLVM_YAML_DECLARE_MAPPING_TRAITS(pdb::yaml::NamedStreamMapping) LLVM_YAML_DECLARE_MAPPING_TRAITS(pdb::yaml::PdbModiStream) LLVM_YAML_DECLARE_MAPPING_TRAITS(pdb::yaml::PdbDbiModuleInfo) diff --git a/llvm/tools/llvm-pdbutil/YAMLOutputStyle.cpp b/llvm/tools/llvm-pdbutil/YAMLOutputStyle.cpp index 521e27fc089..62b5c428d41 100644 --- a/llvm/tools/llvm-pdbutil/YAMLOutputStyle.cpp +++ b/llvm/tools/llvm-pdbutil/YAMLOutputStyle.cpp @@ -18,10 +18,13 @@ #include "llvm/DebugInfo/CodeView/StringsAndChecksums.h" #include "llvm/DebugInfo/MSF/MappedBlockStream.h" #include "llvm/DebugInfo/PDB/Native/DbiStream.h" +#include "llvm/DebugInfo/PDB/Native/GlobalsStream.h" #include "llvm/DebugInfo/PDB/Native/InfoStream.h" #include "llvm/DebugInfo/PDB/Native/ModuleDebugStream.h" #include "llvm/DebugInfo/PDB/Native/PDBFile.h" +#include "llvm/DebugInfo/PDB/Native/PublicsStream.h" #include "llvm/DebugInfo/PDB/Native/RawConstants.h" +#include "llvm/DebugInfo/PDB/Native/SymbolStream.h" #include "llvm/DebugInfo/PDB/Native/TpiStream.h" using namespace llvm; @@ -68,6 +71,9 @@ Error YAMLOutputStyle::dump() { if (auto EC = dumpIpiStream()) return EC; + if (auto EC = dumpPublics()) + return EC; + flush(); return Error::success(); } @@ -326,6 +332,42 @@ Error YAMLOutputStyle::dumpIpiStream() { return Error::success(); } +Error YAMLOutputStyle::dumpPublics() { + if (!opts::pdb2yaml::PublicsStream) + return Error::success(); + + Obj.PublicsStream.emplace(); + auto ExpectedPublics = File.getPDBPublicsStream(); + if (!ExpectedPublics) { + llvm::consumeError(ExpectedPublics.takeError()); + return Error::success(); + } + + PublicsStream &Publics = *ExpectedPublics; + const GSIHashTable &PublicsTable = Publics.getPublicsTable(); + + auto ExpectedSyms = File.getPDBSymbolStream(); + if (!ExpectedSyms) { + llvm::consumeError(ExpectedSyms.takeError()); + return Error::success(); + } + + BinaryStreamRef SymStream = + ExpectedSyms->getSymbolArray().getUnderlyingStream(); + for (uint32_t PubSymOff : PublicsTable) { + Expected<CVSymbol> Sym = readSymbolFromStream(SymStream, PubSymOff); + if (!Sym) + return Sym.takeError(); + auto ES = CodeViewYAML::SymbolRecord::fromCodeViewSymbol(*Sym); + if (!ES) + return ES.takeError(); + + Obj.PublicsStream->PubSyms.push_back(*ES); + } + + return Error::success(); +} + void YAMLOutputStyle::flush() { Out << Obj; outs().flush(); diff --git a/llvm/tools/llvm-pdbutil/YAMLOutputStyle.h b/llvm/tools/llvm-pdbutil/YAMLOutputStyle.h index 3690e3529d4..a5ad3355d2a 100644 --- a/llvm/tools/llvm-pdbutil/YAMLOutputStyle.h +++ b/llvm/tools/llvm-pdbutil/YAMLOutputStyle.h @@ -35,6 +35,7 @@ private: Error dumpDbiStream(); Error dumpTpiStream(); Error dumpIpiStream(); + Error dumpPublics(); void flush(); diff --git a/llvm/tools/llvm-pdbutil/llvm-pdbutil.cpp b/llvm/tools/llvm-pdbutil/llvm-pdbutil.cpp index 34618f6b762..215bfbeb206 100644 --- a/llvm/tools/llvm-pdbutil/llvm-pdbutil.cpp +++ b/llvm/tools/llvm-pdbutil/llvm-pdbutil.cpp @@ -663,6 +663,10 @@ cl::opt<bool> IpiStream("ipi-stream", cl::desc("Dump the IPI Stream (Stream 5)"), cl::sub(PdbToYamlSubcommand), cl::init(false)); +cl::opt<bool> PublicsStream("publics-stream", + cl::desc("Dump the Publics Stream"), + cl::sub(PdbToYamlSubcommand), cl::init(false)); + // MODULE & FILE OPTIONS cl::opt<bool> DumpModules("modules", cl::desc("dump compiland information"), cl::cat(FileOptions), cl::sub(PdbToYamlSubcommand)); @@ -1495,6 +1499,7 @@ int main(int Argc, const char **Argv) { opts::pdb2yaml::DbiStream = true; opts::pdb2yaml::TpiStream = true; opts::pdb2yaml::IpiStream = true; + opts::pdb2yaml::PublicsStream = true; opts::pdb2yaml::DumpModules = true; opts::pdb2yaml::DumpModuleFiles = true; opts::pdb2yaml::DumpModuleSyms = true; diff --git a/llvm/tools/llvm-pdbutil/llvm-pdbutil.h b/llvm/tools/llvm-pdbutil/llvm-pdbutil.h index 1584dce52c5..a57cc51d7fd 100644 --- a/llvm/tools/llvm-pdbutil/llvm-pdbutil.h +++ b/llvm/tools/llvm-pdbutil/llvm-pdbutil.h @@ -192,6 +192,7 @@ extern llvm::cl::opt<bool> PdbStream; extern llvm::cl::opt<bool> DbiStream; extern llvm::cl::opt<bool> TpiStream; extern llvm::cl::opt<bool> IpiStream; +extern llvm::cl::opt<bool> PublicsStream; extern llvm::cl::list<std::string> InputFilename; extern llvm::cl::opt<bool> DumpModules; extern llvm::cl::opt<bool> DumpModuleFiles; |