15ffd83dbSDimitry Andric //===-- CFBasicHash.h -------------------------------------------*- C++ -*-===// 25ffd83dbSDimitry Andric // 35ffd83dbSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 45ffd83dbSDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 55ffd83dbSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 65ffd83dbSDimitry Andric // 75ffd83dbSDimitry Andric //===----------------------------------------------------------------------===// 85ffd83dbSDimitry Andric 95ffd83dbSDimitry Andric #ifndef LLDB_SOURCE_PLUGINS_LANGUAGE_OBJC_CFBASICHASH_H 105ffd83dbSDimitry Andric #define LLDB_SOURCE_PLUGINS_LANGUAGE_OBJC_CFBASICHASH_H 115ffd83dbSDimitry Andric 125ffd83dbSDimitry Andric #include "lldb/Target/Process.h" 135ffd83dbSDimitry Andric #include "lldb/Target/Target.h" 145ffd83dbSDimitry Andric 155ffd83dbSDimitry Andric namespace lldb_private { 165ffd83dbSDimitry Andric 175ffd83dbSDimitry Andric class CFBasicHash { 185ffd83dbSDimitry Andric public: 195ffd83dbSDimitry Andric enum class HashType { set = 0, dict }; 205ffd83dbSDimitry Andric 215ffd83dbSDimitry Andric CFBasicHash() = default; 225ffd83dbSDimitry Andric ~CFBasicHash() = default; 235ffd83dbSDimitry Andric 245ffd83dbSDimitry Andric bool Update(lldb::addr_t addr, ExecutionContextRef exe_ctx_rf); 255ffd83dbSDimitry Andric 265ffd83dbSDimitry Andric bool IsValid() const; 275ffd83dbSDimitry Andric IsMutable()285ffd83dbSDimitry Andric bool IsMutable() const { return m_mutable; }; IsMultiVariant()295ffd83dbSDimitry Andric bool IsMultiVariant() const { return m_multi; } GetType()305ffd83dbSDimitry Andric HashType GetType() const { return m_type; } 315ffd83dbSDimitry Andric 325ffd83dbSDimitry Andric size_t GetCount() const; 335ffd83dbSDimitry Andric lldb::addr_t GetKeyPointer() const; 345ffd83dbSDimitry Andric lldb::addr_t GetValuePointer() const; 355ffd83dbSDimitry Andric 365ffd83dbSDimitry Andric private: 375ffd83dbSDimitry Andric template <typename T> struct __CFBasicHash { 385ffd83dbSDimitry Andric struct RuntimeBase { 395ffd83dbSDimitry Andric T cfisa; 405ffd83dbSDimitry Andric T cfinfoa; 415ffd83dbSDimitry Andric } base; 425ffd83dbSDimitry Andric 435ffd83dbSDimitry Andric struct Bits { 445ffd83dbSDimitry Andric uint16_t __reserved0; 455ffd83dbSDimitry Andric uint16_t __reserved1 : 2; 465ffd83dbSDimitry Andric uint16_t keys_offset : 1; 475ffd83dbSDimitry Andric uint16_t counts_offset : 2; 485ffd83dbSDimitry Andric uint16_t counts_width : 2; 495ffd83dbSDimitry Andric uint16_t __reserved2 : 9; 505ffd83dbSDimitry Andric uint32_t used_buckets; // number of used buckets 515ffd83dbSDimitry Andric uint64_t deleted : 16; // number of elements deleted 525ffd83dbSDimitry Andric uint64_t num_buckets_idx : 8; // index to number of buckets 535ffd83dbSDimitry Andric uint64_t __reserved3 : 40; 545ffd83dbSDimitry Andric uint64_t __reserved4; 555ffd83dbSDimitry Andric } bits; 565ffd83dbSDimitry Andric 575ffd83dbSDimitry Andric T pointers[3]; 585ffd83dbSDimitry Andric }; 595ffd83dbSDimitry Andric template <typename T> bool UpdateFor(std::unique_ptr<__CFBasicHash<T>> &m_ht); 605ffd83dbSDimitry Andric 615ffd83dbSDimitry Andric size_t GetPointerCount() const; 625ffd83dbSDimitry Andric 635ffd83dbSDimitry Andric uint32_t m_ptr_size = UINT32_MAX; 645ffd83dbSDimitry Andric lldb::ByteOrder m_byte_order = lldb::eByteOrderInvalid; 655ffd83dbSDimitry Andric Address m_address = LLDB_INVALID_ADDRESS; 665ffd83dbSDimitry Andric std::unique_ptr<__CFBasicHash<uint32_t>> m_ht_32 = nullptr; 675ffd83dbSDimitry Andric std::unique_ptr<__CFBasicHash<uint64_t>> m_ht_64 = nullptr; 685ffd83dbSDimitry Andric ExecutionContextRef m_exe_ctx_ref; 695ffd83dbSDimitry Andric bool m_mutable = true; 705ffd83dbSDimitry Andric bool m_multi = false; 71*fcaf7f86SDimitry Andric HashType m_type = HashType::set; 725ffd83dbSDimitry Andric }; 735ffd83dbSDimitry Andric 745ffd83dbSDimitry Andric } // namespace lldb_private 755ffd83dbSDimitry Andric 765ffd83dbSDimitry Andric #endif // LLDB_SOURCE_PLUGINS_LANGUAGE_OBJC_CFBASICHASH_H 77