1//===-- AppleObjCRuntimeV1.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 liblldb_AppleObjCRuntimeV1_h_ 10#define liblldb_AppleObjCRuntimeV1_h_ 11 12#include "AppleObjCRuntime.h" 13#include "lldb/lldb-private.h" 14 15#include "Plugins/LanguageRuntime/ObjC/ObjCLanguageRuntime.h" 16 17namespace lldb_private { 18 19class AppleObjCRuntimeV1 : public AppleObjCRuntime { 20public: 21 ~AppleObjCRuntimeV1() override = default; 22 23 // Static Functions 24 static void Initialize(); 25 26 static void Terminate(); 27 28 static lldb_private::LanguageRuntime * 29 CreateInstance(Process *process, lldb::LanguageType language); 30 31 static lldb_private::ConstString GetPluginNameStatic(); 32 33 static char ID; 34 35 bool isA(const void *ClassID) const override { 36 return ClassID == &ID || AppleObjCRuntime::isA(ClassID); 37 } 38 39 static bool classof(const LanguageRuntime *runtime) { 40 return runtime->isA(&ID); 41 } 42 43 lldb::addr_t GetTaggedPointerObfuscator(); 44 45 class ClassDescriptorV1 : public ObjCLanguageRuntime::ClassDescriptor { 46 public: 47 ClassDescriptorV1(ValueObject &isa_pointer); 48 ClassDescriptorV1(ObjCISA isa, lldb::ProcessSP process_sp); 49 50 ~ClassDescriptorV1() override = default; 51 52 ConstString GetClassName() override { return m_name; } 53 54 ClassDescriptorSP GetSuperclass() override; 55 56 ClassDescriptorSP GetMetaclass() const override; 57 58 bool IsValid() override { return m_valid; } 59 60 // v1 does not support tagged pointers 61 bool GetTaggedPointerInfo(uint64_t *info_bits = nullptr, 62 uint64_t *value_bits = nullptr, 63 uint64_t *payload = nullptr) override { 64 return false; 65 } 66 67 uint64_t GetInstanceSize() override { return m_instance_size; } 68 69 ObjCISA GetISA() override { return m_isa; } 70 71 bool 72 Describe(std::function<void(ObjCLanguageRuntime::ObjCISA)> const 73 &superclass_func, 74 std::function<bool(const char *, const char *)> const 75 &instance_method_func, 76 std::function<bool(const char *, const char *)> const 77 &class_method_func, 78 std::function<bool(const char *, const char *, lldb::addr_t, 79 uint64_t)> const &ivar_func) const override; 80 81 protected: 82 void Initialize(ObjCISA isa, lldb::ProcessSP process_sp); 83 84 private: 85 ConstString m_name; 86 ObjCISA m_isa; 87 ObjCISA m_parent_isa; 88 bool m_valid; 89 lldb::ProcessWP m_process_wp; 90 uint64_t m_instance_size; 91 }; 92 93 // These are generic runtime functions: 94 bool GetDynamicTypeAndAddress(ValueObject &in_value, 95 lldb::DynamicValueType use_dynamic, 96 TypeAndOrName &class_type_or_name, 97 Address &address, 98 Value::ValueType &value_type) override; 99 100 UtilityFunction *CreateObjectChecker(const char *) override; 101 102 // PluginInterface protocol 103 ConstString GetPluginName() override; 104 105 uint32_t GetPluginVersion() override; 106 107 ObjCRuntimeVersions GetRuntimeVersion() const override { 108 return ObjCRuntimeVersions::eAppleObjC_V1; 109 } 110 111 void UpdateISAToDescriptorMapIfNeeded() override; 112 113 DeclVendor *GetDeclVendor() override; 114 115protected: 116 lldb::BreakpointResolverSP CreateExceptionResolver(Breakpoint *bkpt, 117 bool catch_bp, 118 bool throw_bp) override; 119 120 class HashTableSignature { 121 public: 122 HashTableSignature() 123 : m_count(0), m_num_buckets(0), m_buckets_ptr(LLDB_INVALID_ADDRESS) {} 124 125 bool NeedsUpdate(uint32_t count, uint32_t num_buckets, 126 lldb::addr_t buckets_ptr) { 127 return m_count != count || m_num_buckets != num_buckets || 128 m_buckets_ptr != buckets_ptr; 129 } 130 131 void UpdateSignature(uint32_t count, uint32_t num_buckets, 132 lldb::addr_t buckets_ptr) { 133 m_count = count; 134 m_num_buckets = num_buckets; 135 m_buckets_ptr = buckets_ptr; 136 } 137 138 protected: 139 uint32_t m_count; 140 uint32_t m_num_buckets; 141 lldb::addr_t m_buckets_ptr; 142 }; 143 144 lldb::addr_t GetISAHashTablePointer(); 145 146 HashTableSignature m_hash_signature; 147 lldb::addr_t m_isa_hash_table_ptr; 148 std::unique_ptr<DeclVendor> m_decl_vendor_up; 149 150private: 151 AppleObjCRuntimeV1(Process *process); 152}; 153 154} // namespace lldb_private 155 156#endif // liblldb_AppleObjCRuntimeV1_h_ 157