Expected<uint32_t> llvm::pdb::hashTypeRecord(const CVType &Rec) { switch (Rec.kind()) { case LF_CLASS: case LF_STRUCTURE: case LF_INTERFACE: return getHashForUdt<ClassRecord>(Rec); case LF_UNION: return getHashForUdt<UnionRecord>(Rec); case LF_ENUM: return getHashForUdt<EnumRecord>(Rec); case LF_UDT_SRC_LINE: return getSourceLineHash<UdtSourceLineRecord>(Rec); case LF_UDT_MOD_SRC_LINE: return getSourceLineHash<UdtModSourceLineRecord>(Rec); default: break; } // Run CRC32 over the bytes. This corresponds to `hashBufv8`. JamCRC JC(/*Init=*/0U); ArrayRef<char> Bytes(reinterpret_cast<const char *>(Rec.data().data()), Rec.data().size()); JC.update(Bytes); return JC.getCRC(); }
static Expected<uint32_t> getHashForUdt(const CVType &Rec) { T Deserialized; if (auto E = TypeDeserializer::deserializeAs(const_cast<CVType &>(Rec), Deserialized)) return std::move(E); return getHashForUdt(Deserialized, Rec.data()); }
static ArrayRef<uint8_t> bytes(const CVType &Item) { return Item.data(); }