static void dumpTpiHash(ScopedPrinter &P, TpiStream &Tpi) { if (!opts::raw::DumpTpiHash) return; DictScope DD(P, "Hash"); P.printNumber("Number of Hash Buckets", Tpi.NumHashBuckets()); P.printNumber("Hash Key Size", Tpi.getHashKeySize()); P.printList("Values", Tpi.getHashValues()); P.printList("Type Index Offsets", Tpi.getTypeIndexOffsets(), printTypeIndexOffset); P.printList("Hash Adjustments", Tpi.getHashAdjustments(), printTypeIndexOffset); }
static void dumpStreamBlocks(ScopedPrinter &P, PDBFile &File) { if (!opts::DumpStreamBlocks) return; ListScope L(P, "StreamBlocks"); uint32_t StreamCount = File.getNumStreams(); for (uint32_t StreamIdx = 0; StreamIdx < StreamCount; ++StreamIdx) { std::string Name("Stream "); Name += to_string(StreamIdx); auto StreamBlocks = File.getStreamBlockList(StreamIdx); P.printList(Name, StreamBlocks); } }
static void dumpFileHeaders(ScopedPrinter &P, PDBFile &File) { if (!opts::DumpHeaders) return; DictScope D(P, "FileHeaders"); P.printNumber("BlockSize", File.getBlockSize()); P.printNumber("Unknown0", File.getUnknown0()); P.printNumber("NumBlocks", File.getBlockCount()); P.printNumber("NumDirectoryBytes", File.getNumDirectoryBytes()); P.printNumber("Unknown1", File.getUnknown1()); P.printNumber("BlockMapAddr", File.getBlockMapIndex()); P.printNumber("NumDirectoryBlocks", File.getNumDirectoryBlocks()); P.printNumber("BlockMapOffset", File.getBlockMapOffset()); // The directory is not contiguous. Instead, the block map contains a // contiguous list of block numbers whose contents, when concatenated in // order, make up the directory. P.printList("DirectoryBlocks", File.getDirectoryBlockArray()); P.printNumber("NumStreams", File.getNumStreams()); }