• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
21 namespace lldb_private {
22 
23 class AppleObjCRuntimeV1 :
24         public AppleObjCRuntime
25 {
26 public:
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
GetClassName()35         GetClassName ()
36         {
37             return m_name;
38         }
39 
40         virtual ClassDescriptorSP
41         GetSuperclass ();
42 
43         virtual bool
IsValid()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
GetInstanceSize()59         GetInstanceSize ()
60         {
61             return m_instance_size;
62         }
63 
64         virtual ObjCISA
GetISA()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
~ClassDescriptorV1()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 
~AppleObjCRuntimeV1()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     static lldb_private::ConstString
118     GetPluginNameStatic();
119 
120     //------------------------------------------------------------------
121     // PluginInterface protocol
122     //------------------------------------------------------------------
123     virtual ConstString
124     GetPluginName();
125 
126     virtual uint32_t
127     GetPluginVersion();
128 
129     virtual ObjCRuntimeVersions
GetRuntimeVersion()130     GetRuntimeVersion ()
131     {
132         return eAppleObjC_V1;
133     }
134 
135     virtual void
136     UpdateISAToDescriptorMapIfNeeded();
137 
138     virtual TypeVendor *
139     GetTypeVendor();
140 
141 protected:
142     virtual lldb::BreakpointResolverSP
143     CreateExceptionResolver (Breakpoint *bkpt, bool catch_bp, bool throw_bp);
144 
145 
146     class HashTableSignature
147     {
148     public:
HashTableSignature()149         HashTableSignature () :
150             m_count (0),
151             m_num_buckets (0),
152             m_buckets_ptr (LLDB_INVALID_ADDRESS)
153         {
154         }
155 
156         bool
NeedsUpdate(uint32_t count,uint32_t num_buckets,lldb::addr_t buckets_ptr)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
UpdateSignature(uint32_t count,uint32_t num_buckets,lldb::addr_t buckets_ptr)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;
189 private:
190     AppleObjCRuntimeV1(Process *process);
191 };
192 
193 } // namespace lldb_private
194 
195 #endif  // liblldb_AppleObjCRuntimeV1_h_
196