brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.0 KiB · c51ac24 Raw
161 lines · c
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-exception6//7//===----------------------------------------------------------------------===//8 9#ifndef LLDB_SOURCE_PLUGINS_LANGUAGERUNTIME_OBJC_APPLEOBJCRUNTIME_APPLEOBJCRUNTIMEV1_H10#define LLDB_SOURCE_PLUGINS_LANGUAGERUNTIME_OBJC_APPLEOBJCRUNTIME_APPLEOBJCRUNTIMEV1_H11 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 Functions24  static void Initialize();25 26  static void Terminate();27 28  static lldb_private::LanguageRuntime *29  CreateInstance(Process *process, lldb::LanguageType language);30 31  static llvm::StringRef GetPluginNameStatic() { return "apple-objc-v1"; }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 pointers61    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    bool GetTaggedPointerInfoSigned(uint64_t *info_bits = nullptr,68                                    int64_t *value_bits = nullptr,69                                    uint64_t *payload = nullptr) override {70      return false;71    }72 73    uint64_t GetInstanceSize() override { return m_instance_size; }74 75    ObjCISA GetISA() override { return m_isa; }76 77    bool78    Describe(std::function<void(ObjCLanguageRuntime::ObjCISA)> const79                 &superclass_func,80             std::function<bool(const char *, const char *)> const81                 &instance_method_func,82             std::function<bool(const char *, const char *)> const83                 &class_method_func,84             std::function<bool(const char *, const char *, lldb::addr_t,85                                uint64_t)> const &ivar_func) const override;86 87  protected:88    void Initialize(ObjCISA isa, lldb::ProcessSP process_sp);89 90  private:91    ConstString m_name;92    ObjCISA m_isa;93    ObjCISA m_parent_isa;94    bool m_valid;95    lldb::ProcessWP m_process_wp;96    uint64_t m_instance_size;97  };98 99  // These are generic runtime functions:100  bool GetDynamicTypeAndAddress(ValueObject &in_value,101                                lldb::DynamicValueType use_dynamic,102                                TypeAndOrName &class_type_or_name,103                                Address &address, Value::ValueType &value_type,104                                llvm::ArrayRef<uint8_t> &local_buffer) override;105 106  llvm::Expected<std::unique_ptr<UtilityFunction>>107  CreateObjectChecker(std::string, ExecutionContext &exe_ctx) override;108 109  // PluginInterface protocol110  llvm::StringRef GetPluginName() override { return GetPluginNameStatic(); }111 112  ObjCRuntimeVersions GetRuntimeVersion() const override {113    return ObjCRuntimeVersions::eAppleObjC_V1;114  }115 116  void UpdateISAToDescriptorMapIfNeeded() override;117 118  DeclVendor *GetDeclVendor() override;119 120protected:121  lldb::BreakpointResolverSP122  CreateExceptionResolver(const lldb::BreakpointSP &bkpt,123                          bool catch_bp, bool throw_bp) override;124 125  class HashTableSignature {126  public:127    HashTableSignature() = default;128 129    bool NeedsUpdate(uint32_t count, uint32_t num_buckets,130                     lldb::addr_t buckets_ptr) {131      return m_count != count || m_num_buckets != num_buckets ||132             m_buckets_ptr != buckets_ptr;133    }134 135    void UpdateSignature(uint32_t count, uint32_t num_buckets,136                         lldb::addr_t buckets_ptr) {137      m_count = count;138      m_num_buckets = num_buckets;139      m_buckets_ptr = buckets_ptr;140    }141 142  protected:143    uint32_t m_count = 0;144    uint32_t m_num_buckets = 0;145    lldb::addr_t m_buckets_ptr = LLDB_INVALID_ADDRESS;146  };147 148  lldb::addr_t GetISAHashTablePointer();149 150  HashTableSignature m_hash_signature;151  lldb::addr_t m_isa_hash_table_ptr;152  std::unique_ptr<DeclVendor> m_decl_vendor_up;153 154private:155  AppleObjCRuntimeV1(Process *process);156};157 158} // namespace lldb_private159 160#endif // LLDB_SOURCE_PLUGINS_LANGUAGERUNTIME_OBJC_APPLEOBJCRUNTIME_APPLEOBJCRUNTIMEV1_H161