[Lldb-commits] [PATCH] D118972: Increase preallocated buffer for scanning the process objc classes

Jason Molenda via Phabricator via lldb-commits lldb-commits at lists.llvm.org
Thu Feb 3 23:29:33 PST 2022

jasonmolenda created this revision.
jasonmolenda added a reviewer: JDevlieghere.
jasonmolenda added a project: LLDB.
jasonmolenda requested review of this revision.
Herald added a subscriber: lldb-commits.

lldb allocates a buffer in the inferior, and runs an expression to fill it with information about all of the classes defined in the objective-c runtime.  We don't want to run two expressions for perf reasons, one to find the number of classes, then a second expression to fill in the buffer. (I think we had that code in the past tbh, and went with "this is big enough")

Our class list in some processes is approaching this limit.  This patch doubles it.  It increases the memory buffer from ~150kb to ~300kb, and it is freed shortly after the expression completes.  I also changed the name of the variable to make it easier to understand the nature of the failure if the assert is hit.

  rG LLVM Github Monorepo



Index: lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV2.cpp
--- lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV2.cpp
+++ lldb/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV2.cpp
@@ -2008,7 +2008,8 @@
       shared_cache_base_addr == LLDB_INVALID_ADDRESS)
     return DescriptorMapUpdateResult::Fail();
-  const uint32_t num_classes = 128 * 1024;
+  // The number of entries to pre-allocate room for
+  const uint32_t max_num_classes = 256 * 1024;
   UtilityFunction *get_class_info_code = GetClassInfoUtilityFunction(exe_ctx);
   if (!get_class_info_code) {
@@ -2030,7 +2031,7 @@
   DiagnosticManager diagnostics;
   const uint32_t class_info_byte_size = addr_size + 4;
-  const uint32_t class_infos_byte_size = num_classes * class_info_byte_size;
+  const uint32_t class_infos_byte_size = max_num_classes * class_info_byte_size;
   lldb::addr_t class_infos_addr = process->AllocateMemory(
       class_infos_byte_size, ePermissionsReadable | ePermissionsWritable, err);
   const uint32_t relative_selector_offset_addr_size = 64;
@@ -2096,10 +2097,12 @@
       num_class_infos = return_value.GetScalar().ULong();
       LLDB_LOG(log, "Discovered {0} Objective-C classes in the shared cache",
-      assert(num_class_infos <= num_classes);
+      // assert if there were more classes than we pre-allocated
+      // room for.
+      assert(num_class_infos <= max_num_classes);
       if (num_class_infos > 0) {
-        if (num_class_infos > num_classes) {
-          num_class_infos = num_classes;
+        if (num_class_infos > max_num_classes) {
+          num_class_infos = max_num_classes;
           success = false;
         } else {

-------------- next part --------------
A non-text attachment was scrubbed...
Name: D118972.405877.patch
Type: text/x-patch
Size: 1830 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20220204/3e42dcb0/attachment.bin>

More information about the lldb-commits mailing list