[Lldb-commits] [lldb] r164049 - in /lldb/trunk/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime: AppleObjCRuntimeV2.cpp AppleObjCRuntimeV2.h
Sean Callanan
scallanan at apple.com
Mon Sep 17 12:30:47 PDT 2012
Author: spyffe
Date: Mon Sep 17 14:30:47 2012
New Revision: 164049
URL: http://llvm.org/viewvc/llvm-project?rev=164049&view=rev
Log:
Re-applied Enrico's patch that I so rudely
stomped on.
Modified:
lldb/trunk/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV2.cpp
lldb/trunk/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV2.h
Modified: lldb/trunk/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV2.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV2.cpp?rev=164049&r1=164048&r2=164049&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV2.cpp (original)
+++ lldb/trunk/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV2.cpp Mon Sep 17 14:30:47 2012
@@ -588,47 +588,6 @@
return (ptr & 0x01);
}
-ObjCLanguageRuntime::ClassDescriptorSP
-AppleObjCRuntimeV2::GetClassDescriptor (ObjCISA isa)
-{
- ObjCLanguageRuntime::ISAToDescriptorIterator found = m_isa_to_descriptor_cache.find(isa);
- ObjCLanguageRuntime::ISAToDescriptorIterator end = m_isa_to_descriptor_cache.end();
-
- if (found != end && found->second)
- return found->second;
-
- ClassDescriptorSP descriptor = ClassDescriptorSP(new ClassDescriptorV2(isa,m_process->CalculateProcess()));
- if (descriptor && descriptor->IsValid())
- m_isa_to_descriptor_cache[descriptor->GetISA()] = descriptor;
- return descriptor;
-}
-
-ObjCLanguageRuntime::ClassDescriptorSP
-AppleObjCRuntimeV2::GetClassDescriptor (ValueObject& in_value)
-{
- uint64_t ptr_value = in_value.GetValueAsUnsigned(0);
- if (ptr_value == 0)
- return ObjCLanguageRuntime::ClassDescriptorSP();
-
- ObjCISA isa = GetISA(in_value);
-
- ObjCLanguageRuntime::ISAToDescriptorIterator found = m_isa_to_descriptor_cache.find(isa);
- ObjCLanguageRuntime::ISAToDescriptorIterator end = m_isa_to_descriptor_cache.end();
-
- if (found != end && found->second)
- return found->second;
-
- ClassDescriptorSP descriptor;
-
- if (ptr_value & 1)
- return ClassDescriptorSP(new ClassDescriptorV2Tagged(in_value)); // do not save tagged pointers
- descriptor = ClassDescriptorSP(new ClassDescriptorV2(in_value));
-
- if (descriptor && descriptor->IsValid())
- m_isa_to_descriptor_cache[descriptor->GetISA()] = descriptor;
- return descriptor;
-}
-
class RemoteNXMapTable
{
public:
@@ -1012,6 +971,431 @@
const size_t m_classheader_size = (sizeof(int32_t) * 2);
};
+class ClassDescriptorV2 : public ObjCLanguageRuntime::ClassDescriptor
+{
+public:
+ ClassDescriptorV2 (ValueObject &isa_pointer)
+ {
+ ObjCLanguageRuntime::ObjCISA ptr_value = isa_pointer.GetValueAsUnsigned(0);
+
+ lldb::ProcessSP process_sp = isa_pointer.GetProcessSP();
+
+ Initialize (ptr_value,process_sp);
+ }
+
+ ClassDescriptorV2 (ObjCLanguageRuntime::ObjCISA isa, lldb::ProcessSP process_sp)
+ {
+ Initialize (isa, process_sp);
+ }
+
+ virtual ConstString
+ GetClassName ()
+ {
+ return m_name;
+ }
+
+ virtual ObjCLanguageRuntime::ClassDescriptorSP
+ GetSuperclass ()
+ {
+ if (!m_valid)
+ return ObjCLanguageRuntime::ClassDescriptorSP();
+ ProcessSP process_sp = m_process_wp.lock();
+ if (!process_sp)
+ return ObjCLanguageRuntime::ClassDescriptorSP();
+ return AppleObjCRuntime::ClassDescriptorSP(new ClassDescriptorV2(m_parent_isa,process_sp));
+ }
+
+ virtual bool
+ IsValid ()
+ {
+ return m_valid;
+ }
+
+ virtual bool
+ IsTagged ()
+ {
+ return false; // we use a special class for tagged descriptors
+ }
+
+ virtual uint64_t
+ GetInstanceSize ()
+ {
+ return m_instance_size;
+ }
+
+ virtual ObjCLanguageRuntime::ObjCISA
+ GetISA ()
+ {
+ return m_isa;
+ }
+
+ virtual
+ ~ClassDescriptorV2 ()
+ {}
+
+protected:
+ virtual bool
+ CheckPointer (lldb::addr_t value,
+ uint32_t ptr_size)
+ {
+ if (ptr_size != 8)
+ return true;
+ return ((value & 0xFFFF800000000000) == 0);
+ }
+
+ void
+ Initialize (ObjCLanguageRuntime::ObjCISA isa, lldb::ProcessSP process_sp)
+ {
+ if (!isa || !process_sp)
+ {
+ m_valid = false;
+ return;
+ }
+
+ m_valid = true;
+
+ Error error;
+
+ m_isa = process_sp->ReadPointerFromMemory(isa, error);
+
+ if (error.Fail())
+ {
+ m_valid = false;
+ return;
+ }
+
+ uint32_t ptr_size = process_sp->GetAddressByteSize();
+
+ if (!IsPointerValid(m_isa,ptr_size,false,false,true))
+ {
+ m_valid = false;
+ return;
+ }
+
+ lldb::addr_t data_ptr = process_sp->ReadPointerFromMemory(m_isa + 4 * ptr_size, error);
+
+ if (error.Fail())
+ {
+ m_valid = false;
+ return;
+ }
+
+ if (!IsPointerValid(data_ptr,ptr_size,false,false,true))
+ {
+ m_valid = false;
+ return;
+ }
+
+ m_parent_isa = process_sp->ReadPointerFromMemory(isa + ptr_size,error);
+
+ if (error.Fail())
+ {
+ m_valid = false;
+ return;
+ }
+
+ // sanity checks
+ lldb::addr_t cache_ptr = process_sp->ReadPointerFromMemory(m_isa + 2*ptr_size, error);
+ if (error.Fail())
+ {
+ m_valid = false;
+ return;
+ }
+ if (!IsPointerValid(cache_ptr,ptr_size,true,false,true))
+ {
+ m_valid = false;
+ return;
+ }
+
+ // now construct the data object
+
+ lldb::addr_t rot_pointer = process_sp->ReadPointerFromMemory(data_ptr + 8, error);
+
+ if (error.Fail())
+ {
+ m_valid = false;
+ return;
+ }
+
+ if (!IsPointerValid(rot_pointer,ptr_size))
+ {
+ m_valid = false;
+ return;
+ }
+
+ // now read from the rot
+
+ lldb::addr_t name_ptr = process_sp->ReadPointerFromMemory(rot_pointer + (ptr_size == 8 ? 24 : 16) ,error);
+
+ if (error.Fail())
+ {
+ m_valid = false;
+ return;
+ }
+
+ lldb::DataBufferSP buffer_sp(new DataBufferHeap(1024, 0));
+
+ size_t count = process_sp->ReadCStringFromMemory(name_ptr, (char*)buffer_sp->GetBytes(), 1024, error);
+
+ if (error.Fail())
+ {
+ m_valid = false;
+ return;
+ }
+
+ if (count)
+ m_name = ConstString((char*)buffer_sp->GetBytes());
+ else
+ m_name = ConstString();
+
+ m_instance_size = process_sp->ReadUnsignedIntegerFromMemory(rot_pointer + 8, ptr_size, 0, error);
+
+ m_process_wp = lldb::ProcessWP(process_sp);
+ }
+
+private:
+ ConstString m_name;
+ ObjCLanguageRuntime::ObjCISA m_isa;
+ ObjCLanguageRuntime::ObjCISA m_parent_isa;
+ bool m_valid;
+ lldb::ProcessWP m_process_wp;
+ uint64_t m_instance_size;
+};
+
+class ClassDescriptorV2Tagged : public ObjCLanguageRuntime::ClassDescriptor
+{
+public:
+ ClassDescriptorV2Tagged (ValueObject &isa_pointer)
+ {
+ m_valid = false;
+ uint64_t value = isa_pointer.GetValueAsUnsigned(0);
+ lldb::ProcessSP process_sp = isa_pointer.GetProcessSP();
+ if (process_sp)
+ m_pointer_size = process_sp->GetAddressByteSize();
+ else
+ {
+ m_name = ConstString("");
+ m_pointer_size = 0;
+ return;
+ }
+
+ m_valid = true;
+ m_class_bits = (value & 0xE) >> 1;
+ lldb::TargetSP target_sp = isa_pointer.GetTargetSP();
+
+ LazyBool is_lion = IsLion(target_sp);
+
+ // TODO: check for OSX version - for now assume Mtn Lion
+ if (is_lion == eLazyBoolCalculate)
+ {
+ // if we can't determine the matching table (e.g. we have no Foundation),
+ // assume this is not a valid tagged pointer
+ m_valid = false;
+ }
+ else if (is_lion == eLazyBoolNo)
+ {
+ switch (m_class_bits)
+ {
+ case 0:
+ m_name = ConstString("NSAtom");
+ break;
+ case 3:
+ m_name = ConstString("NSNumber");
+ break;
+ case 4:
+ m_name = ConstString("NSDateTS");
+ break;
+ case 5:
+ m_name = ConstString("NSManagedObject");
+ break;
+ case 6:
+ m_name = ConstString("NSDate");
+ break;
+ default:
+ m_valid = false;
+ break;
+ }
+ }
+ else
+ {
+ switch (m_class_bits)
+ {
+ case 1:
+ m_name = ConstString("NSNumber");
+ break;
+ case 5:
+ m_name = ConstString("NSManagedObject");
+ break;
+ case 6:
+ m_name = ConstString("NSDate");
+ break;
+ case 7:
+ m_name = ConstString("NSDateTS");
+ break;
+ default:
+ m_valid = false;
+ break;
+ }
+ }
+ if (!m_valid)
+ m_name = ConstString("");
+ else
+ {
+ m_info_bits = (value & 0xF0ULL) >> 4;
+ m_value_bits = (value & ~0x0000000000000000FFULL) >> 8;
+ }
+ }
+
+ virtual ConstString
+ GetClassName ()
+ {
+ return m_name;
+ }
+
+ virtual ObjCLanguageRuntime::ClassDescriptorSP
+ GetSuperclass ()
+ {
+ // tagged pointers can represent a class that has a superclass, but since that information is not
+ // stored in the object itself, we would have to query the runtime to discover the hierarchy
+ // for the time being, we skip this step in the interest of static discovery
+ return ObjCLanguageRuntime::ClassDescriptorSP(new ObjCLanguageRuntime::ClassDescriptor_Invalid());
+ }
+
+ virtual bool
+ IsValid ()
+ {
+ return m_valid;
+ }
+
+ virtual bool
+ IsKVO ()
+ {
+ return false; // tagged pointers are not KVO'ed
+ }
+
+ virtual bool
+ IsCFType ()
+ {
+ return false; // tagged pointers are not CF objects
+ }
+
+ virtual bool
+ IsTagged ()
+ {
+ return true; // we use this class to describe tagged pointers
+ }
+
+ virtual uint64_t
+ GetInstanceSize ()
+ {
+ return (IsValid() ? m_pointer_size : 0);
+ }
+
+ virtual ObjCLanguageRuntime::ObjCISA
+ GetISA ()
+ {
+ return 0; // tagged pointers have no ISA
+ }
+
+ virtual uint64_t
+ GetClassBits ()
+ {
+ return (IsValid() ? m_class_bits : 0);
+ }
+
+ // these calls are not part of any formal tagged pointers specification
+ virtual uint64_t
+ GetValueBits ()
+ {
+ return (IsValid() ? m_value_bits : 0);
+ }
+
+ virtual uint64_t
+ GetInfoBits ()
+ {
+ return (IsValid() ? m_info_bits : 0);
+ }
+
+ virtual
+ ~ClassDescriptorV2Tagged ()
+ {}
+
+protected:
+ // TODO make this into a smarter OS version detector
+ LazyBool
+ IsLion (lldb::TargetSP &target_sp)
+ {
+ if (!target_sp)
+ return eLazyBoolCalculate;
+ ModuleList& modules = target_sp->GetImages();
+ for (uint32_t idx = 0; idx < modules.GetSize(); idx++)
+ {
+ lldb::ModuleSP module_sp = modules.GetModuleAtIndex(idx);
+ if (!module_sp)
+ continue;
+ if (strcmp(module_sp->GetFileSpec().GetFilename().AsCString(""),"Foundation") == 0)
+ {
+ uint32_t major = UINT32_MAX;
+ module_sp->GetVersion(&major,1);
+ if (major == UINT32_MAX)
+ return eLazyBoolCalculate;
+
+ return (major > 900 ? eLazyBoolNo : eLazyBoolYes);
+ }
+ }
+ return eLazyBoolCalculate;
+ }
+
+private:
+ ConstString m_name;
+ uint8_t m_pointer_size;
+ bool m_valid;
+ uint64_t m_class_bits;
+ uint64_t m_info_bits;
+ uint64_t m_value_bits;
+};
+
+ObjCLanguageRuntime::ClassDescriptorSP
+AppleObjCRuntimeV2::GetClassDescriptor (ObjCISA isa)
+{
+ ObjCLanguageRuntime::ISAToDescriptorIterator found = m_isa_to_descriptor_cache.find(isa);
+ ObjCLanguageRuntime::ISAToDescriptorIterator end = m_isa_to_descriptor_cache.end();
+
+ if (found != end && found->second)
+ return found->second;
+
+ ClassDescriptorSP descriptor = ClassDescriptorSP(new ClassDescriptorV2(isa,m_process->CalculateProcess()));
+ if (descriptor && descriptor->IsValid())
+ m_isa_to_descriptor_cache[descriptor->GetISA()] = descriptor;
+ return descriptor;
+}
+
+ObjCLanguageRuntime::ClassDescriptorSP
+AppleObjCRuntimeV2::GetClassDescriptor (ValueObject& in_value)
+{
+ uint64_t ptr_value = in_value.GetValueAsUnsigned(0);
+ if (ptr_value == 0)
+ return ObjCLanguageRuntime::ClassDescriptorSP();
+
+ ObjCISA isa = GetISA(in_value);
+
+ ObjCLanguageRuntime::ISAToDescriptorIterator found = m_isa_to_descriptor_cache.find(isa);
+ ObjCLanguageRuntime::ISAToDescriptorIterator end = m_isa_to_descriptor_cache.end();
+
+ if (found != end && found->second)
+ return found->second;
+
+ ClassDescriptorSP descriptor;
+
+ if (ptr_value & 1)
+ return ClassDescriptorSP(new ClassDescriptorV2Tagged(in_value)); // do not save tagged pointers
+ descriptor = ClassDescriptorSP(new ClassDescriptorV2(in_value));
+
+ if (descriptor && descriptor->IsValid())
+ m_isa_to_descriptor_cache[descriptor->GetISA()] = descriptor;
+ return descriptor;
+}
+
ModuleSP FindLibobjc (Target &target)
{
ModuleList& modules = target.GetImages();
@@ -1287,243 +1671,3 @@
return m_type_vendor_ap.get();
}
-
-AppleObjCRuntimeV2::ClassDescriptorV2::ClassDescriptorV2 (ValueObject &isa_pointer)
-{
- ObjCISA ptr_value = isa_pointer.GetValueAsUnsigned(0);
-
- lldb::ProcessSP process_sp = isa_pointer.GetProcessSP();
-
- Initialize (ptr_value,process_sp);
-}
-
-AppleObjCRuntimeV2::ClassDescriptorV2::ClassDescriptorV2 (ObjCISA isa, lldb::ProcessSP process_sp)
-{
- Initialize (isa, process_sp);
-}
-
-void
-AppleObjCRuntimeV2::ClassDescriptorV2::Initialize (ObjCISA isa, lldb::ProcessSP process_sp)
-{
- if (!isa || !process_sp)
- {
- m_valid = false;
- return;
- }
-
- m_valid = true;
-
- Error error;
-
- m_isa = process_sp->ReadPointerFromMemory(isa, error);
-
- if (error.Fail())
- {
- m_valid = false;
- return;
- }
-
- uint32_t ptr_size = process_sp->GetAddressByteSize();
-
- if (!IsPointerValid(m_isa,ptr_size,false,false,true))
- {
- m_valid = false;
- return;
- }
-
- lldb::addr_t data_ptr = process_sp->ReadPointerFromMemory(m_isa + 4 * ptr_size, error);
-
- if (error.Fail())
- {
- m_valid = false;
- return;
- }
-
- if (!IsPointerValid(data_ptr,ptr_size,false,false,true))
- {
- m_valid = false;
- return;
- }
-
- m_parent_isa = process_sp->ReadPointerFromMemory(isa + ptr_size,error);
-
- if (error.Fail())
- {
- m_valid = false;
- return;
- }
-
- // sanity checks
- lldb::addr_t cache_ptr = process_sp->ReadPointerFromMemory(m_isa + 2*ptr_size, error);
- if (error.Fail())
- {
- m_valid = false;
- return;
- }
- if (!IsPointerValid(cache_ptr,ptr_size,true,false,true))
- {
- m_valid = false;
- return;
- }
-
- // now construct the data object
-
- lldb::addr_t rot_pointer = process_sp->ReadPointerFromMemory(data_ptr + 8, error);
-
- if (error.Fail())
- {
- m_valid = false;
- return;
- }
-
- if (!IsPointerValid(rot_pointer,ptr_size))
- {
- m_valid = false;
- return;
- }
-
- // now read from the rot
-
- lldb::addr_t name_ptr = process_sp->ReadPointerFromMemory(rot_pointer + (ptr_size == 8 ? 24 : 16) ,error);
-
- if (error.Fail())
- {
- m_valid = false;
- return;
- }
-
- lldb::DataBufferSP buffer_sp(new DataBufferHeap(1024, 0));
-
- size_t count = process_sp->ReadCStringFromMemory(name_ptr, (char*)buffer_sp->GetBytes(), 1024, error);
-
- if (error.Fail())
- {
- m_valid = false;
- return;
- }
-
- if (count)
- m_name = ConstString((char*)buffer_sp->GetBytes());
- else
- m_name = ConstString();
-
- m_instance_size = process_sp->ReadUnsignedIntegerFromMemory(rot_pointer + 8, ptr_size, 0, error);
-
- m_process_wp = lldb::ProcessWP(process_sp);
-}
-
-AppleObjCRuntime::ClassDescriptorSP
-AppleObjCRuntimeV2::ClassDescriptorV2::GetSuperclass ()
-{
- if (!m_valid)
- return ObjCLanguageRuntime::ClassDescriptorSP();
- ProcessSP process_sp = m_process_wp.lock();
- if (!process_sp)
- return ObjCLanguageRuntime::ClassDescriptorSP();
- return AppleObjCRuntime::ClassDescriptorSP(new AppleObjCRuntimeV2::ClassDescriptorV2(m_parent_isa,process_sp));
-}
-
-AppleObjCRuntimeV2::ClassDescriptorV2Tagged::ClassDescriptorV2Tagged (ValueObject &isa_pointer)
-{
- m_valid = false;
- uint64_t value = isa_pointer.GetValueAsUnsigned(0);
- lldb::ProcessSP process_sp = isa_pointer.GetProcessSP();
- if (process_sp)
- m_pointer_size = process_sp->GetAddressByteSize();
- else
- {
- m_name = ConstString("");
- m_pointer_size = 0;
- return;
- }
-
- m_valid = true;
- m_class_bits = (value & 0xE) >> 1;
- lldb::TargetSP target_sp = isa_pointer.GetTargetSP();
-
- LazyBool is_lion = IsLion(target_sp);
-
- // TODO: check for OSX version - for now assume Mtn Lion
- if (is_lion == eLazyBoolCalculate)
- {
- // if we can't determine the matching table (e.g. we have no Foundation),
- // assume this is not a valid tagged pointer
- m_valid = false;
- }
- else if (is_lion == eLazyBoolNo)
- {
- switch (m_class_bits)
- {
- case 0:
- m_name = ConstString("NSAtom");
- break;
- case 3:
- m_name = ConstString("NSNumber");
- break;
- case 4:
- m_name = ConstString("NSDateTS");
- break;
- case 5:
- m_name = ConstString("NSManagedObject");
- break;
- case 6:
- m_name = ConstString("NSDate");
- break;
- default:
- m_valid = false;
- break;
- }
- }
- else
- {
- switch (m_class_bits)
- {
- case 1:
- m_name = ConstString("NSNumber");
- break;
- case 5:
- m_name = ConstString("NSManagedObject");
- break;
- case 6:
- m_name = ConstString("NSDate");
- break;
- case 7:
- m_name = ConstString("NSDateTS");
- break;
- default:
- m_valid = false;
- break;
- }
- }
- if (!m_valid)
- m_name = ConstString("");
- else
- {
- m_info_bits = (value & 0xF0ULL) >> 4;
- m_value_bits = (value & ~0x0000000000000000FFULL) >> 8;
- }
-}
-
-LazyBool
-AppleObjCRuntimeV2::ClassDescriptorV2Tagged::IsLion (lldb::TargetSP &target_sp)
-{
- if (!target_sp)
- return eLazyBoolCalculate;
- ModuleList& modules = target_sp->GetImages();
- for (uint32_t idx = 0; idx < modules.GetSize(); idx++)
- {
- lldb::ModuleSP module_sp = modules.GetModuleAtIndex(idx);
- if (!module_sp)
- continue;
- if (strcmp(module_sp->GetFileSpec().GetFilename().AsCString(""),"Foundation") == 0)
- {
- uint32_t major = UINT32_MAX;
- module_sp->GetVersion(&major,1);
- if (major == UINT32_MAX)
- return eLazyBoolCalculate;
-
- return (major > 900 ? eLazyBoolNo : eLazyBoolYes);
- }
- }
- return eLazyBoolCalculate;
-}
Modified: lldb/trunk/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV2.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV2.h?rev=164049&r1=164048&r2=164049&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV2.h (original)
+++ lldb/trunk/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV2.h Mon Sep 17 14:30:47 2012
@@ -27,165 +27,6 @@
public AppleObjCRuntime
{
public:
-
- class ClassDescriptorV2 : public ObjCLanguageRuntime::ClassDescriptor
- {
- public:
- ClassDescriptorV2 (ValueObject &isa_pointer);
- ClassDescriptorV2 (ObjCISA isa, lldb::ProcessSP process);
-
- virtual ConstString
- GetClassName ()
- {
- return m_name;
- }
-
- virtual ClassDescriptorSP
- GetSuperclass ();
-
- virtual bool
- IsValid ()
- {
- return m_valid;
- }
-
- virtual bool
- IsTagged ()
- {
- return false; // we use a special class for tagged descriptors
- }
-
- virtual uint64_t
- GetInstanceSize ()
- {
- return m_instance_size;
- }
-
- virtual ObjCISA
- GetISA ()
- {
- return m_isa;
- }
-
- virtual
- ~ClassDescriptorV2 ()
- {}
-
- protected:
- virtual bool
- CheckPointer (lldb::addr_t value,
- uint32_t ptr_size)
- {
- if (ptr_size != 8)
- return true;
- return ((value & 0xFFFF800000000000) == 0);
- }
-
- void
- Initialize (ObjCISA isa, lldb::ProcessSP process_sp);
-
- private:
- ConstString m_name;
- ObjCISA m_isa;
- ObjCISA m_parent_isa;
- bool m_valid;
- lldb::ProcessWP m_process_wp;
- uint64_t m_instance_size;
- };
-
- class ClassDescriptorV2Tagged : public ObjCLanguageRuntime::ClassDescriptor
- {
- public:
- ClassDescriptorV2Tagged (ValueObject &isa_pointer);
-
- virtual ConstString
- GetClassName ()
- {
- return m_name;
- }
-
- virtual ClassDescriptorSP
- GetSuperclass ()
- {
- // tagged pointers can represent a class that has a superclass, but since that information is not
- // stored in the object itself, we would have to query the runtime to discover the hierarchy
- // for the time being, we skip this step in the interest of static discovery
- return ClassDescriptorSP(new ObjCLanguageRuntime::ClassDescriptor_Invalid());
- }
-
- virtual bool
- IsValid ()
- {
- return m_valid;
- }
-
- virtual bool
- IsKVO ()
- {
- return false; // tagged pointers are not KVO'ed
- }
-
- virtual bool
- IsCFType ()
- {
- return false; // tagged pointers are not CF objects
- }
-
- virtual bool
- IsTagged ()
- {
- return true; // we use this class to describe tagged pointers
- }
-
- virtual uint64_t
- GetInstanceSize ()
- {
- return (IsValid() ? m_pointer_size : 0);
- }
-
- virtual ObjCISA
- GetISA ()
- {
- return 0; // tagged pointers have no ISA
- }
-
- virtual uint64_t
- GetClassBits ()
- {
- return (IsValid() ? m_class_bits : 0);
- }
-
- // these calls are not part of any formal tagged pointers specification
- virtual uint64_t
- GetValueBits ()
- {
- return (IsValid() ? m_value_bits : 0);
- }
-
- virtual uint64_t
- GetInfoBits ()
- {
- return (IsValid() ? m_info_bits : 0);
- }
-
- virtual
- ~ClassDescriptorV2Tagged ()
- {}
-
- protected:
- // TODO make this into a smarter OS version detector
- LazyBool
- IsLion (lldb::TargetSP &target_sp);
-
- private:
- ConstString m_name;
- uint8_t m_pointer_size;
- bool m_valid;
- uint64_t m_class_bits;
- uint64_t m_info_bits;
- uint64_t m_value_bits;
- };
-
virtual ~AppleObjCRuntimeV2() { }
// These are generic runtime functions:
More information about the lldb-commits
mailing list