1 //===- WasmTraits.h - DenseMap traits for the Wasm structures ---*- 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 // This file provides llvm::DenseMapInfo traits for the Wasm structures. 10 // 11 //===----------------------------------------------------------------------===// 12 13 #ifndef LLVM_BINARYFORMAT_WASMTRAITS_H 14 #define LLVM_BINARYFORMAT_WASMTRAITS_H 15 16 #include "llvm/ADT/Hashing.h" 17 #include "llvm/BinaryFormat/Wasm.h" 18 19 namespace llvm { 20 21 template <typename T> struct DenseMapInfo; 22 23 // Traits for using WasmSignature in a DenseMap. 24 template <> struct DenseMapInfo<wasm::WasmSignature> { 25 static wasm::WasmSignature getEmptyKey() { 26 wasm::WasmSignature Sig; 27 Sig.State = wasm::WasmSignature::Empty; 28 return Sig; 29 } 30 static wasm::WasmSignature getTombstoneKey() { 31 wasm::WasmSignature Sig; 32 Sig.State = wasm::WasmSignature::Tombstone; 33 return Sig; 34 } 35 static unsigned getHashValue(const wasm::WasmSignature &Sig) { 36 uintptr_t H = hash_value(Sig.State); 37 for (auto Ret : Sig.Returns) 38 H = hash_combine(H, Ret); 39 for (auto Param : Sig.Params) 40 H = hash_combine(H, Param); 41 return H; 42 } 43 static bool isEqual(const wasm::WasmSignature &LHS, 44 const wasm::WasmSignature &RHS) { 45 return LHS == RHS; 46 } 47 }; 48 49 // Traits for using WasmGlobalType in a DenseMap 50 template <> struct DenseMapInfo<wasm::WasmGlobalType> { 51 static wasm::WasmGlobalType getEmptyKey() { 52 return wasm::WasmGlobalType{1, true}; 53 } 54 static wasm::WasmGlobalType getTombstoneKey() { 55 return wasm::WasmGlobalType{2, true}; 56 } 57 static unsigned getHashValue(const wasm::WasmGlobalType &GlobalType) { 58 return hash_combine(GlobalType.Type, GlobalType.Mutable); 59 } 60 static bool isEqual(const wasm::WasmGlobalType &LHS, 61 const wasm::WasmGlobalType &RHS) { 62 return LHS == RHS; 63 } 64 }; 65 66 // Traits for using WasmLimits in a DenseMap 67 template <> struct DenseMapInfo<wasm::WasmLimits> { 68 static wasm::WasmLimits getEmptyKey() { 69 return wasm::WasmLimits{0xff, 0xff, 0xff}; 70 } 71 static wasm::WasmLimits getTombstoneKey() { 72 return wasm::WasmLimits{0xee, 0xee, 0xee}; 73 } 74 static unsigned getHashValue(const wasm::WasmLimits &Limits) { 75 unsigned Hash = hash_value(Limits.Flags); 76 Hash = hash_combine(Hash, Limits.Minimum); 77 if (Limits.Flags & llvm::wasm::WASM_LIMITS_FLAG_HAS_MAX) { 78 Hash = hash_combine(Hash, Limits.Maximum); 79 } 80 return Hash; 81 } 82 static bool isEqual(const wasm::WasmLimits &LHS, 83 const wasm::WasmLimits &RHS) { 84 return LHS == RHS; 85 } 86 }; 87 88 // Traits for using WasmTableType in a DenseMap 89 template <> struct DenseMapInfo<wasm::WasmTableType> { 90 static wasm::WasmTableType getEmptyKey() { 91 return wasm::WasmTableType{0, 92 DenseMapInfo<wasm::WasmLimits>::getEmptyKey()}; 93 } 94 static wasm::WasmTableType getTombstoneKey() { 95 return wasm::WasmTableType{ 96 1, DenseMapInfo<wasm::WasmLimits>::getTombstoneKey()}; 97 } 98 static unsigned getHashValue(const wasm::WasmTableType &TableType) { 99 return hash_combine( 100 TableType.ElemType, 101 DenseMapInfo<wasm::WasmLimits>::getHashValue(TableType.Limits)); 102 } 103 static bool isEqual(const wasm::WasmTableType &LHS, 104 const wasm::WasmTableType &RHS) { 105 return LHS == RHS; 106 } 107 }; 108 109 } // end namespace llvm 110 111 #endif // LLVM_BINARYFORMAT_WASMTRAITS_H 112