[Lldb-commits] [PATCH] D44081: [lldb] Add synthetic frontend for _NSCallStackArray

2018-11-12 Thread Phabricator via Phabricator via lldb-commits
This revision was automatically updated to reflect the committed changes.
Closed by commit rLLDB346708: [lldb] Add synthetic frontend for 
_NSCallStackArray (authored by kuba.brecka, committed by ).

Changed prior to commit:
  https://reviews.llvm.org/D44081?vs=173695=173749#toc

Repository:
  rLLDB LLDB

https://reviews.llvm.org/D44081

Files:
  packages/Python/lldbsuite/test/lang/objc/exceptions/TestObjCExceptions.py
  source/Plugins/Language/ObjC/NSArray.cpp
  source/Plugins/Language/ObjC/ObjCLanguage.cpp

Index: source/Plugins/Language/ObjC/ObjCLanguage.cpp
===
--- source/Plugins/Language/ObjC/ObjCLanguage.cpp
+++ source/Plugins/Language/ObjC/ObjCLanguage.cpp
@@ -409,6 +409,9 @@
   "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 @@
   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());
Index: source/Plugins/Language/ObjC/NSArray.cpp
===
--- source/Plugins/Language/ObjC/NSArray.cpp
+++ source/Plugins/Language/ObjC/NSArray.cpp
@@ -214,6 +214,25 @@
 
 }
 
+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;
+} // namespace CallStackArray
+
 template 
 class GenericNSArrayISyntheticFrontEnd : public SyntheticChildrenFrontEnd {
 public:
@@ -364,6 +383,7 @@
   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 @@
 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 @@
   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 @@
   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 (NSArray_Additionals::GetAdditionalSynthetics());
 auto iter = map.find(class_name), end = map.end();
Index: packages/Python/lldbsuite/test/lang/objc/exceptions/TestObjCExceptions.py
===
--- packages/Python/lldbsuite/test/lang/objc/exceptions/TestObjCExceptions.py
+++ packages/Python/lldbsuite/test/lang/objc/exceptions/TestObjCExceptions.py
@@ -28,7 +28,8 @@
 self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
 substrs=['stopped', 'stop reason = breakpoint'])
 
-thread = self.dbg.GetSelectedTarget().GetProcess().GetSelectedThread()
+target = self.dbg.GetSelectedTarget()
+thread = target.GetProcess().GetSelectedThread()
 frame = thread.GetSelectedFrame()
 
 self.expect(
@@ -87,4 +88,13 @@
 self.assertEqual(userInfo.summary, "1 key/value pair")
 

[Lldb-commits] [PATCH] D44081: [lldb] Add synthetic frontend for _NSCallStackArray

2018-11-12 Thread Davide Italiano via Phabricator via lldb-commits
davide accepted this revision.
davide added a comment.
This revision is now accepted and ready to land.

Thanks for addressing my comments.


https://reviews.llvm.org/D44081



___
lldb-commits mailing list
lldb-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits


[Lldb-commits] [PATCH] D44081: [lldb] Add synthetic frontend for _NSCallStackArray

2018-11-12 Thread Kuba (Brecka) Mracek via Phabricator via lldb-commits
kubamracek marked an inline comment as done.
kubamracek added inline comments.



Comment at: source/Plugins/Language/ObjC/NSArray.cpp:446-451
+  } else if (class_name == g_NSCallStackArray) {
+Status error;
+value = process_sp->ReadUnsignedIntegerFromMemory(
+valobj_addr + 2 * ptr_size, ptr_size, 0, error);
+if (error.Fail())
+  return false;

davide wrote:
> Can you add a comment here?
> this also seems exactly the same as `NSArrayCF`, any chance we can avoid the 
> duplication?
Added comment and de-duplicated the branch.


https://reviews.llvm.org/D44081



___
lldb-commits mailing list
lldb-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits


[Lldb-commits] [PATCH] D44081: [lldb] Add synthetic frontend for _NSCallStackArray

2018-11-12 Thread Kuba (Brecka) Mracek via Phabricator via lldb-commits
kubamracek updated this revision to Diff 173695.

https://reviews.llvm.org/D44081

Files:
  packages/Python/lldbsuite/test/lang/objc/exceptions/TestObjCExceptions.py
  source/Plugins/Language/ObjC/NSArray.cpp
  source/Plugins/Language/ObjC/ObjCLanguage.cpp

Index: packages/Python/lldbsuite/test/lang/objc/exceptions/TestObjCExceptions.py
===
--- packages/Python/lldbsuite/test/lang/objc/exceptions/TestObjCExceptions.py
+++ packages/Python/lldbsuite/test/lang/objc/exceptions/TestObjCExceptions.py
@@ -28,7 +28,8 @@
 self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
 substrs=['stopped', 'stop reason = breakpoint'])
 
-thread = self.dbg.GetSelectedTarget().GetProcess().GetSelectedThread()
+target = self.dbg.GetSelectedTarget()
+thread = target.GetProcess().GetSelectedThread()
 frame = thread.GetSelectedFrame()
 
 self.expect(
@@ -87,4 +88,14 @@
 self.assertEqual(userInfo.summary, "1 key/value pair")
 self.assertEqual(userInfo.GetChildAtIndex(0).GetChildAtIndex(0).description, "some_key")
 self.assertEqual(userInfo.GetChildAtIndex(0).GetChildAtIndex(1).description, "some_value")
-self.assertGreater(e2.GetChildMemberWithName("reserved").dynamic.num_children, 0)
+reserved = e2.GetChildMemberWithName("reserved").dynamic
+self.assertGreater(reserved.num_children, 0)
+callStackReturnAddresses = [reserved.GetChildAtIndex(i).GetChildAtIndex(1) for i in range(0, reserved.GetNumChildren())
+if reserved.GetChildAtIndex(i).GetChildAtIndex(0).description == "callStackReturnAddresses"][0].dynamic
+self.assertEqual(callStackReturnAddresses.summary, '@"5 elements"')
+children = [callStackReturnAddresses.GetChildAtIndex(i) for i in range(0, callStackReturnAddresses.num_children)]
+
+pcs = [i.unsigned for i in children]
+names = [target.ResolveSymbolContextForAddress(lldb.SBAddress(pc, target), lldb.eSymbolContextSymbol).GetSymbol().name for pc in pcs]
+for n in ["objc_exception_throw", "foo", "main"]:
+self.assertTrue(n in names, "%s is in the exception backtrace (%s)" % (n, names))
Index: source/Plugins/Language/ObjC/ObjCLanguage.cpp
===
--- source/Plugins/Language/ObjC/ObjCLanguage.cpp
+++ source/Plugins/Language/ObjC/ObjCLanguage.cpp
@@ -409,6 +409,9 @@
   "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 @@
   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());
Index: source/Plugins/Language/ObjC/NSArray.cpp
===
--- source/Plugins/Language/ObjC/NSArray.cpp
+++ source/Plugins/Language/ObjC/NSArray.cpp
@@ -214,6 +214,25 @@
 
 }
 
+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;
+} // namespace CallStackArray
+
 template 
 class GenericNSArrayISyntheticFrontEnd : public SyntheticChildrenFrontEnd {
 public:
@@ -364,6 +383,7 @@
   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 @@
 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 

[Lldb-commits] [PATCH] D44081: [lldb] Add synthetic frontend for _NSCallStackArray

2018-11-12 Thread Davide Italiano via Phabricator via lldb-commits
davide requested changes to this revision.
davide added inline comments.
This revision now requires changes to proceed.



Comment at: source/Plugins/Language/ObjC/NSArray.cpp:446-451
+  } else if (class_name == g_NSCallStackArray) {
+Status error;
+value = process_sp->ReadUnsignedIntegerFromMemory(
+valobj_addr + 2 * ptr_size, ptr_size, 0, error);
+if (error.Fail())
+  return false;

Can you add a comment here?
this also seems exactly the same as `NSArrayCF`, any chance we can avoid the 
duplication?


https://reviews.llvm.org/D44081



___
lldb-commits mailing list
lldb-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits


[Lldb-commits] [PATCH] D44081: [lldb] Add synthetic frontend for _NSCallStackArray

2018-11-11 Thread Kuba (Brecka) Mracek via Phabricator via lldb-commits
kubamracek added a reviewer: aprantl.
kubamracek added a comment.

Ping.


https://reviews.llvm.org/D44081



___
lldb-commits mailing list
lldb-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits


[Lldb-commits] [PATCH] D44081: [lldb] Add synthetic frontend for _NSCallStackArray

2018-03-04 Thread Kuba (Brecka) Mracek via Phabricator via lldb-commits
kubamracek created this revision.
kubamracek added reviewers: jingham, jasonmolenda, davide.

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.


https://reviews.llvm.org/D44081

Files:
  packages/Python/lldbsuite/test/lang/objc/exceptions/TestObjCExceptions.py
  source/Plugins/Language/ObjC/NSArray.cpp
  source/Plugins/Language/ObjC/ObjCLanguage.cpp

Index: source/Plugins/Language/ObjC/ObjCLanguage.cpp
===
--- source/Plugins/Language/ObjC/ObjCLanguage.cpp
+++ source/Plugins/Language/ObjC/ObjCLanguage.cpp
@@ -412,6 +412,9 @@
   AddCXXSummary(
   objc_category_sp, lldb_private::formatters::NSArraySummaryProvider,
   "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);
@@ -531,6 +534,10 @@
   lldb_private::formatters::NSArraySyntheticFrontEndCreator,
   "NSArray synthetic children", ConstString("__NSCFArray"),
   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",
Index: source/Plugins/Language/ObjC/NSArray.cpp
===
--- source/Plugins/Language/ObjC/NSArray.cpp
+++ source/Plugins/Language/ObjC/NSArray.cpp
@@ -218,6 +218,25 @@
 
 }
 
+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;
+} // namespace CallStackArray
+
 template 
 class GenericNSArrayISyntheticFrontEnd : public SyntheticChildrenFrontEnd {
 public:
@@ -368,6 +387,7 @@
   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;
@@ -423,6 +443,12 @@
 valobj_addr + 2 * ptr_size, ptr_size, 0, error);
 if (error.Fail())
   return false;
+  } else if (class_name == g_NSCallStackArray) {
+Status error;
+value = process_sp->ReadUnsignedIntegerFromMemory(
+valobj_addr + 2 * ptr_size, ptr_size, 0, error);
+if (error.Fail())
+  return false;
   } else {
 auto (NSArray_Additionals::GetAdditionalSummaries());
 auto iter = map.find(class_name), end = map.end();
@@ -817,6 +843,7 @@
   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;
@@ -846,6 +873,8 @@
   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 (NSArray_Additionals::GetAdditionalSynthetics());
 auto iter = map.find(class_name), end = map.end();
Index: packages/Python/lldbsuite/test/lang/objc/exceptions/TestObjCExceptions.py
===
--- packages/Python/lldbsuite/test/lang/objc/exceptions/TestObjCExceptions.py
+++ packages/Python/lldbsuite/test/lang/objc/exceptions/TestObjCExceptions.py
@@ -28,7 +28,8 @@
 self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
 substrs=['stopped', 'stop reason = breakpoint'])
 
-thread = self.dbg.GetSelectedTarget().GetProcess().GetSelectedThread()
+target = self.dbg.GetSelectedTarget()
+thread = target.GetProcess().GetSelectedThread()
 frame = thread.GetSelectedFrame()
 
 self.expect(
@@ -87,4 +88,14 @@