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(); }