xref: /openbsd-src/gnu/llvm/lldb/source/Plugins/Language/ObjC/CFBasicHash.h (revision f6aab3d83b51b91c24247ad2c2573574de475a82)
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