Error DebugCrossModuleExportsSubsectionRef::initialize( BinaryStreamReader Reader) { if (Reader.bytesRemaining() % sizeof(CrossModuleExport) != 0) return make_error<CodeViewError>( cv_error_code::corrupt_record, "Cross Scope Exports section is an invalid size!"); uint32_t Size = Reader.bytesRemaining() / sizeof(CrossModuleExport); return Reader.readArray(References, Size); }
static Error loadSectionContribs(FixedStreamArray<ContribType> &Output, BinaryStreamReader &Reader) { if (Reader.bytesRemaining() % sizeof(ContribType) != 0) return make_error<RawError>( raw_error_code::corrupt_file, "Invalid number of bytes of section contributions"); uint32_t Count = Reader.bytesRemaining() / sizeof(ContribType); if (auto EC = Reader.readArray(Output, Count)) return EC; return Error::success(); }
Error CVTypeVisitor::visitFieldListMemberStream(BinaryStreamReader Reader) { FieldListDeserializer Deserializer(Reader); TypeVisitorCallbackPipeline Pipeline; Pipeline.addCallbackToPipeline(Deserializer); Pipeline.addCallbackToPipeline(Callbacks); TypeLeafKind Leaf; while (!Reader.empty()) { if (auto EC = Reader.readEnum(Leaf)) return EC; CVMemberRecord Record; Record.Kind = Leaf; if (auto EC = ::visitMemberRecord(Record, Pipeline)) return EC; } return Error::success(); }
Error llvm::pdb::readSparseBitVector(BinaryStreamReader &Stream, SparseBitVector<> &V) { uint32_t NumWords; if (auto EC = Stream.readInteger(NumWords)) return joinErrors( std::move(EC), make_error<RawError>(raw_error_code::corrupt_file, "Expected hash table number of words")); for (uint32_t I = 0; I != NumWords; ++I) { uint32_t Word; if (auto EC = Stream.readInteger(Word)) return joinErrors(std::move(EC), make_error<RawError>(raw_error_code::corrupt_file, "Expected hash table word")); for (unsigned Idx = 0; Idx < 32; ++Idx) if (Word & (1U << Idx)) V.set((I * 32) + Idx); } return Error::success(); }
Error NamedStreamMap::load(BinaryStreamReader &Stream) { Mapping.clear(); FinalizedHashTable.clear(); FinalizedInfo.reset(); uint32_t StringBufferSize; if (auto EC = Stream.readInteger(StringBufferSize)) return joinErrors(std::move(EC), make_error<RawError>(raw_error_code::corrupt_file, "Expected string buffer size")); BinaryStreamRef StringsBuffer; if (auto EC = Stream.readStreamRef(StringsBuffer, StringBufferSize)) return EC; HashTable OffsetIndexMap; if (auto EC = OffsetIndexMap.load(Stream)) return EC; uint32_t NameOffset; uint32_t NameIndex; for (const auto &Entry : OffsetIndexMap) { std::tie(NameOffset, NameIndex) = Entry; // Compute the offset of the start of the string relative to the stream. BinaryStreamReader NameReader(StringsBuffer); NameReader.setOffset(NameOffset); // Pump out our c-string from the stream. StringRef Str; if (auto EC = NameReader.readCString(Str)) return joinErrors(std::move(EC), make_error<RawError>(raw_error_code::corrupt_file, "Expected name map name")); // Add this to a string-map from name to stream number. Mapping.insert({Str, NameIndex}); } return Error::success(); }
Error DebugSymbolRVASubsectionRef::initialize(BinaryStreamReader &Reader) { return Reader.readArray(RVAs, Reader.bytesRemaining() / sizeof(uint32_t)); }