summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.cpp19
-rw-r--r--lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.h2
2 files changed, 18 insertions, 3 deletions
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.cpp
index 754ffed6ae3..d515dd73e12 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.cpp
+++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.cpp
@@ -41,9 +41,20 @@ DWARFUnit::~DWARFUnit() {}
// Parses a compile unit and indexes its DIEs if it hasn't already been done.
//----------------------------------------------------------------------
size_t DWARFUnit::ExtractDIEsIfNeeded(bool cu_die_only) {
- const size_t initial_die_array_size = m_die_array.size();
- if ((cu_die_only && initial_die_array_size > 0) || initial_die_array_size > 1)
- return 0; // Already parsed
+ size_t initial_die_array_size;
+ auto already_parsed = [cu_die_only, &initial_die_array_size, this]() -> bool {
+ initial_die_array_size = m_die_array.size();
+ return (cu_die_only && initial_die_array_size > 0)
+ || initial_die_array_size > 1;
+ };
+ {
+ llvm::sys::ScopedReader lock(m_extractdies_mutex);
+ if (already_parsed())
+ return 0;
+ }
+ llvm::sys::ScopedWriter lock(m_extractdies_mutex);
+ if (already_parsed())
+ return 0;
static Timer::Category func_cat(LLVM_PRETTY_FUNCTION);
Timer scoped_timer(
@@ -304,6 +315,8 @@ void DWARFUnit::SetAddrBase(dw_addr_t addr_base,
void DWARFUnit::ClearDIEs(bool keep_compile_unit_die) {
if (m_die_array.size() > 1) {
+ llvm::sys::ScopedWriter lock(m_extractdies_mutex);
+
// std::vectors never get any smaller when resized to a smaller size, or
// when clear() or erase() are called, the size will report that it is
// smaller, but the memory allocated remains intact (call capacity() to see
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.h b/lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.h
index 9be0f42ceb7..aaea60d6910 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.h
+++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.h
@@ -13,6 +13,7 @@
#include "DWARFDIE.h"
#include "DWARFDebugInfoEntry.h"
#include "lldb/lldb-enumerations.h"
+#include "llvm/Support/RWMutex.h"
class DWARFUnit;
class DWARFCompileUnit;
@@ -160,6 +161,7 @@ protected:
// If this is a dwo compile unit this is the offset of the base compile unit
// in the main object file
dw_offset_t m_base_obj_offset = DW_INVALID_OFFSET;
+ llvm::sys::RWMutex m_extractdies_mutex;
static void
IndexPrivate(DWARFUnit *dwarf_cu, const lldb::LanguageType cu_language,
OpenPOWER on IntegriCloud