[Lldb-commits] [PATCH] D137191: [lldb] Add information on type systems to statistics dump command

Alex Langford via Phabricator via lldb-commits lldb-commits at lists.llvm.org
Tue Nov 1 13:41:11 PDT 2022


bulbazord created this revision.
bulbazord added reviewers: clayborg, JDevlieghere, aprantl.
Herald added a project: All.
bulbazord requested review of this revision.
Herald added a project: LLDB.
Herald added a subscriber: lldb-commits.

Context: I plan on using this change primarily downstream in the apple fork of llvm to track swift module loading time.

The idea is that TypeSystems from modules can self-report statistics when performing the statistics dump of a module.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D137191

Files:
  lldb/include/lldb/Core/Module.h
  lldb/include/lldb/Symbol/TypeSystem.h
  lldb/source/Core/Module.cpp
  lldb/source/Symbol/TypeSystem.cpp
  lldb/source/Target/Statistics.cpp


Index: lldb/source/Target/Statistics.cpp
===================================================================
--- lldb/source/Target/Statistics.cpp
+++ lldb/source/Target/Statistics.cpp
@@ -256,7 +256,20 @@
     debug_parse_time += module_stat.debug_parse_time;
     debug_index_time += module_stat.debug_index_time;
     debug_info_size += module_stat.debug_info_size;
-    json_modules.emplace_back(module_stat.ToJSON());
+    json::Value module_stat_json = module_stat.ToJSON();
+    module->ForEachTypeSystem([&](TypeSystem *ts) {
+      if (ts) {
+        json::Object *module_stat_obj = module_stat_json.getAsObject();
+        if (!module_stat_obj)
+          return false;
+        auto stats = ts->ReportStatistics();
+        if (stats.hasValue()) {
+          module_stat_obj->try_emplace("TypeSystemInfo", stats.getValue());
+        }
+      }
+      return true;
+    });
+    json_modules.emplace_back(module_stat_json);
   }
 
   ConstStringStats const_string_stats;
Index: lldb/source/Symbol/TypeSystem.cpp
===================================================================
--- lldb/source/Symbol/TypeSystem.cpp
+++ lldb/source/Symbol/TypeSystem.cpp
@@ -178,6 +178,10 @@
   return {};
 }
 
+llvm::Optional<llvm::json::Value> TypeSystem::ReportStatistics() {
+  return llvm::None;
+}
+
 #pragma mark TypeSystemMap
 
 TypeSystemMap::TypeSystemMap() : m_mutex(), m_map() {}
Index: lldb/source/Core/Module.cpp
===================================================================
--- lldb/source/Core/Module.cpp
+++ lldb/source/Core/Module.cpp
@@ -369,6 +369,11 @@
   return m_type_system_map.GetTypeSystemForLanguage(language, this, true);
 }
 
+void Module::ForEachTypeSystem(
+    std::function<bool(TypeSystem *)> const &callback) {
+  m_type_system_map.ForEach(callback);
+}
+
 void Module::ParseAllDebugSymbols() {
   std::lock_guard<std::recursive_mutex> guard(m_mutex);
   size_t num_comp_units = GetNumCompileUnits();
Index: lldb/include/lldb/Symbol/TypeSystem.h
===================================================================
--- lldb/include/lldb/Symbol/TypeSystem.h
+++ lldb/include/lldb/Symbol/TypeSystem.h
@@ -19,6 +19,7 @@
 #include "llvm/ADT/SmallBitVector.h"
 #include "llvm/Support/Casting.h"
 #include "llvm/Support/Error.h"
+#include "llvm/Support/JSON.h"
 
 #include "lldb/Core/PluginInterface.h"
 #include "lldb/Expression/Expression.h"
@@ -510,6 +511,8 @@
   // meaningless type itself, instead preferring to use the dynamic type
   virtual bool IsMeaninglessWithoutDynamicResolution(void *type);
 
+  virtual llvm::Optional<llvm::json::Value> ReportStatistics();
+
 protected:
   SymbolFile *m_sym_file = nullptr;
 };
Index: lldb/include/lldb/Core/Module.h
===================================================================
--- lldb/include/lldb/Core/Module.h
+++ lldb/include/lldb/Core/Module.h
@@ -814,6 +814,8 @@
   llvm::Expected<TypeSystem &>
   GetTypeSystemForLanguage(lldb::LanguageType language);
 
+  void ForEachTypeSystem(std::function<bool(TypeSystem *)> const &callback);
+
   // Special error functions that can do printf style formatting that will
   // prepend the message with something appropriate for this module (like the
   // architecture, path and object name (if any)). This centralizes code so


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D137191.472387.patch
Type: text/x-patch
Size: 3260 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20221101/f56fc336/attachment.bin>


More information about the lldb-commits mailing list