summaryrefslogtreecommitdiffstats
path: root/lldb/source/Plugins/Language
diff options
context:
space:
mode:
authorKuba Mracek <mracek@apple.com>2018-11-12 21:26:03 +0000
committerKuba Mracek <mracek@apple.com>2018-11-12 21:26:03 +0000
commit377912845e5f67e9d13aadbd226618bcac319781 (patch)
treea5f2d17bdba6a5da4469998a79abbee45c28c035 /lldb/source/Plugins/Language
parent87e403aa4f62d7385999041abce5fdadb8741a47 (diff)
downloadbcm5719-llvm-377912845e5f67e9d13aadbd226618bcac319781.tar.gz
bcm5719-llvm-377912845e5f67e9d13aadbd226618bcac319781.zip
[lldb] Add synthetic frontend for _NSCallStackArray
An Obj-C array type _NSCallStackArray is used in NSException backtraces. This patch adds a synthetic frontend for _NSCallStackArray, which now correctly returns frame PCs. Differential Revision: https://reviews.llvm.org/D44081 llvm-svn: 346708
Diffstat (limited to 'lldb/source/Plugins/Language')
-rw-r--r--lldb/source/Plugins/Language/ObjC/NSArray.cpp27
-rw-r--r--lldb/source/Plugins/Language/ObjC/ObjCLanguage.cpp7
2 files changed, 33 insertions, 1 deletions
diff --git a/lldb/source/Plugins/Language/ObjC/NSArray.cpp b/lldb/source/Plugins/Language/ObjC/NSArray.cpp
index 8c6467ee23f..6c110da9ecc 100644
--- a/lldb/source/Plugins/Language/ObjC/NSArray.cpp
+++ b/lldb/source/Plugins/Language/ObjC/NSArray.cpp
@@ -214,6 +214,25 @@ namespace Foundation1437 {
}
+namespace CallStackArray {
+struct DataDescriptor_32 {
+ uint32_t _data;
+ uint32_t _used;
+ uint32_t _offset;
+ const uint32_t _size = 0;
+};
+
+struct DataDescriptor_64 {
+ uint64_t _data;
+ uint64_t _used;
+ uint64_t _offset;
+ const uint64_t _size = 0;
+};
+
+using NSCallStackArraySyntheticFrontEnd =
+ GenericNSArrayMSyntheticFrontEnd<DataDescriptor_32, DataDescriptor_64>;
+} // namespace CallStackArray
+
template <typename D32, typename D64, bool Inline>
class GenericNSArrayISyntheticFrontEnd : public SyntheticChildrenFrontEnd {
public:
@@ -364,6 +383,7 @@ bool lldb_private::formatters::NSArraySummaryProvider(
static const ConstString g_NSArrayCF("__NSCFArray");
static const ConstString g_NSArrayMLegacy("__NSArrayM_Legacy");
static const ConstString g_NSArrayMImmutable("__NSArrayM_Immutable");
+ static const ConstString g_NSCallStackArray("_NSCallStackArray");
if (class_name.IsEmpty())
return false;
@@ -413,7 +433,9 @@ bool lldb_private::formatters::NSArraySummaryProvider(
value = 0;
} else if (class_name == g_NSArray1) {
value = 1;
- } else if (class_name == g_NSArrayCF) {
+ } else if (class_name == g_NSArrayCF || class_name == g_NSCallStackArray) {
+ // __NSCFArray and _NSCallStackArray store the number of elements as a
+ // pointer-sized value at offset `2 * ptr_size`.
Status error;
value = process_sp->ReadUnsignedIntegerFromMemory(
valobj_addr + 2 * ptr_size, ptr_size, 0, error);
@@ -813,6 +835,7 @@ lldb_private::formatters::NSArraySyntheticFrontEndCreator(
static const ConstString g_NSArray1("__NSSingleObjectArrayI");
static const ConstString g_NSArrayMLegacy("__NSArrayM_Legacy");
static const ConstString g_NSArrayMImmutable("__NSArrayM_Immutable");
+ static const ConstString g_NSCallStackArray("_NSCallStackArray");
if (class_name.IsEmpty())
return nullptr;
@@ -842,6 +865,8 @@ lldb_private::formatters::NSArraySyntheticFrontEndCreator(
return (new Foundation1010::NSArrayMSyntheticFrontEnd(valobj_sp));
else
return (new Foundation109::NSArrayMSyntheticFrontEnd(valobj_sp));
+ } else if (class_name == g_NSCallStackArray) {
+ return (new CallStackArray::NSCallStackArraySyntheticFrontEnd(valobj_sp));
} else {
auto &map(NSArray_Additionals::GetAdditionalSynthetics());
auto iter = map.find(class_name), end = map.end();
diff --git a/lldb/source/Plugins/Language/ObjC/ObjCLanguage.cpp b/lldb/source/Plugins/Language/ObjC/ObjCLanguage.cpp
index c149b0d90e1..0598d69f6eb 100644
--- a/lldb/source/Plugins/Language/ObjC/ObjCLanguage.cpp
+++ b/lldb/source/Plugins/Language/ObjC/ObjCLanguage.cpp
@@ -409,6 +409,9 @@ static void LoadObjCFormatters(TypeCategoryImplSP objc_category_sp) {
"NSArray summary provider", ConstString("__NSCFArray"), appkit_flags);
AddCXXSummary(
objc_category_sp, lldb_private::formatters::NSArraySummaryProvider,
+ "NSArray summary provider", ConstString("_NSCallStackArray"), appkit_flags);
+ AddCXXSummary(
+ objc_category_sp, lldb_private::formatters::NSArraySummaryProvider,
"NSArray summary provider", ConstString("CFArrayRef"), appkit_flags);
AddCXXSummary(objc_category_sp,
lldb_private::formatters::NSArraySummaryProvider,
@@ -528,6 +531,10 @@ static void LoadObjCFormatters(TypeCategoryImplSP objc_category_sp) {
ScriptedSyntheticChildren::Flags());
AddCXXSynthetic(objc_category_sp,
lldb_private::formatters::NSArraySyntheticFrontEndCreator,
+ "NSArray synthetic children", ConstString("_NSCallStackArray"),
+ ScriptedSyntheticChildren::Flags());
+ AddCXXSynthetic(objc_category_sp,
+ lldb_private::formatters::NSArraySyntheticFrontEndCreator,
"NSArray synthetic children",
ConstString("CFMutableArrayRef"),
ScriptedSyntheticChildren::Flags());
OpenPOWER on IntegriCloud