1 //===- TpiHashing.h ---------------------------------------------*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #ifndef LLVM_DEBUGINFO_PDB_TPIHASHING_H 10 #define LLVM_DEBUGINFO_PDB_TPIHASHING_H 11 12 #include "llvm/DebugInfo/CodeView/TypeRecord.h" 13 #include "llvm/Support/Error.h" 14 15 namespace llvm { 16 namespace pdb { 17 18 Expected<uint32_t> hashTypeRecord(const llvm::codeview::CVType &Type); 19 20 struct TagRecordHash { 21 explicit TagRecordHash(codeview::ClassRecord CR, uint32_t Full, 22 uint32_t Forward) 23 : FullRecordHash(Full), ForwardDeclHash(Forward), Class(std::move(CR)) { 24 State = 0; 25 } 26 27 explicit TagRecordHash(codeview::EnumRecord ER, uint32_t Full, 28 uint32_t Forward) 29 : FullRecordHash(Full), ForwardDeclHash(Forward), Enum(std::move(ER)) { 30 State = 1; 31 } 32 33 explicit TagRecordHash(codeview::UnionRecord UR, uint32_t Full, 34 uint32_t Forward) 35 : FullRecordHash(Full), ForwardDeclHash(Forward), Union(std::move(UR)) { 36 State = 2; 37 } 38 39 uint32_t FullRecordHash; 40 uint32_t ForwardDeclHash; 41 42 codeview::TagRecord &getRecord() { 43 switch (State) { 44 case 0: 45 return Class; 46 case 1: 47 return Enum; 48 case 2: 49 return Union; 50 } 51 llvm_unreachable("unreachable!"); 52 } 53 54 private: 55 union { 56 codeview::ClassRecord Class; 57 codeview::EnumRecord Enum; 58 codeview::UnionRecord Union; 59 }; 60 61 uint8_t State = 0; 62 }; 63 64 /// Given a CVType referring to a class, structure, union, or enum, compute 65 /// the hash of its forward decl and full decl. 66 Expected<TagRecordHash> hashTagRecord(const codeview::CVType &Type); 67 68 } // end namespace pdb 69 } // end namespace llvm 70 71 #endif // LLVM_DEBUGINFO_PDB_TPIHASHING_H 72