tberghammer removed rL LLVM as the repository for this revision.
tberghammer updated this revision to Diff 38128.
tberghammer added a comment.

I tried out the implementation you suggests and made some measurements. The 
difference between the 2 implementation when attaching to LLDB is negligible 
(the total time spent in SymbolFileDWARF::Index differed by ~1%). The 
interesting part is that your implementation is faster for parsing C++ 
libraries (e.g. liblldb, libstdc++) while mine implementation is faster for 
parsing C libraries (libc, libm, libdl) and I don't understand why it is 
happening.

With the current measurements in place I don't feel strongly about any version, 
so if somebody have a strong preference then please let me know.

I plan to recommit this change after committing http://reviews.llvm.org/D13940 
as that one fixes the remaining race conditions related to this change I found 
so far with TSAN


http://reviews.llvm.org/D13662

Files:
  source/Plugins/SymbolFile/DWARF/NameToDIE.cpp
  source/Plugins/SymbolFile/DWARF/NameToDIE.h
  source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp

Index: source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
===================================================================
--- source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
+++ source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
@@ -50,6 +50,8 @@
 
 #include "lldb/Target/Language.h"
 
+#include "lldb/Utility/TaskPool.h"
+
 #include "DWARFASTParser.h"
 #include "DWARFCompileUnit.h"
 #include "DWARFDebugAbbrev.h"
@@ -2015,37 +2017,77 @@
     DWARFDebugInfo* debug_info = DebugInfo();
     if (debug_info)
     {
-        uint32_t cu_idx = 0;
         const uint32_t num_compile_units = GetNumCompileUnits();
-        for (cu_idx = 0; cu_idx < num_compile_units; ++cu_idx)
+        std::vector<NameToDIE> function_basename_index(num_compile_units);
+        std::vector<NameToDIE> function_fullname_index(num_compile_units);
+        std::vector<NameToDIE> function_method_index(num_compile_units);
+        std::vector<NameToDIE> function_selector_index(num_compile_units);
+        std::vector<NameToDIE> objc_class_selectors_index(num_compile_units);
+        std::vector<NameToDIE> global_index(num_compile_units);
+        std::vector<NameToDIE> type_index(num_compile_units);
+        std::vector<NameToDIE> namespace_index(num_compile_units);
+        
+        auto parser_fn = [this,
+                          debug_info,
+                          &function_basename_index,
+                          &function_fullname_index,
+                          &function_method_index,
+                          &function_selector_index,
+                          &objc_class_selectors_index,
+                          &global_index,
+                          &type_index,
+                          &namespace_index](uint32_t cu_idx)
         {
             DWARFCompileUnit* dwarf_cu = debug_info->GetCompileUnitAtIndex(cu_idx);
+            bool clear_dies = dwarf_cu->ExtractDIEsIfNeeded(false) > 1;
 
-            bool clear_dies = dwarf_cu->ExtractDIEsIfNeeded (false) > 1;
+            dwarf_cu->Index(function_basename_index[cu_idx],
+                            function_fullname_index[cu_idx],
+                            function_method_index[cu_idx],
+                            function_selector_index[cu_idx],
+                            objc_class_selectors_index[cu_idx],
+                            global_index[cu_idx],
+                            type_index[cu_idx],
+                            namespace_index[cu_idx]);
 
-            dwarf_cu->Index (m_function_basename_index,
-                             m_function_fullname_index,
-                             m_function_method_index,
-                             m_function_selector_index,
-                             m_objc_class_selectors_index,
-                             m_global_index, 
-                             m_type_index,
-                             m_namespace_index);
-            
             // Keep memory down by clearing DIEs if this generate function
             // caused them to be parsed
             if (clear_dies)
-                dwarf_cu->ClearDIEs (true);
+                dwarf_cu->ClearDIEs(true);
+
+            return cu_idx;
+        };
+
+        TaskRunner<uint32_t> task_runner;
+        for (uint32_t cu_idx = 0; cu_idx < num_compile_units; ++cu_idx)
+            task_runner.AddTask(parser_fn, cu_idx);
+
+        while (true)
+        {
+            std::future<uint32_t> f = task_runner.WaitForNextCompletedTask();
+            if (!f.valid())
+                break;
+            uint32_t cu_idx = f.get();
+
+            m_function_basename_index.Append(function_basename_index[cu_idx]);
+            m_function_fullname_index.Append(function_fullname_index[cu_idx]);
+            m_function_method_index.Append(function_method_index[cu_idx]);
+            m_function_selector_index.Append(function_selector_index[cu_idx]);
+            m_objc_class_selectors_index.Append(objc_class_selectors_index[cu_idx]);
+            m_global_index.Append(global_index[cu_idx]);
+            m_type_index.Append(type_index[cu_idx]);
+            m_namespace_index.Append(namespace_index[cu_idx]);
         }
-        
-        m_function_basename_index.Finalize();
-        m_function_fullname_index.Finalize();
-        m_function_method_index.Finalize();
-        m_function_selector_index.Finalize();
-        m_objc_class_selectors_index.Finalize();
-        m_global_index.Finalize(); 
-        m_type_index.Finalize();
-        m_namespace_index.Finalize();
+
+        TaskPool::RunTasks(
+            [&]() { m_function_basename_index.Finalize(); },
+            [&]() { m_function_fullname_index.Finalize(); },
+            [&]() { m_function_method_index.Finalize(); },
+            [&]() { m_function_selector_index.Finalize(); },
+            [&]() { m_objc_class_selectors_index.Finalize(); },
+            [&]() { m_global_index.Finalize(); },
+            [&]() { m_type_index.Finalize(); },
+            [&]() { m_namespace_index.Finalize(); });
 
 #if defined (ENABLE_DEBUG_PRINTF)
         StreamFile s(stdout, false);
Index: source/Plugins/SymbolFile/DWARF/NameToDIE.h
===================================================================
--- source/Plugins/SymbolFile/DWARF/NameToDIE.h
+++ source/Plugins/SymbolFile/DWARF/NameToDIE.h
@@ -38,6 +38,9 @@
     Insert (const lldb_private::ConstString& name, const DIERef& die_ref);
 
     void
+    Append (const NameToDIE& other);
+
+    void
     Finalize();
 
     size_t
Index: source/Plugins/SymbolFile/DWARF/NameToDIE.cpp
===================================================================
--- source/Plugins/SymbolFile/DWARF/NameToDIE.cpp
+++ source/Plugins/SymbolFile/DWARF/NameToDIE.cpp
@@ -83,3 +83,14 @@
             break;
     }
 }
+
+void
+NameToDIE::Append (const NameToDIE& other)
+{
+    const uint32_t size = other.m_map.GetSize();
+    for (uint32_t i = 0; i < size; ++i)
+    {
+        m_map.Append(other.m_map.GetCStringAtIndexUnchecked (i),
+                     other.m_map.GetValueAtIndexUnchecked (i));
+    }
+}
_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to