diff options
author | Zachary Turner <zturner@google.com> | 2016-06-08 17:26:39 +0000 |
---|---|---|
committer | Zachary Turner <zturner@google.com> | 2016-06-08 17:26:39 +0000 |
commit | a1657a9e64c1e8df34e32ca69fac918a7d28c60a (patch) | |
tree | 74993d26964f0f2f28bed1a30e85b19401a2f34e /llvm/tools/llvm-pdbdump/LLVMOutputStyle.cpp | |
parent | ced0853b468dadcf50ad5dae68017e3cd9c86bda (diff) | |
download | bcm5719-llvm-a1657a9e64c1e8df34e32ca69fac918a7d28c60a.tar.gz bcm5719-llvm-a1657a9e64c1e8df34e32ca69fac918a7d28c60a.zip |
[pdb] Handle stream index errors better.
Reviewed By: ruiu
Differential Revision: http://reviews.llvm.org/D21128
llvm-svn: 272172
Diffstat (limited to 'llvm/tools/llvm-pdbdump/LLVMOutputStyle.cpp')
-rw-r--r-- | llvm/tools/llvm-pdbdump/LLVMOutputStyle.cpp | 263 |
1 files changed, 133 insertions, 130 deletions
diff --git a/llvm/tools/llvm-pdbdump/LLVMOutputStyle.cpp b/llvm/tools/llvm-pdbdump/LLVMOutputStyle.cpp index 20d08f5c8ff..4df324f3444 100644 --- a/llvm/tools/llvm-pdbdump/LLVMOutputStyle.cpp +++ b/llvm/tools/llvm-pdbdump/LLVMOutputStyle.cpp @@ -67,33 +67,32 @@ Error LLVMOutputStyle::dumpStreamSummary() { if (!opts::DumpStreamSummary) return Error::success(); - auto DbiS = File.getPDBDbiStream(); - if (auto EC = DbiS.takeError()) - return EC; - auto TpiS = File.getPDBTpiStream(); - if (auto EC = TpiS.takeError()) - return EC; - auto IpiS = File.getPDBIpiStream(); - if (auto EC = IpiS.takeError()) - return EC; - auto InfoS = File.getPDBInfoStream(); - if (auto EC = InfoS.takeError()) - return EC; - DbiStream &DS = DbiS.get(); - TpiStream &TS = TpiS.get(); - TpiStream &TIS = IpiS.get(); - InfoStream &IS = InfoS.get(); + auto Dbi = File.getPDBDbiStream(); + if (!Dbi) + return Dbi.takeError(); + + auto Tpi = File.getPDBTpiStream(); + if (!Tpi) + return Tpi.takeError(); + + auto Ipi = File.getPDBIpiStream(); + if (!Ipi) + return Ipi.takeError(); + + auto Info = File.getPDBInfoStream(); + if (!Info) + return Info.takeError(); ListScope L(P, "Streams"); uint32_t StreamCount = File.getNumStreams(); std::unordered_map<uint16_t, const ModuleInfoEx *> ModStreams; std::unordered_map<uint16_t, std::string> NamedStreams; - for (auto &ModI : DS.modules()) { + for (auto &ModI : Dbi->modules()) { uint16_t SN = ModI.Info.getModuleStreamIndex(); ModStreams[SN] = &ModI; } - for (auto &NSE : IS.named_streams()) { + for (auto &NSE : Info->named_streams()) { NamedStreams[NSE.second] = NSE.first(); } @@ -111,41 +110,42 @@ Error LLVMOutputStyle::dumpStreamSummary() { Value = "TPI Stream"; else if (StreamIdx == StreamIPI) Value = "IPI Stream"; - else if (StreamIdx == DS.getGlobalSymbolStreamIndex()) + else if (StreamIdx == Dbi->getGlobalSymbolStreamIndex()) Value = "Global Symbol Hash"; - else if (StreamIdx == DS.getPublicSymbolStreamIndex()) + else if (StreamIdx == Dbi->getPublicSymbolStreamIndex()) Value = "Public Symbol Hash"; - else if (StreamIdx == DS.getSymRecordStreamIndex()) + else if (StreamIdx == Dbi->getSymRecordStreamIndex()) Value = "Public Symbol Records"; - else if (StreamIdx == TS.getTypeHashStreamIndex()) + else if (StreamIdx == Tpi->getTypeHashStreamIndex()) Value = "TPI Hash"; - else if (StreamIdx == TS.getTypeHashStreamAuxIndex()) + else if (StreamIdx == Tpi->getTypeHashStreamAuxIndex()) Value = "TPI Aux Hash"; - else if (StreamIdx == TIS.getTypeHashStreamIndex()) + else if (StreamIdx == Ipi->getTypeHashStreamIndex()) Value = "IPI Hash"; - else if (StreamIdx == TIS.getTypeHashStreamAuxIndex()) + else if (StreamIdx == Ipi->getTypeHashStreamAuxIndex()) Value = "IPI Aux Hash"; - else if (StreamIdx == DS.getDebugStreamIndex(DbgHeaderType::Exception)) + else if (StreamIdx == Dbi->getDebugStreamIndex(DbgHeaderType::Exception)) Value = "Exception Data"; - else if (StreamIdx == DS.getDebugStreamIndex(DbgHeaderType::Fixup)) + else if (StreamIdx == Dbi->getDebugStreamIndex(DbgHeaderType::Fixup)) Value = "Fixup Data"; - else if (StreamIdx == DS.getDebugStreamIndex(DbgHeaderType::FPO)) + else if (StreamIdx == Dbi->getDebugStreamIndex(DbgHeaderType::FPO)) Value = "FPO Data"; - else if (StreamIdx == DS.getDebugStreamIndex(DbgHeaderType::NewFPO)) + else if (StreamIdx == Dbi->getDebugStreamIndex(DbgHeaderType::NewFPO)) Value = "New FPO Data"; - else if (StreamIdx == DS.getDebugStreamIndex(DbgHeaderType::OmapFromSrc)) + else if (StreamIdx == Dbi->getDebugStreamIndex(DbgHeaderType::OmapFromSrc)) Value = "Omap From Source Data"; - else if (StreamIdx == DS.getDebugStreamIndex(DbgHeaderType::OmapToSrc)) + else if (StreamIdx == Dbi->getDebugStreamIndex(DbgHeaderType::OmapToSrc)) Value = "Omap To Source Data"; - else if (StreamIdx == DS.getDebugStreamIndex(DbgHeaderType::Pdata)) + else if (StreamIdx == Dbi->getDebugStreamIndex(DbgHeaderType::Pdata)) Value = "Pdata"; - else if (StreamIdx == DS.getDebugStreamIndex(DbgHeaderType::SectionHdr)) + else if (StreamIdx == Dbi->getDebugStreamIndex(DbgHeaderType::SectionHdr)) Value = "Section Header Data"; - else if (StreamIdx == DS.getDebugStreamIndex(DbgHeaderType::SectionHdrOrig)) + else if (StreamIdx == + Dbi->getDebugStreamIndex(DbgHeaderType::SectionHdrOrig)) Value = "Section Header Original Data"; - else if (StreamIdx == DS.getDebugStreamIndex(DbgHeaderType::TokenRidMap)) + else if (StreamIdx == Dbi->getDebugStreamIndex(DbgHeaderType::TokenRidMap)) Value = "Token Rid Data"; - else if (StreamIdx == DS.getDebugStreamIndex(DbgHeaderType::Xdata)) + else if (StreamIdx == Dbi->getDebugStreamIndex(DbgHeaderType::Xdata)) Value = "Xdata"; else { auto ModIter = ModStreams.find(StreamIdx); @@ -197,9 +197,10 @@ Error LLVMOutputStyle::dumpStreamData() { if (DumpStreamNum >= StreamCount) return make_error<RawError>(raw_error_code::no_stream); - MappedBlockStream S(llvm::make_unique<IndexedStreamData>(DumpStreamNum, File), - File); - codeview::StreamReader R(S); + auto S = MappedBlockStream::createIndexedStream(DumpStreamNum, File); + if (!S) + return S.takeError(); + codeview::StreamReader R(**S); while (R.bytesRemaining() > 0) { ArrayRef<uint8_t> Data; uint32_t BytesToReadInBlock = std::min( @@ -216,17 +217,15 @@ Error LLVMOutputStyle::dumpStreamData() { Error LLVMOutputStyle::dumpInfoStream() { if (!opts::DumpHeaders) return Error::success(); - auto InfoS = File.getPDBInfoStream(); - if (auto EC = InfoS.takeError()) - return EC; - - InfoStream &IS = InfoS.get(); + auto IS = File.getPDBInfoStream(); + if (!IS) + return IS.takeError(); DictScope D(P, "PDB Stream"); - P.printNumber("Version", IS.getVersion()); - P.printHex("Signature", IS.getSignature()); - P.printNumber("Age", IS.getAge()); - P.printObject("Guid", IS.getGuid()); + P.printNumber("Version", IS->getVersion()); + P.printHex("Signature", IS->getSignature()); + P.printNumber("Age", IS->getAge()); + P.printObject("Guid", IS->getGuid()); return Error::success(); } @@ -234,12 +233,11 @@ Error LLVMOutputStyle::dumpNamedStream() { if (opts::DumpStreamDataName.empty()) return Error::success(); - auto InfoS = File.getPDBInfoStream(); - if (auto EC = InfoS.takeError()) - return EC; - InfoStream &IS = InfoS.get(); + auto IS = File.getPDBInfoStream(); + if (!IS) + return IS.takeError(); - uint32_t NameStreamIndex = IS.getNamedStreamIndex(opts::DumpStreamDataName); + uint32_t NameStreamIndex = IS->getNamedStreamIndex(opts::DumpStreamDataName); if (NameStreamIndex == 0 || NameStreamIndex >= File.getNumStreams()) return make_error<RawError>(raw_error_code::no_stream); @@ -250,9 +248,11 @@ Error LLVMOutputStyle::dumpNamedStream() { DictScope D(P, Name); P.printNumber("Index", NameStreamIndex); - MappedBlockStream NameStream( - llvm::make_unique<IndexedStreamData>(NameStreamIndex, File), File); - codeview::StreamReader Reader(NameStream); + auto NameStream = + MappedBlockStream::createIndexedStream(NameStreamIndex, File); + if (!NameStream) + return NameStream.takeError(); + codeview::StreamReader Reader(**NameStream); NameHashTable NameTable; if (auto EC = NameTable.load(Reader)) @@ -311,22 +311,21 @@ Error LLVMOutputStyle::dumpTpiStream(uint32_t StreamIdx) { if (!DumpRecordBytes && !DumpRecords && !opts::DumpModuleSyms) return Error::success(); - auto TpiS = (StreamIdx == StreamTPI) ? File.getPDBTpiStream() - : File.getPDBIpiStream(); - if (auto EC = TpiS.takeError()) - return EC; - TpiStream &Tpi = TpiS.get(); + auto Tpi = (StreamIdx == StreamTPI) ? File.getPDBTpiStream() + : File.getPDBIpiStream(); + if (!Tpi) + return Tpi.takeError(); if (DumpRecords || DumpRecordBytes) { DictScope D(P, Label); - P.printNumber(VerLabel, Tpi.getTpiVersion()); - P.printNumber("Record count", Tpi.NumTypeRecords()); + P.printNumber(VerLabel, Tpi->getTpiVersion()); + P.printNumber("Record count", Tpi->NumTypeRecords()); ListScope L(P, "Records"); bool HadError = false; - for (auto &Type : Tpi.types(&HadError)) { + for (auto &Type : Tpi->types(&HadError)) { DictScope DD(P, ""); if (DumpRecords) @@ -335,7 +334,7 @@ Error LLVMOutputStyle::dumpTpiStream(uint32_t StreamIdx) { if (DumpRecordBytes) P.printBinaryBlock("Bytes", Type.Data); } - dumpTpiHash(P, Tpi); + dumpTpiHash(P, *Tpi); if (HadError) return make_error<RawError>(raw_error_code::corrupt_file, "TPI stream contained corrupt record"); @@ -348,11 +347,11 @@ Error LLVMOutputStyle::dumpTpiStream(uint32_t StreamIdx) { TD.setPrinter(nullptr); bool HadError = false; - for (auto &Type : Tpi.types(&HadError)) + for (auto &Type : Tpi->types(&HadError)) TD.dump(Type); TD.setPrinter(OldP); - dumpTpiHash(P, Tpi); + dumpTpiHash(P, *Tpi); if (HadError) return make_error<RawError>(raw_error_code::corrupt_file, "TPI stream contained corrupt record"); @@ -367,35 +366,34 @@ Error LLVMOutputStyle::dumpDbiStream() { if (!opts::DumpHeaders && !DumpModules) return Error::success(); - auto DbiS = File.getPDBDbiStream(); - if (auto EC = DbiS.takeError()) - return EC; - DbiStream &DS = DbiS.get(); + auto DS = File.getPDBDbiStream(); + if (!DS) + return DS.takeError(); DictScope D(P, "DBI Stream"); - P.printNumber("Dbi Version", DS.getDbiVersion()); - P.printNumber("Age", DS.getAge()); - P.printBoolean("Incremental Linking", DS.isIncrementallyLinked()); - P.printBoolean("Has CTypes", DS.hasCTypes()); - P.printBoolean("Is Stripped", DS.isStripped()); - P.printObject("Machine Type", DS.getMachineType()); - P.printNumber("Symbol Record Stream Index", DS.getSymRecordStreamIndex()); - P.printNumber("Public Symbol Stream Index", DS.getPublicSymbolStreamIndex()); - P.printNumber("Global Symbol Stream Index", DS.getGlobalSymbolStreamIndex()); - - uint16_t Major = DS.getBuildMajorVersion(); - uint16_t Minor = DS.getBuildMinorVersion(); + P.printNumber("Dbi Version", DS->getDbiVersion()); + P.printNumber("Age", DS->getAge()); + P.printBoolean("Incremental Linking", DS->isIncrementallyLinked()); + P.printBoolean("Has CTypes", DS->hasCTypes()); + P.printBoolean("Is Stripped", DS->isStripped()); + P.printObject("Machine Type", DS->getMachineType()); + P.printNumber("Symbol Record Stream Index", DS->getSymRecordStreamIndex()); + P.printNumber("Public Symbol Stream Index", DS->getPublicSymbolStreamIndex()); + P.printNumber("Global Symbol Stream Index", DS->getGlobalSymbolStreamIndex()); + + uint16_t Major = DS->getBuildMajorVersion(); + uint16_t Minor = DS->getBuildMinorVersion(); P.printVersion("Toolchain Version", Major, Minor); std::string DllName; raw_string_ostream DllStream(DllName); DllStream << "mspdb" << Major << Minor << ".dll version"; DllStream.flush(); - P.printVersion(DllName, Major, Minor, DS.getPdbDllVersion()); + P.printVersion(DllName, Major, Minor, DS->getPdbDllVersion()); if (DumpModules) { ListScope L(P, "Modules"); - for (auto &Modi : DS.modules()) { + for (auto &Modi : DS->modules()) { DictScope DD(P); P.printString("Name", Modi.Info.getModuleName().str()); P.printNumber("Debug Stream Index", Modi.Info.getModuleStreamIndex()); @@ -421,7 +419,11 @@ Error LLVMOutputStyle::dumpDbiStream() { bool ShouldDumpSymbols = (opts::DumpModuleSyms || opts::DumpSymRecordBytes); if (HasModuleDI && (ShouldDumpSymbols || opts::DumpLineInfo)) { - ModStream ModS(File, Modi.Info); + auto ModStreamData = MappedBlockStream::createIndexedStream( + Modi.Info.getModuleStreamIndex(), File); + if (!ModStreamData) + return ModStreamData.takeError(); + ModStream ModS(Modi.Info, std::move(*ModStreamData)); if (auto EC = ModS.reload()) return EC; @@ -513,18 +515,17 @@ Error LLVMOutputStyle::dumpDbiStream() { private: Expected<StringRef> getFileNameForOffset(uint32_t Offset) { - auto StringT = F.getStringTable(); - if (auto EC = StringT.takeError()) - return std::move(EC); - NameHashTable &ST = StringT.get(); - return ST.getStringForID(Offset); + auto ST = F.getStringTable(); + if (!ST) + return ST.takeError(); + + return ST->getStringForID(Offset); } Expected<StringRef> getFileNameForOffset2(uint32_t Offset) { - auto DbiS = F.getPDBDbiStream(); - if (auto EC = DbiS.takeError()) - return std::move(EC); - auto &DS = DbiS.get(); - return DS.getFileNameForIndex(Offset); + auto DS = F.getPDBDbiStream(); + if (!DS) + return DS.takeError(); + return DS->getFileNameForIndex(Offset); } ScopedPrinter &P; PDBFile &F; @@ -546,10 +547,10 @@ Error LLVMOutputStyle::dumpSectionContribs() { if (!opts::DumpSectionContribs) return Error::success(); - auto DbiS = File.getPDBDbiStream(); - if (auto EC = DbiS.takeError()) - return EC; - DbiStream &DS = DbiS.get(); + auto Dbi = File.getPDBDbiStream(); + if (!Dbi) + return Dbi.takeError(); + ListScope L(P, "Section Contributions"); class Visitor : public ISectionContribVisitor { public: @@ -584,8 +585,8 @@ Error LLVMOutputStyle::dumpSectionContribs() { ScopedPrinter &P; DbiStream &DS; }; - Visitor V(P, DS); - DS.visitSectionContributions(V); + Visitor V(P, *Dbi); + Dbi->visitSectionContributions(V); return Error::success(); } @@ -593,12 +594,12 @@ Error LLVMOutputStyle::dumpSectionMap() { if (!opts::DumpSectionMap) return Error::success(); - auto DbiS = File.getPDBDbiStream(); - if (auto EC = DbiS.takeError()) - return EC; - DbiStream &DS = DbiS.get(); + auto Dbi = File.getPDBDbiStream(); + if (!Dbi) + return Dbi.takeError(); + ListScope L(P, "Section Map"); - for (auto &M : DS.getSectionMap()) { + for (auto &M : Dbi->getSectionMap()) { DictScope D(P, "Entry"); P.printFlags("Flags", M.Flags, getOMFSegMapDescFlagNames()); P.printNumber("Flags", M.Flags); @@ -619,23 +620,27 @@ Error LLVMOutputStyle::dumpPublicsStream() { return Error::success(); DictScope D(P, "Publics Stream"); - auto PublicsS = File.getPDBPublicsStream(); - if (auto EC = PublicsS.takeError()) - return EC; - PublicsStream &Publics = PublicsS.get(); - P.printNumber("Stream number", Publics.getStreamNum()); - P.printNumber("SymHash", Publics.getSymHash()); - P.printNumber("AddrMap", Publics.getAddrMap()); - P.printNumber("Number of buckets", Publics.getNumBuckets()); - P.printList("Hash Buckets", Publics.getHashBuckets()); - P.printList("Address Map", Publics.getAddressMap()); - P.printList("Thunk Map", Publics.getThunkMap()); - P.printList("Section Offsets", Publics.getSectionOffsets(), + auto Publics = File.getPDBPublicsStream(); + if (!Publics) + return Publics.takeError(); + + auto Dbi = File.getPDBDbiStream(); + if (!Dbi) + return Dbi.takeError(); + + P.printNumber("Stream number", Dbi->getPublicSymbolStreamIndex()); + P.printNumber("SymHash", Publics->getSymHash()); + P.printNumber("AddrMap", Publics->getAddrMap()); + P.printNumber("Number of buckets", Publics->getNumBuckets()); + P.printList("Hash Buckets", Publics->getHashBuckets()); + P.printList("Address Map", Publics->getAddressMap()); + P.printList("Thunk Map", Publics->getThunkMap()); + P.printList("Section Offsets", Publics->getSectionOffsets(), printSectionOffset); ListScope L(P, "Symbols"); codeview::CVSymbolDumper SD(P, TD, nullptr, false); bool HadError = false; - for (auto S : Publics.getSymbols(&HadError)) { + for (auto S : Publics->getSymbols(&HadError)) { DictScope DD(P, ""); SD.dump(S); @@ -654,13 +659,12 @@ Error LLVMOutputStyle::dumpSectionHeaders() { if (!opts::DumpSectionHeaders) return Error::success(); - auto DbiS = File.getPDBDbiStream(); - if (auto EC = DbiS.takeError()) - return EC; - DbiStream &DS = DbiS.get(); + auto Dbi = File.getPDBDbiStream(); + if (!Dbi) + return Dbi.takeError(); ListScope D(P, "Section Headers"); - for (const object::coff_section &Section : DS.getSectionHeaders()) { + for (const object::coff_section &Section : Dbi->getSectionHeaders()) { DictScope DD(P, ""); // If a name is 8 characters long, there is no NUL character at end. @@ -684,13 +688,12 @@ Error LLVMOutputStyle::dumpFpoStream() { if (!opts::DumpFpo) return Error::success(); - auto DbiS = File.getPDBDbiStream(); - if (auto EC = DbiS.takeError()) - return EC; - DbiStream &DS = DbiS.get(); + auto Dbi = File.getPDBDbiStream(); + if (!Dbi) + return Dbi.takeError(); ListScope D(P, "New FPO"); - for (const object::FpoData &Fpo : DS.getFpoRecords()) { + for (const object::FpoData &Fpo : Dbi->getFpoRecords()) { DictScope DD(P, ""); P.printNumber("Offset", Fpo.Offset); P.printNumber("Size", Fpo.Size); |