[Lldb-commits] [lldb] r339504 - Use a DenseMap for looking up functions by UID in CompileUnit::FindFunctionByUID
Raphael Isemann via lldb-commits
lldb-commits at lists.llvm.org
Sat Aug 11 16:40:27 PDT 2018
Author: teemperor
Date: Sat Aug 11 16:40:27 2018
New Revision: 339504
URL: http://llvm.org/viewvc/llvm-project?rev=339504&view=rev
Log:
Use a DenseMap for looking up functions by UID in CompileUnit::FindFunctionByUID
Summary:
Instead of iterating over our vector of functions, we might as well use a map here to
directly get the function we need.
Thanks to Vedant for pointing this out.
Reviewers: vsk
Reviewed By: vsk
Subscribers: mgrang, lldb-commits
Differential Revision: https://reviews.llvm.org/D50225
Modified:
lldb/trunk/include/lldb/Symbol/CompileUnit.h
lldb/trunk/source/Core/Module.cpp
lldb/trunk/source/Symbol/CompileUnit.cpp
Modified: lldb/trunk/include/lldb/Symbol/CompileUnit.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Symbol/CompileUnit.h?rev=339504&r1=339503&r2=339504&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Symbol/CompileUnit.h (original)
+++ lldb/trunk/include/lldb/Symbol/CompileUnit.h Sat Aug 11 16:40:27 2018
@@ -18,6 +18,8 @@
#include "lldb/Utility/UserID.h"
#include "lldb/lldb-enumerations.h"
+#include "llvm/ADT/DenseMap.h"
+
namespace lldb_private {
//----------------------------------------------------------------------
/// @class CompileUnit CompileUnit.h "lldb/Symbol/CompileUnit.h"
@@ -163,21 +165,19 @@ public:
void GetDescription(Stream *s, lldb::DescriptionLevel level) const;
//------------------------------------------------------------------
- /// Get a shared pointer to a function in this compile unit by index.
+ /// Apply a lambda to each function in this compile unit.
///
- /// Typically called when iterating though all functions in a compile unit
- /// after all functions have been parsed. This provides raw access to the
- /// function shared pointer list and will not cause the SymbolFile plug-in
- /// to parse any unparsed functions.
+ /// This provides raw access to the function shared pointer list and will not
+ /// cause the SymbolFile plug-in to parse any unparsed functions.
///
- /// @param[in] idx
- /// An index into the function list.
+ /// @note Prefer using FindFunctionByUID over this if possible.
///
- /// @return
- /// A shared pointer to a function that might contain a NULL
- /// Function class pointer.
+ /// @param[in] lambda
+ /// The lambda that should be applied to every function. The lambda can
+ /// return true if the iteration should be aborted earlier.
//------------------------------------------------------------------
- lldb::FunctionSP GetFunctionAtIndex(size_t idx);
+ void ForeachFunction(
+ llvm::function_ref<bool(const lldb::FunctionSP &)> lambda) const;
//------------------------------------------------------------------
/// Dump the compile unit contents to the stream \a s.
@@ -415,9 +415,9 @@ protected:
lldb::LanguageType
m_language; ///< The programming language enumeration value.
Flags m_flags; ///< Compile unit flags that help with partial parsing.
- std::vector<lldb::FunctionSP> m_functions; ///< The sparsely populated list of
- ///shared pointers to functions
- ///< that gets populated as functions get partially parsed.
+
+ /// Maps UIDs to functions.
+ llvm::DenseMap<lldb::user_id_t, lldb::FunctionSP> m_functions_by_uid;
std::vector<ConstString> m_imported_modules; ///< All modules, including the
///current module, imported by
///this
Modified: lldb/trunk/source/Core/Module.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/Module.cpp?rev=339504&r1=339503&r2=339504&view=diff
==============================================================================
--- lldb/trunk/source/Core/Module.cpp (original)
+++ lldb/trunk/source/Core/Module.cpp Sat Aug 11 16:40:27 2018
@@ -371,15 +371,13 @@ void Module::ParseAllDebugSymbols() {
symbols->ParseCompileUnitFunctions(sc);
- for (size_t func_idx = 0;
- (sc.function = sc.comp_unit->GetFunctionAtIndex(func_idx).get()) !=
- nullptr;
- ++func_idx) {
+ sc.comp_unit->ForeachFunction([&sc, &symbols](const FunctionSP &f) {
+ sc.function = f.get();
symbols->ParseFunctionBlocks(sc);
-
// Parse the variables for this function and all its blocks
symbols->ParseVariablesForContext(sc);
- }
+ return false;
+ });
// Parse all types for this compile unit
sc.function = nullptr;
Modified: lldb/trunk/source/Symbol/CompileUnit.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Symbol/CompileUnit.cpp?rev=339504&r1=339503&r2=339504&view=diff
==============================================================================
--- lldb/trunk/source/Symbol/CompileUnit.cpp (original)
+++ lldb/trunk/source/Symbol/CompileUnit.cpp Sat Aug 11 16:40:27 2018
@@ -22,7 +22,7 @@ CompileUnit::CompileUnit(const lldb::Mod
lldb::LanguageType language,
lldb_private::LazyBool is_optimized)
: ModuleChild(module_sp), FileSpec(pathname, false), UserID(cu_sym_id),
- m_user_data(user_data), m_language(language), m_flags(0), m_functions(),
+ m_user_data(user_data), m_language(language), m_flags(0),
m_support_files(), m_line_table_ap(), m_variables(),
m_is_optimized(is_optimized) {
if (language != eLanguageTypeUnknown)
@@ -35,7 +35,7 @@ CompileUnit::CompileUnit(const lldb::Mod
lldb::LanguageType language,
lldb_private::LazyBool is_optimized)
: ModuleChild(module_sp), FileSpec(fspec), UserID(cu_sym_id),
- m_user_data(user_data), m_language(language), m_flags(0), m_functions(),
+ m_user_data(user_data), m_language(language), m_flags(0),
m_support_files(), m_line_table_ap(), m_variables(),
m_is_optimized(is_optimized) {
if (language != eLanguageTypeUnknown)
@@ -66,6 +66,22 @@ void CompileUnit::GetDescription(Stream
<< (const FileSpec &)*this << "\", language = \"" << language << '"';
}
+void CompileUnit::ForeachFunction(
+ llvm::function_ref<bool(const FunctionSP &)> lambda) const {
+ std::vector<lldb::FunctionSP> sorted_functions;
+ sorted_functions.reserve(m_functions_by_uid.size());
+ for (auto &p : m_functions_by_uid)
+ sorted_functions.push_back(p.second);
+ std::sort(sorted_functions.begin(), sorted_functions.end(),
+ [](const lldb::FunctionSP &a, const lldb::FunctionSP &b) {
+ return a->GetID() < b->GetID();
+ });
+
+ for (auto &f : sorted_functions)
+ if (lambda(f))
+ return;
+}
+
//----------------------------------------------------------------------
// Dump the current contents of this object. No functions that cause on demand
// parsing of functions, globals, statics are called, so this is a good
@@ -89,13 +105,12 @@ void CompileUnit::Dump(Stream *s, bool s
s->IndentLess();
}
- if (!m_functions.empty()) {
+ if (!m_functions_by_uid.empty()) {
s->IndentMore();
- std::vector<FunctionSP>::const_iterator pos;
- std::vector<FunctionSP>::const_iterator end = m_functions.end();
- for (pos = m_functions.begin(); pos != end; ++pos) {
- (*pos)->Dump(s, show_context);
- }
+ ForeachFunction([&s, show_context](const FunctionSP &f) {
+ f->Dump(s, show_context);
+ return false;
+ });
s->IndentLess();
s->EOL();
@@ -106,15 +121,7 @@ void CompileUnit::Dump(Stream *s, bool s
// Add a function to this compile unit
//----------------------------------------------------------------------
void CompileUnit::AddFunction(FunctionSP &funcSP) {
- // TODO: order these by address
- m_functions.push_back(funcSP);
-}
-
-FunctionSP CompileUnit::GetFunctionAtIndex(size_t idx) {
- FunctionSP funcSP;
- if (idx < m_functions.size())
- funcSP = m_functions[idx];
- return funcSP;
+ m_functions_by_uid[funcSP->GetID()] = funcSP;
}
//----------------------------------------------------------------------
@@ -163,18 +170,10 @@ FunctionSP CompileUnit::GetFunctionAtInd
//}
FunctionSP CompileUnit::FindFunctionByUID(lldb::user_id_t func_uid) {
- FunctionSP funcSP;
- if (!m_functions.empty()) {
- std::vector<FunctionSP>::const_iterator pos;
- std::vector<FunctionSP>::const_iterator end = m_functions.end();
- for (pos = m_functions.begin(); pos != end; ++pos) {
- if ((*pos)->GetID() == func_uid) {
- funcSP = *pos;
- break;
- }
- }
- }
- return funcSP;
+ auto it = m_functions_by_uid.find(func_uid);
+ if (it == m_functions_by_uid.end())
+ return FunctionSP();
+ return it->second;
}
lldb::LanguageType CompileUnit::GetLanguage() {
More information about the lldb-commits
mailing list