1dda28197Spatrick //===-- CFBasicHash.h -------------------------------------------*- C++ -*-===// 2dda28197Spatrick // 3dda28197Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4dda28197Spatrick // See https://llvm.org/LICENSE.txt for license information. 5dda28197Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6dda28197Spatrick // 7dda28197Spatrick //===----------------------------------------------------------------------===// 8dda28197Spatrick 9dda28197Spatrick #ifndef LLDB_SOURCE_PLUGINS_LANGUAGE_OBJC_CFBASICHASH_H 10dda28197Spatrick #define LLDB_SOURCE_PLUGINS_LANGUAGE_OBJC_CFBASICHASH_H 11dda28197Spatrick 12dda28197Spatrick #include "lldb/Target/Process.h" 13dda28197Spatrick #include "lldb/Target/Target.h" 14dda28197Spatrick 15dda28197Spatrick namespace lldb_private { 16dda28197Spatrick 17dda28197Spatrick class CFBasicHash { 18dda28197Spatrick public: 19dda28197Spatrick enum class HashType { set = 0, dict }; 20dda28197Spatrick 21dda28197Spatrick CFBasicHash() = default; 22dda28197Spatrick ~CFBasicHash() = default; 23dda28197Spatrick 24dda28197Spatrick bool Update(lldb::addr_t addr, ExecutionContextRef exe_ctx_rf); 25dda28197Spatrick 26dda28197Spatrick bool IsValid() const; 27dda28197Spatrick IsMutable()28dda28197Spatrick bool IsMutable() const { return m_mutable; }; IsMultiVariant()29dda28197Spatrick bool IsMultiVariant() const { return m_multi; } GetType()30dda28197Spatrick HashType GetType() const { return m_type; } 31dda28197Spatrick 32dda28197Spatrick size_t GetCount() const; 33dda28197Spatrick lldb::addr_t GetKeyPointer() const; 34dda28197Spatrick lldb::addr_t GetValuePointer() const; 35dda28197Spatrick 36dda28197Spatrick private: 37dda28197Spatrick template <typename T> struct __CFBasicHash { 38dda28197Spatrick struct RuntimeBase { 39dda28197Spatrick T cfisa; 40dda28197Spatrick T cfinfoa; 41dda28197Spatrick } base; 42dda28197Spatrick 43dda28197Spatrick struct Bits { 44dda28197Spatrick uint16_t __reserved0; 45dda28197Spatrick uint16_t __reserved1 : 2; 46dda28197Spatrick uint16_t keys_offset : 1; 47dda28197Spatrick uint16_t counts_offset : 2; 48dda28197Spatrick uint16_t counts_width : 2; 49dda28197Spatrick uint16_t __reserved2 : 9; 50dda28197Spatrick uint32_t used_buckets; // number of used buckets 51dda28197Spatrick uint64_t deleted : 16; // number of elements deleted 52dda28197Spatrick uint64_t num_buckets_idx : 8; // index to number of buckets 53dda28197Spatrick uint64_t __reserved3 : 40; 54dda28197Spatrick uint64_t __reserved4; 55dda28197Spatrick } bits; 56dda28197Spatrick 57dda28197Spatrick T pointers[3]; 58dda28197Spatrick }; 59dda28197Spatrick template <typename T> bool UpdateFor(std::unique_ptr<__CFBasicHash<T>> &m_ht); 60dda28197Spatrick 61dda28197Spatrick size_t GetPointerCount() const; 62dda28197Spatrick 63dda28197Spatrick uint32_t m_ptr_size = UINT32_MAX; 64dda28197Spatrick lldb::ByteOrder m_byte_order = lldb::eByteOrderInvalid; 65dda28197Spatrick Address m_address = LLDB_INVALID_ADDRESS; 66dda28197Spatrick std::unique_ptr<__CFBasicHash<uint32_t>> m_ht_32 = nullptr; 67dda28197Spatrick std::unique_ptr<__CFBasicHash<uint64_t>> m_ht_64 = nullptr; 68dda28197Spatrick ExecutionContextRef m_exe_ctx_ref; 69dda28197Spatrick bool m_mutable = true; 70dda28197Spatrick bool m_multi = false; 71*f6aab3d8Srobert HashType m_type = HashType::set; 72dda28197Spatrick }; 73dda28197Spatrick 74dda28197Spatrick } // namespace lldb_private 75dda28197Spatrick 76dda28197Spatrick #endif // LLDB_SOURCE_PLUGINS_LANGUAGE_OBJC_CFBASICHASH_H 77