diff options
author | Jason Molenda <jmolenda@apple.com> | 2017-08-15 21:23:14 +0000 |
---|---|---|
committer | Jason Molenda <jmolenda@apple.com> | 2017-08-15 21:23:14 +0000 |
commit | 4d77d156cb73d42e01117530eb1612b93b81a281 (patch) | |
tree | ca1ea0ac9aa4659d27b1294adcabc2dfef484a82 /source/Plugins/Language/ObjC/NSSet.cpp | |
parent | 64f617114cd4aa4084d11073dca574f2abcda4ce (diff) |
Update NSArray/NSDictionary/NSSet formatters to handle new
macOS 10.13 - High Sierra - internal layouts. Patch by
Sean Callanan.
<rdar://problem/33282015>
git-svn-id: https://llvm.org/svn/llvm-project/lldb/trunk@310959 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'source/Plugins/Language/ObjC/NSSet.cpp')
-rw-r--r-- | source/Plugins/Language/ObjC/NSSet.cpp | 84 |
1 files changed, 77 insertions, 7 deletions
diff --git a/source/Plugins/Language/ObjC/NSSet.cpp b/source/Plugins/Language/ObjC/NSSet.cpp index 2f3398775..fa2483ecc 100644 --- a/source/Plugins/Language/ObjC/NSSet.cpp +++ b/source/Plugins/Language/ObjC/NSSet.cpp @@ -135,7 +135,7 @@ namespace Foundation1300 { GenericNSSetMSyntheticFrontEnd<DataDescriptor_32, DataDescriptor_64>; } -namespace Foundation1400 { +namespace Foundation1428 { struct DataDescriptor_32 { uint32_t _used : 26; uint32_t _size; @@ -154,6 +154,64 @@ namespace Foundation1400 { GenericNSSetMSyntheticFrontEnd<DataDescriptor_32, DataDescriptor_64>; } +namespace Foundation1437 { + struct DataDescriptor_32 { + uint32_t _cow; + // __table storage + uint32_t _objs_addr; + union { + uint32_t _mutations; + struct { + uint32_t _muts; + uint32_t _used : 26; + uint32_t _szidx : 6; + }; + }; + }; + + struct DataDescriptor_64 { + uint64_t _cow; + // __Table storage + uint64_t _objs_addr; + union { + uint64_t _mutations; + struct { + uint32_t _muts; + uint32_t _used : 26; + uint32_t _szidx : 6; + }; + }; + }; + + using NSSetMSyntheticFrontEnd = + GenericNSSetMSyntheticFrontEnd<DataDescriptor_32, DataDescriptor_64>; + + template <typename DD> + uint64_t + __NSSetMSize_Impl(lldb_private::Process &process, lldb::addr_t valobj_addr, + Status &error) { + const lldb::addr_t start_of_descriptor = + valobj_addr + process.GetAddressByteSize(); + DD descriptor = DD(); + process.ReadMemory(start_of_descriptor, &descriptor, sizeof(descriptor), + error); + if (error.Fail()) { + return 0; + } + return descriptor._used; + } + + uint64_t + __NSSetMSize(lldb_private::Process &process, lldb::addr_t valobj_addr, + Status &error) { + if (process.GetAddressByteSize() == 4) { + return __NSSetMSize_Impl<DataDescriptor_32>(process, valobj_addr, error); + } else { + return __NSSetMSize_Impl<DataDescriptor_64>(process, valobj_addr, error); + } + } +} + class NSSetCodeRunningSyntheticFrontEnd : public SyntheticChildrenFrontEnd { public: NSSetCodeRunningSyntheticFrontEnd(lldb::ValueObjectSP valobj_sp); @@ -219,12 +277,18 @@ bool lldb_private::formatters::NSSetSummaryProvider( return false; value &= (is_64bit ? ~0xFC00000000000000UL : ~0xFC000000U); } else if (!strcmp(class_name, "__NSSetM")) { + AppleObjCRuntime *apple_runtime = + llvm::dyn_cast_or_null<AppleObjCRuntime>(runtime); Status error; - value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + ptr_size, - ptr_size, 0, error); + if (apple_runtime && apple_runtime->GetFoundationVersion() >= 1437) { + value = Foundation1437::__NSSetMSize(*process_sp, valobj_addr, error); + } else { + value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + ptr_size, + ptr_size, 0, error); + value &= (is_64bit ? ~0xFC00000000000000UL : ~0xFC000000U); + } if (error.Fail()) return false; - value &= (is_64bit ? ~0xFC00000000000000UL : ~0xFC000000U); } /*else if (!strcmp(class_name,"__NSCFSet")) { @@ -312,10 +376,16 @@ lldb_private::formatters::NSSetSyntheticFrontEndCreator( } else if (!strcmp(class_name, "__NSSetM")) { AppleObjCRuntime *apple_runtime = llvm::dyn_cast_or_null<AppleObjCRuntime>(runtime); - if (apple_runtime && apple_runtime->GetFoundationVersion() >= 1400) - return (new Foundation1400::NSSetMSyntheticFrontEnd(valobj_sp)); - else + if (apple_runtime) { + if (apple_runtime->GetFoundationVersion() >= 1437) + return (new Foundation1437::NSSetMSyntheticFrontEnd(valobj_sp)); + else if (apple_runtime->GetFoundationVersion() >= 1428) + return (new Foundation1428::NSSetMSyntheticFrontEnd(valobj_sp)); + else + return (new Foundation1300::NSSetMSyntheticFrontEnd(valobj_sp)); + } else { return (new Foundation1300::NSSetMSyntheticFrontEnd(valobj_sp)); + } } else { auto &map(NSSet_Additionals::GetAdditionalSynthetics()); auto iter = map.find(class_name_cs), end = map.end(); |