Home | History | Annotate | Line # | Download | only in Native
      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_NATIVE_TPIHASHING_H
     10 #define LLVM_DEBUGINFO_PDB_NATIVE_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_NATIVE_TPIHASHING_H
     72