static void dumpNamedStream(ScopedPrinter &P, PDBFile &File, StringRef Stream) { InfoStream &IS = File.getPDBInfoStream(); uint32_t NameStreamIndex = IS.getNamedStreamIndex(Stream); if (NameStreamIndex != 0) { std::string Name("Stream '"); Name += Stream; Name += "'"; DictScope D(P, Name); P.printNumber("Index", NameStreamIndex); MappedBlockStream NameStream(NameStreamIndex, File); StreamReader Reader(NameStream); NameHashTable NameTable; NameTable.load(Reader); P.printHex("Signature", NameTable.getSignature()); P.printNumber("Version", NameTable.getHashVersion()); P.printNumber("Name Count", NameTable.getNameCount()); ListScope L(P, "Names"); for (uint32_t ID : NameTable.name_ids()) { StringRef Str = NameTable.getStringForID(ID); if (!Str.empty()) P.printString(Str); } } }
Error LLVMOutputStyle::dumpNamedStream() { if (opts::raw::DumpStreamDataName.empty()) return Error::success(); auto IS = File.getPDBInfoStream(); if (!IS) return IS.takeError(); uint32_t NameStreamIndex = IS->getNamedStreamIndex(opts::raw::DumpStreamDataName); if (NameStreamIndex == 0 || NameStreamIndex >= File.getNumStreams()) return make_error<RawError>(raw_error_code::no_stream); if (NameStreamIndex != 0) { std::string Name("Stream '"); Name += opts::raw::DumpStreamDataName; Name += "'"; DictScope D(P, Name); P.printNumber("Index", NameStreamIndex); auto NameStream = MappedBlockStream::createIndexedStream(NameStreamIndex, File); if (!NameStream) return NameStream.takeError(); codeview::StreamReader Reader(**NameStream); NameHashTable NameTable; if (auto EC = NameTable.load(Reader)) return EC; P.printHex("Signature", NameTable.getSignature()); P.printNumber("Version", NameTable.getHashVersion()); P.printNumber("Name Count", NameTable.getNameCount()); ListScope L(P, "Names"); for (uint32_t ID : NameTable.name_ids()) { StringRef Str = NameTable.getStringForID(ID); if (!Str.empty()) P.printString(to_string(ID), Str); } } return Error::success(); }