Home | History | Annotate | Download | only in AppleObjCRuntime
      1 //===-- AppleObjCRuntimeV2.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_AppleObjCRuntimeV2_h_
     11 #define liblldb_AppleObjCRuntimeV2_h_
     12 
     13 // C Includes
     14 // C++ Includes
     15 
     16 #include <map>
     17 #include <memory>
     18 
     19 // Other libraries and framework includes
     20 // Project includes
     21 #include "lldb/lldb-private.h"
     22 #include "lldb/Target/ObjCLanguageRuntime.h"
     23 #include "AppleObjCRuntime.h"
     24 
     25 class RemoteNXMapTable;
     26 
     27 namespace lldb_private {
     28 
     29 class AppleObjCRuntimeV2 :
     30         public AppleObjCRuntime
     31 {
     32 public:
     33     virtual ~AppleObjCRuntimeV2();
     34 
     35     // These are generic runtime functions:
     36     virtual bool
     37     GetDynamicTypeAndAddress (ValueObject &in_value,
     38                               lldb::DynamicValueType use_dynamic,
     39                               TypeAndOrName &class_type_or_name,
     40                               Address &address);
     41 
     42     virtual ClangUtilityFunction *
     43     CreateObjectChecker (const char *);
     44 
     45 
     46     //------------------------------------------------------------------
     47     // Static Functions
     48     //------------------------------------------------------------------
     49     static void
     50     Initialize();
     51 
     52     static void
     53     Terminate();
     54 
     55     static lldb_private::LanguageRuntime *
     56     CreateInstance (Process *process, lldb::LanguageType language);
     57 
     58     static lldb_private::ConstString
     59     GetPluginNameStatic();
     60 
     61     //------------------------------------------------------------------
     62     // PluginInterface protocol
     63     //------------------------------------------------------------------
     64     virtual ConstString
     65     GetPluginName();
     66 
     67     virtual uint32_t
     68     GetPluginVersion();
     69 
     70     virtual ObjCRuntimeVersions
     71     GetRuntimeVersion ()
     72     {
     73         return eAppleObjC_V2;
     74     }
     75 
     76     virtual size_t
     77     GetByteOffsetForIvar (ClangASTType &parent_qual_type, const char *ivar_name);
     78 
     79     virtual void
     80     UpdateISAToDescriptorMapIfNeeded();
     81 
     82     // none of these are valid ISAs - we use them to infer the type
     83     // of tagged pointers - if we have something meaningful to say
     84     // we report an actual type - otherwise, we just say tagged
     85     // there is no connection between the values here and the tagged pointers map
     86     static const ObjCLanguageRuntime::ObjCISA g_objc_Tagged_ISA = 1;
     87     static const ObjCLanguageRuntime::ObjCISA g_objc_Tagged_ISA_NSAtom = 2;
     88     static const ObjCLanguageRuntime::ObjCISA g_objc_Tagged_ISA_NSNumber = 3;
     89     static const ObjCLanguageRuntime::ObjCISA g_objc_Tagged_ISA_NSDateTS = 4;
     90     static const ObjCLanguageRuntime::ObjCISA g_objc_Tagged_ISA_NSManagedObject = 5;
     91     static const ObjCLanguageRuntime::ObjCISA g_objc_Tagged_ISA_NSDate = 6;
     92 
     93     virtual ConstString
     94     GetActualTypeName(ObjCLanguageRuntime::ObjCISA isa);
     95 
     96     virtual ClassDescriptorSP
     97     GetClassDescriptor (ValueObject& in_value);
     98 
     99     virtual ClassDescriptorSP
    100     GetClassDescriptor (ObjCISA isa);
    101 
    102     virtual TypeVendor *
    103     GetTypeVendor();
    104 
    105     virtual lldb::addr_t
    106     LookupRuntimeSymbol (const ConstString &name);
    107 
    108 protected:
    109     virtual lldb::BreakpointResolverSP
    110     CreateExceptionResolver (Breakpoint *bkpt, bool catch_bp, bool throw_bp);
    111 
    112 private:
    113 
    114     class HashTableSignature
    115     {
    116     public:
    117         HashTableSignature ();
    118 
    119         bool
    120         NeedsUpdate (Process *process,
    121                      AppleObjCRuntimeV2 *runtime,
    122                      RemoteNXMapTable &hash_table);
    123 
    124         void
    125         UpdateSignature (const RemoteNXMapTable &hash_table);
    126     protected:
    127         uint32_t m_count;
    128         uint32_t m_num_buckets;
    129         lldb::addr_t m_buckets_ptr;
    130     };
    131 
    132     class NonPointerISACache
    133     {
    134     public:
    135         static NonPointerISACache*
    136         CreateInstance (AppleObjCRuntimeV2& runtime,
    137                         const lldb::ModuleSP& objc_module_sp);
    138 
    139 
    140         ObjCLanguageRuntime::ClassDescriptorSP
    141         GetClassDescriptor (ObjCISA isa);
    142     private:
    143         NonPointerISACache (AppleObjCRuntimeV2& runtime,
    144                             uint64_t objc_debug_isa_class_mask,
    145                             uint64_t objc_debug_isa_magic_mask,
    146                             uint64_t objc_debug_isa_magic_value);
    147 
    148         bool
    149         EvaluateNonPointerISA (ObjCISA isa, ObjCISA& ret_isa);
    150 
    151         AppleObjCRuntimeV2&                                         m_runtime;
    152         std::map<ObjCISA,ObjCLanguageRuntime::ClassDescriptorSP>    m_cache;
    153         uint64_t                                                    m_objc_debug_isa_class_mask;
    154         uint64_t                                                    m_objc_debug_isa_magic_mask;
    155         uint64_t                                                    m_objc_debug_isa_magic_value;
    156 
    157         DISALLOW_COPY_AND_ASSIGN(NonPointerISACache);
    158     };
    159 
    160     class TaggedPointerVendor
    161     {
    162     public:
    163         static TaggedPointerVendor*
    164         CreateInstance (AppleObjCRuntimeV2& runtime,
    165                         const lldb::ModuleSP& objc_module_sp);
    166 
    167         virtual bool
    168         IsPossibleTaggedPointer (lldb::addr_t ptr) = 0;
    169 
    170         virtual ObjCLanguageRuntime::ClassDescriptorSP
    171         GetClassDescriptor (lldb::addr_t ptr) = 0;
    172 
    173         virtual
    174         ~TaggedPointerVendor () { }
    175     protected:
    176         AppleObjCRuntimeV2&                                         m_runtime;
    177 
    178         TaggedPointerVendor (AppleObjCRuntimeV2& runtime) :
    179         m_runtime(runtime)
    180         {
    181         }
    182     private:
    183 
    184         DISALLOW_COPY_AND_ASSIGN(TaggedPointerVendor);
    185     };
    186 
    187     class TaggedPointerVendorRuntimeAssisted : public TaggedPointerVendor
    188     {
    189     public:
    190         virtual bool
    191         IsPossibleTaggedPointer (lldb::addr_t ptr);
    192 
    193         virtual ObjCLanguageRuntime::ClassDescriptorSP
    194         GetClassDescriptor (lldb::addr_t ptr);
    195     protected:
    196         TaggedPointerVendorRuntimeAssisted (AppleObjCRuntimeV2& runtime,
    197                                              uint64_t objc_debug_taggedpointer_mask,
    198                                              uint32_t objc_debug_taggedpointer_slot_shift,
    199                                              uint32_t objc_debug_taggedpointer_slot_mask,
    200                                              uint32_t objc_debug_taggedpointer_payload_lshift,
    201                                              uint32_t objc_debug_taggedpointer_payload_rshift,
    202                                              lldb::addr_t objc_debug_taggedpointer_classes);
    203 
    204         typedef std::map<uint8_t,ObjCLanguageRuntime::ClassDescriptorSP> Cache;
    205         typedef Cache::iterator CacheIterator;
    206         Cache                                                       m_cache;
    207         uint64_t                                                    m_objc_debug_taggedpointer_mask;
    208         uint32_t                                                    m_objc_debug_taggedpointer_slot_shift;
    209         uint32_t                                                    m_objc_debug_taggedpointer_slot_mask;
    210         uint32_t                                                    m_objc_debug_taggedpointer_payload_lshift;
    211         uint32_t                                                    m_objc_debug_taggedpointer_payload_rshift;
    212         lldb::addr_t                                                m_objc_debug_taggedpointer_classes;
    213 
    214         friend class AppleObjCRuntimeV2::TaggedPointerVendor;
    215 
    216         DISALLOW_COPY_AND_ASSIGN(TaggedPointerVendorRuntimeAssisted);
    217     };
    218 
    219     class TaggedPointerVendorLegacy : public TaggedPointerVendor
    220     {
    221     public:
    222         virtual bool
    223         IsPossibleTaggedPointer (lldb::addr_t ptr);
    224 
    225         virtual ObjCLanguageRuntime::ClassDescriptorSP
    226         GetClassDescriptor (lldb::addr_t ptr);
    227     protected:
    228         TaggedPointerVendorLegacy (AppleObjCRuntimeV2& runtime) :
    229         TaggedPointerVendor (runtime),
    230         m_Foundation_version(0)
    231         {
    232         }
    233 
    234         static uint32_t
    235         GetFoundationVersion (Target& target);
    236 
    237         uint32_t m_Foundation_version;
    238 
    239         friend class AppleObjCRuntimeV2::TaggedPointerVendor;
    240 
    241         DISALLOW_COPY_AND_ASSIGN(TaggedPointerVendorLegacy);
    242     };
    243 
    244     AppleObjCRuntimeV2 (Process *process,
    245                         const lldb::ModuleSP &objc_module_sp);
    246 
    247     bool
    248     IsTaggedPointer(lldb::addr_t ptr);
    249 
    250     lldb::addr_t
    251     GetISAHashTablePointer ();
    252 
    253     bool
    254     UpdateISAToDescriptorMapFromMemory (RemoteNXMapTable &hash_table);
    255 
    256     bool
    257     UpdateISAToDescriptorMapDynamic(RemoteNXMapTable &hash_table);
    258 
    259     void
    260     ParseClassInfoArray (const lldb_private::DataExtractor &data,
    261                          uint32_t num_class_infos);
    262 
    263     bool
    264     UpdateISAToDescriptorMapSharedCache ();
    265 
    266     lldb::addr_t
    267     GetSharedCacheReadOnlyAddress();
    268 
    269     std::unique_ptr<ClangFunction>            m_get_class_info_function;
    270     std::unique_ptr<ClangUtilityFunction>     m_get_class_info_code;
    271     lldb::addr_t                            m_get_class_info_args;
    272     Mutex                                   m_get_class_info_args_mutex;
    273 
    274     std::unique_ptr<ClangFunction>            m_get_shared_cache_class_info_function;
    275     std::unique_ptr<ClangUtilityFunction>     m_get_shared_cache_class_info_code;
    276     lldb::addr_t                            m_get_shared_cache_class_info_args;
    277     Mutex                                   m_get_shared_cache_class_info_args_mutex;
    278 
    279     std::unique_ptr<TypeVendor>               m_type_vendor_ap;
    280     lldb::addr_t                            m_isa_hash_table_ptr;
    281     HashTableSignature                      m_hash_signature;
    282     bool                                    m_has_object_getClass;
    283     bool                                    m_loaded_objc_opt;
    284     std::unique_ptr<NonPointerISACache>       m_non_pointer_isa_cache_ap;
    285     std::unique_ptr<TaggedPointerVendor>    m_tagged_pointer_vendor_ap;
    286 };
    287 
    288 } // namespace lldb_private
    289 
    290 #endif  // liblldb_AppleObjCRuntimeV2_h_
    291