AppleObjCRuntimeV1.h revision d9661be3c9f884d9a7a78174038387edd04c5d93
1//===-- AppleObjCRuntimeV1.h ----------------------------------------*- C++ -*-===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#ifndef liblldb_AppleObjCRuntimeV1_h_
11#define liblldb_AppleObjCRuntimeV1_h_
12
13// C Includes
14// C++ Includes
15// Other libraries and framework includes
16// Project includes
17#include "lldb/lldb-private.h"
18#include "lldb/Target/ObjCLanguageRuntime.h"
19#include "AppleObjCRuntime.h"
20
21namespace lldb_private {
22
23class AppleObjCRuntimeV1 :
24        public AppleObjCRuntime
25{
26public:
27
28    class ClassDescriptorV1 : public ObjCLanguageRuntime::ClassDescriptor
29    {
30    public:
31        ClassDescriptorV1 (ValueObject &isa_pointer);
32        ClassDescriptorV1 (ObjCISA isa, lldb::ProcessSP process_sp);
33
34        virtual ConstString
35        GetClassName ()
36        {
37            return m_name;
38        }
39
40        virtual ClassDescriptorSP
41        GetSuperclass ();
42
43        virtual bool
44        IsValid ()
45        {
46            return m_valid;
47        }
48
49        // v1 does not support tagged pointers
50        virtual bool
51        GetTaggedPointerInfo (uint64_t* info_bits = NULL,
52                              uint64_t* value_bits = NULL,
53                              uint64_t* payload = NULL)
54        {
55            return false;
56        }
57
58        virtual uint64_t
59        GetInstanceSize ()
60        {
61            return m_instance_size;
62        }
63
64        virtual ObjCISA
65        GetISA ()
66        {
67            return m_isa;
68        }
69
70        virtual bool
71        Describe (std::function <void (ObjCLanguageRuntime::ObjCISA)> const &superclass_func,
72                  std::function <bool (const char *, const char *)> const &instance_method_func,
73                  std::function <bool (const char *, const char *)> const &class_method_func,
74                  std::function <bool (const char *, const char *, lldb::addr_t, uint64_t)> const &ivar_func);
75
76        virtual
77        ~ClassDescriptorV1 ()
78        {}
79
80    protected:
81        void
82        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    virtual ~AppleObjCRuntimeV1() { }
94
95    // These are generic runtime functions:
96    virtual bool
97    GetDynamicTypeAndAddress (ValueObject &in_value,
98                              lldb::DynamicValueType use_dynamic,
99                              TypeAndOrName &class_type_or_name,
100                              Address &address);
101
102    virtual ClangUtilityFunction *
103    CreateObjectChecker (const char *);
104
105    //------------------------------------------------------------------
106    // Static Functions
107    //------------------------------------------------------------------
108    static void
109    Initialize();
110
111    static void
112    Terminate();
113
114    static lldb_private::LanguageRuntime *
115    CreateInstance (Process *process, lldb::LanguageType language);
116
117    //------------------------------------------------------------------
118    // PluginInterface protocol
119    //------------------------------------------------------------------
120    virtual const char *
121    GetPluginName();
122
123    virtual const char *
124    GetShortPluginName();
125
126    virtual uint32_t
127    GetPluginVersion();
128
129    virtual ObjCRuntimeVersions
130    GetRuntimeVersion ()
131    {
132        return eAppleObjC_V1;
133    }
134
135    virtual void
136    UpdateISAToDescriptorMapIfNeeded();
137
138    virtual TypeVendor *
139    GetTypeVendor();
140
141protected:
142    virtual lldb::BreakpointResolverSP
143    CreateExceptionResolver (Breakpoint *bkpt, bool catch_bp, bool throw_bp);
144
145
146    class HashTableSignature
147    {
148    public:
149        HashTableSignature () :
150            m_count (0),
151            m_num_buckets (0),
152            m_buckets_ptr (LLDB_INVALID_ADDRESS)
153        {
154        }
155
156        bool
157        NeedsUpdate (uint32_t count,
158                     uint32_t num_buckets,
159                     lldb::addr_t buckets_ptr)
160        {
161            return m_count       != count       ||
162                   m_num_buckets != num_buckets ||
163                   m_buckets_ptr != buckets_ptr ;
164        }
165
166        void
167        UpdateSignature (uint32_t count,
168                         uint32_t num_buckets,
169                         lldb::addr_t buckets_ptr)
170        {
171            m_count = count;
172            m_num_buckets = num_buckets;
173            m_buckets_ptr = buckets_ptr;
174        }
175
176    protected:
177        uint32_t m_count;
178        uint32_t m_num_buckets;
179        lldb::addr_t m_buckets_ptr;
180    };
181
182
183    lldb::addr_t
184    GetISAHashTablePointer ();
185
186    HashTableSignature m_hash_signature;
187    lldb::addr_t m_isa_hash_table_ptr;
188    std::unique_ptr<TypeVendor> m_type_vendor_ap;
189private:
190    AppleObjCRuntimeV1(Process *process);
191};
192
193} // namespace lldb_private
194
195#endif  // liblldb_AppleObjCRuntimeV1_h_
196