[Lldb-commits] [lldb] r251007 - Make SymbolFileDWARF::GetCachedSectionData thread safe
Tamas Berghammer via lldb-commits
lldb-commits at lists.llvm.org
Thu Oct 22 04:14:38 PDT 2015
Author: tberghammer
Date: Thu Oct 22 06:14:37 2015
New Revision: 251007
URL: http://llvm.org/viewvc/llvm-project?rev=251007&view=rev
Log:
Make SymbolFileDWARF::GetCachedSectionData thread safe
Differential revision: http://reviews.llvm.org/D13942
Modified:
lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h
lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDwo.cpp
lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDwo.h
Modified: lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp?rev=251007&r1=251006&r2=251007&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp (original)
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp Thu Oct 22 06:14:37 2015
@@ -429,7 +429,6 @@ SymbolFileDWARF::SymbolFileDWARF(ObjectF
UserID (0), // Used by SymbolFileDWARFDebugMap to when this class parses .o files to contain the .o file index/ID
m_debug_map_module_wp (),
m_debug_map_symfile (NULL),
- m_flags(),
m_data_debug_abbrev (),
m_data_debug_aranges (),
m_data_debug_frame (),
@@ -509,7 +508,6 @@ SymbolFileDWARF::InitializeObject()
if (module_sp)
{
const SectionList *section_list = module_sp->GetSectionList();
-
const Section* section = section_list->FindSectionByName(GetDWARFMachOSegmentName ()).get();
// Memory map the DWARF mach-o segment so we have everything mmap'ed
@@ -517,19 +515,24 @@ SymbolFileDWARF::InitializeObject()
if (section)
m_obj_file->MemoryMapSectionData(section, m_dwarf_data);
}
+
get_apple_names_data();
- if (m_data_apple_names.GetByteSize() > 0)
+ if (m_data_apple_names.m_data.GetByteSize() > 0)
{
- m_apple_names_ap.reset (new DWARFMappedHash::MemoryTable (m_data_apple_names, get_debug_str_data(), ".apple_names"));
+ m_apple_names_ap.reset (new DWARFMappedHash::MemoryTable (m_data_apple_names.m_data,
+ get_debug_str_data(),
+ ".apple_names"));
if (m_apple_names_ap->IsValid())
m_using_apple_tables = true;
else
m_apple_names_ap.reset();
}
get_apple_types_data();
- if (m_data_apple_types.GetByteSize() > 0)
+ if (m_data_apple_types.m_data.GetByteSize() > 0)
{
- m_apple_types_ap.reset (new DWARFMappedHash::MemoryTable (m_data_apple_types, get_debug_str_data(), ".apple_types"));
+ m_apple_types_ap.reset (new DWARFMappedHash::MemoryTable (m_data_apple_types.m_data,
+ get_debug_str_data(),
+ ".apple_types"));
if (m_apple_types_ap->IsValid())
m_using_apple_tables = true;
else
@@ -537,9 +540,11 @@ SymbolFileDWARF::InitializeObject()
}
get_apple_namespaces_data();
- if (m_data_apple_namespaces.GetByteSize() > 0)
+ if (m_data_apple_namespaces.m_data.GetByteSize() > 0)
{
- m_apple_namespaces_ap.reset (new DWARFMappedHash::MemoryTable (m_data_apple_namespaces, get_debug_str_data(), ".apple_namespaces"));
+ m_apple_namespaces_ap.reset (new DWARFMappedHash::MemoryTable (m_data_apple_namespaces.m_data,
+ get_debug_str_data(),
+ ".apple_namespaces"));
if (m_apple_namespaces_ap->IsValid())
m_using_apple_tables = true;
else
@@ -547,9 +552,11 @@ SymbolFileDWARF::InitializeObject()
}
get_apple_objc_data();
- if (m_data_apple_objc.GetByteSize() > 0)
+ if (m_data_apple_objc.m_data.GetByteSize() > 0)
{
- m_apple_objc_ap.reset (new DWARFMappedHash::MemoryTable (m_data_apple_objc, get_debug_str_data(), ".apple_objc"));
+ m_apple_objc_ap.reset (new DWARFMappedHash::MemoryTable (m_data_apple_objc.m_data,
+ get_debug_str_data(),
+ ".apple_objc"));
if (m_apple_objc_ap->IsValid())
m_using_apple_tables = true;
else
@@ -591,46 +598,10 @@ SymbolFileDWARF::CalculateAbilities ()
section = section_list->FindSectionByType (eSectionTypeDWARFDebugAbbrev, true).get();
if (section)
debug_abbrev_file_size = section->GetFileSize();
- else
- m_flags.Set (flagsGotDebugAbbrevData);
-
- section = section_list->FindSectionByType (eSectionTypeDWARFDebugAranges, true).get();
- if (!section)
- m_flags.Set (flagsGotDebugArangesData);
-
- section = section_list->FindSectionByType (eSectionTypeDWARFDebugFrame, true).get();
- if (!section)
- m_flags.Set (flagsGotDebugFrameData);
section = section_list->FindSectionByType (eSectionTypeDWARFDebugLine, true).get();
if (section)
debug_line_file_size = section->GetFileSize();
- else
- m_flags.Set (flagsGotDebugLineData);
-
- section = section_list->FindSectionByType (eSectionTypeDWARFDebugLoc, true).get();
- if (!section)
- m_flags.Set (flagsGotDebugLocData);
-
- section = section_list->FindSectionByType (eSectionTypeDWARFDebugMacInfo, true).get();
- if (!section)
- m_flags.Set (flagsGotDebugMacInfoData);
-
- section = section_list->FindSectionByType (eSectionTypeDWARFDebugPubNames, true).get();
- if (!section)
- m_flags.Set (flagsGotDebugPubNamesData);
-
- section = section_list->FindSectionByType (eSectionTypeDWARFDebugPubTypes, true).get();
- if (!section)
- m_flags.Set (flagsGotDebugPubTypesData);
-
- section = section_list->FindSectionByType (eSectionTypeDWARFDebugRanges, true).get();
- if (!section)
- m_flags.Set (flagsGotDebugRangesData);
-
- section = section_list->FindSectionByType (eSectionTypeDWARFDebugStr, true).get();
- if (!section)
- m_flags.Set (flagsGotDebugStrData);
}
else
{
@@ -665,116 +636,122 @@ SymbolFileDWARF::CalculateAbilities ()
}
const DWARFDataExtractor&
-SymbolFileDWARF::GetCachedSectionData (uint32_t got_flag, SectionType sect_type, DWARFDataExtractor &data)
+SymbolFileDWARF::GetCachedSectionData (lldb::SectionType sect_type, DWARFDataSegment& data_segment)
+{
+ std::call_once(data_segment.m_flag,
+ &SymbolFileDWARF::LoadSectionData,
+ this,
+ sect_type,
+ std::ref(data_segment.m_data));
+ return data_segment.m_data;
+}
+
+void
+SymbolFileDWARF::LoadSectionData (lldb::SectionType sect_type, DWARFDataExtractor& data)
{
- if (m_flags.IsClear (got_flag))
+ ModuleSP module_sp (m_obj_file->GetModule());
+ const SectionList *section_list = module_sp->GetSectionList();
+ if (section_list)
{
- ModuleSP module_sp (m_obj_file->GetModule());
- m_flags.Set (got_flag);
- const SectionList *section_list = module_sp->GetSectionList();
- if (section_list)
+ SectionSP section_sp (section_list->FindSectionByType(sect_type, true));
+ if (section_sp)
{
- SectionSP section_sp (section_list->FindSectionByType(sect_type, true));
- if (section_sp)
+ // See if we memory mapped the DWARF segment?
+ if (m_dwarf_data.GetByteSize())
{
- // See if we memory mapped the DWARF segment?
- if (m_dwarf_data.GetByteSize())
- {
- data.SetData(m_dwarf_data, section_sp->GetOffset (), section_sp->GetFileSize());
- }
- else
- {
- if (m_obj_file->ReadSectionData (section_sp.get(), data) == 0)
- data.Clear();
- }
+ data.SetData(m_dwarf_data, section_sp->GetOffset(), section_sp->GetFileSize());
+ }
+ else
+ {
+ if (m_obj_file->ReadSectionData(section_sp.get(), data) == 0)
+ data.Clear();
}
}
}
- return data;
}
const DWARFDataExtractor&
SymbolFileDWARF::get_debug_abbrev_data()
{
- return GetCachedSectionData (flagsGotDebugAbbrevData, eSectionTypeDWARFDebugAbbrev, m_data_debug_abbrev);
+ return GetCachedSectionData (eSectionTypeDWARFDebugAbbrev, m_data_debug_abbrev);
}
const DWARFDataExtractor&
SymbolFileDWARF::get_debug_addr_data()
{
- return GetCachedSectionData (flagsGotDebugAddrData, eSectionTypeDWARFDebugAddr, m_data_debug_addr);
+ return GetCachedSectionData (eSectionTypeDWARFDebugAddr, m_data_debug_addr);
}
const DWARFDataExtractor&
SymbolFileDWARF::get_debug_aranges_data()
{
- return GetCachedSectionData (flagsGotDebugArangesData, eSectionTypeDWARFDebugAranges, m_data_debug_aranges);
+ return GetCachedSectionData (eSectionTypeDWARFDebugAranges, m_data_debug_aranges);
}
const DWARFDataExtractor&
SymbolFileDWARF::get_debug_frame_data()
{
- return GetCachedSectionData (flagsGotDebugFrameData, eSectionTypeDWARFDebugFrame, m_data_debug_frame);
+ return GetCachedSectionData (eSectionTypeDWARFDebugFrame, m_data_debug_frame);
}
const DWARFDataExtractor&
SymbolFileDWARF::get_debug_info_data()
{
- return GetCachedSectionData (flagsGotDebugInfoData, eSectionTypeDWARFDebugInfo, m_data_debug_info);
+ return GetCachedSectionData (eSectionTypeDWARFDebugInfo, m_data_debug_info);
}
const DWARFDataExtractor&
SymbolFileDWARF::get_debug_line_data()
{
- return GetCachedSectionData (flagsGotDebugLineData, eSectionTypeDWARFDebugLine, m_data_debug_line);
+ return GetCachedSectionData (eSectionTypeDWARFDebugLine, m_data_debug_line);
}
const DWARFDataExtractor&
SymbolFileDWARF::get_debug_loc_data()
{
- return GetCachedSectionData (flagsGotDebugLocData, eSectionTypeDWARFDebugLoc, m_data_debug_loc);
+ return GetCachedSectionData (eSectionTypeDWARFDebugLoc, m_data_debug_loc);
}
const DWARFDataExtractor&
SymbolFileDWARF::get_debug_ranges_data()
{
- return GetCachedSectionData (flagsGotDebugRangesData, eSectionTypeDWARFDebugRanges, m_data_debug_ranges);
+ return GetCachedSectionData (eSectionTypeDWARFDebugRanges, m_data_debug_ranges);
}
const DWARFDataExtractor&
SymbolFileDWARF::get_debug_str_data()
{
- return GetCachedSectionData (flagsGotDebugStrData, eSectionTypeDWARFDebugStr, m_data_debug_str);
+ return GetCachedSectionData (eSectionTypeDWARFDebugStr, m_data_debug_str);
}
const DWARFDataExtractor&
SymbolFileDWARF::get_debug_str_offsets_data()
{
- return GetCachedSectionData (flagsGotDebugStrOffsetsData, eSectionTypeDWARFDebugStrOffsets, m_data_debug_str_offsets);
+ return GetCachedSectionData (eSectionTypeDWARFDebugStrOffsets, m_data_debug_str_offsets);
}
const DWARFDataExtractor&
SymbolFileDWARF::get_apple_names_data()
{
- return GetCachedSectionData (flagsGotAppleNamesData, eSectionTypeDWARFAppleNames, m_data_apple_names);
+ return GetCachedSectionData (eSectionTypeDWARFAppleNames, m_data_apple_names);
}
const DWARFDataExtractor&
SymbolFileDWARF::get_apple_types_data()
{
- return GetCachedSectionData (flagsGotAppleTypesData, eSectionTypeDWARFAppleTypes, m_data_apple_types);
+ return GetCachedSectionData (eSectionTypeDWARFAppleTypes, m_data_apple_types);
}
const DWARFDataExtractor&
SymbolFileDWARF::get_apple_namespaces_data()
{
- return GetCachedSectionData (flagsGotAppleNamespacesData, eSectionTypeDWARFAppleNamespaces, m_data_apple_namespaces);
+ return GetCachedSectionData (eSectionTypeDWARFAppleNamespaces, m_data_apple_namespaces);
}
const DWARFDataExtractor&
SymbolFileDWARF::get_apple_objc_data()
{
- return GetCachedSectionData (flagsGotAppleObjCData, eSectionTypeDWARFAppleObjC, m_data_apple_objc);
+ return GetCachedSectionData (eSectionTypeDWARFAppleObjC, m_data_apple_objc);
}
Modified: lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h?rev=251007&r1=251006&r2=251007&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h (original)
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h Thu Oct 22 06:14:37 2015
@@ -14,6 +14,7 @@
// C++ Includes
#include <list>
#include <map>
+#include <mutex>
#include <set>
#include <vector>
@@ -265,32 +266,16 @@ public:
DWARFDebugRanges*
DebugRanges();
+
const DWARFDebugRanges*
DebugRanges() const;
- virtual const lldb_private::DWARFDataExtractor&
- GetCachedSectionData (uint32_t got_flag,
- lldb::SectionType sect_type,
- lldb_private::DWARFDataExtractor &data);
-
static bool
SupportedVersion(uint16_t version);
DWARFDIE
GetDeclContextDIEContainingDIE (const DWARFDIE &die);
- lldb_private::Flags&
- GetFlags ()
- {
- return m_flags;
- }
-
- const lldb_private::Flags&
- GetFlags () const
- {
- return m_flags;
- }
-
bool
HasForwardDeclForClangType (const lldb_private::CompilerType &compiler_type);
@@ -326,27 +311,20 @@ protected:
typedef llvm::DenseMap<const DWARFDebugInfoEntry *, lldb::opaque_compiler_type_t> DIEToClangType;
typedef llvm::DenseMap<lldb::opaque_compiler_type_t, DIERef> ClangTypeToDIE;
- enum
+ struct DWARFDataSegment
{
- flagsGotDebugAbbrevData = (1 << 0),
- flagsGotDebugAddrData = (1 << 1),
- flagsGotDebugArangesData = (1 << 2),
- flagsGotDebugFrameData = (1 << 3),
- flagsGotDebugInfoData = (1 << 4),
- flagsGotDebugLineData = (1 << 5),
- flagsGotDebugLocData = (1 << 6),
- flagsGotDebugMacInfoData = (1 << 7),
- flagsGotDebugPubNamesData = (1 << 8),
- flagsGotDebugPubTypesData = (1 << 9),
- flagsGotDebugRangesData = (1 << 10),
- flagsGotDebugStrData = (1 << 11),
- flagsGotDebugStrOffsetsData = (1 << 12),
- flagsGotAppleNamesData = (1 << 13),
- flagsGotAppleTypesData = (1 << 14),
- flagsGotAppleNamespacesData = (1 << 15),
- flagsGotAppleObjCData = (1 << 16)
+ std::once_flag m_flag;
+ lldb_private::DWARFDataExtractor m_data;
};
-
+
+ DISALLOW_COPY_AND_ASSIGN (SymbolFileDWARF);
+
+ const lldb_private::DWARFDataExtractor&
+ GetCachedSectionData (lldb::SectionType sect_type, DWARFDataSegment& data_segment);
+
+ virtual void
+ LoadSectionData (lldb::SectionType sect_type, lldb_private::DWARFDataExtractor& data);
+
bool
DeclContextMatchesThisSymbolFile (const lldb_private::CompilerDeclContext *decl_ctx);
@@ -354,8 +332,6 @@ protected:
DIEInDeclContext (const lldb_private::CompilerDeclContext *parent_decl_ctx,
const DWARFDIE &die);
- DISALLOW_COPY_AND_ASSIGN (SymbolFileDWARF);
-
virtual DWARFCompileUnit*
GetDWARFCompileUnit (lldb_private::CompileUnit *comp_unit);
@@ -542,22 +518,22 @@ protected:
lldb::ModuleWP m_debug_map_module_wp;
SymbolFileDWARFDebugMap * m_debug_map_symfile;
- lldb_private::Flags m_flags;
lldb_private::DWARFDataExtractor m_dwarf_data;
- lldb_private::DWARFDataExtractor m_data_debug_abbrev;
- lldb_private::DWARFDataExtractor m_data_debug_addr;
- lldb_private::DWARFDataExtractor m_data_debug_aranges;
- lldb_private::DWARFDataExtractor m_data_debug_frame;
- lldb_private::DWARFDataExtractor m_data_debug_info;
- lldb_private::DWARFDataExtractor m_data_debug_line;
- lldb_private::DWARFDataExtractor m_data_debug_loc;
- lldb_private::DWARFDataExtractor m_data_debug_ranges;
- lldb_private::DWARFDataExtractor m_data_debug_str;
- lldb_private::DWARFDataExtractor m_data_debug_str_offsets;
- lldb_private::DWARFDataExtractor m_data_apple_names;
- lldb_private::DWARFDataExtractor m_data_apple_types;
- lldb_private::DWARFDataExtractor m_data_apple_namespaces;
- lldb_private::DWARFDataExtractor m_data_apple_objc;
+
+ DWARFDataSegment m_data_debug_abbrev;
+ DWARFDataSegment m_data_debug_addr;
+ DWARFDataSegment m_data_debug_aranges;
+ DWARFDataSegment m_data_debug_frame;
+ DWARFDataSegment m_data_debug_info;
+ DWARFDataSegment m_data_debug_line;
+ DWARFDataSegment m_data_debug_loc;
+ DWARFDataSegment m_data_debug_ranges;
+ DWARFDataSegment m_data_debug_str;
+ DWARFDataSegment m_data_debug_str_offsets;
+ DWARFDataSegment m_data_apple_names;
+ DWARFDataSegment m_data_apple_types;
+ DWARFDataSegment m_data_apple_namespaces;
+ DWARFDataSegment m_data_apple_objc;
// The unique pointer items below are generated on demand if and when someone accesses
// them through a non const version of this class.
Modified: lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDwo.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDwo.cpp?rev=251007&r1=251006&r2=251007&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDwo.cpp (original)
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDwo.cpp Thu Oct 22 06:14:37 2015
@@ -27,14 +27,9 @@ SymbolFileDWARFDwo::SymbolFileDWARFDwo(O
SetID(((lldb::user_id_t)dwarf_cu->GetOffset())<<32);
}
-const lldb_private::DWARFDataExtractor&
-SymbolFileDWARFDwo::GetCachedSectionData(uint32_t got_flag,
- lldb::SectionType sect_type,
- lldb_private::DWARFDataExtractor &data)
+void
+SymbolFileDWARFDwo::LoadSectionData (lldb::SectionType sect_type, DWARFDataExtractor& data)
{
- if (!m_flags.IsClear (got_flag))
- return data;
-
const SectionList* section_list = m_obj_file->GetSectionList(false /* update_module_section_list */);
if (section_list)
{
@@ -45,20 +40,17 @@ SymbolFileDWARFDwo::GetCachedSectionData
if (m_dwarf_data.GetByteSize())
{
data.SetData(m_dwarf_data, section_sp->GetOffset(), section_sp->GetFileSize());
- m_flags.Set (got_flag);
- return data;
+ return;
}
if (m_obj_file->ReadSectionData(section_sp.get(), data) != 0)
- {
- m_flags.Set (got_flag);
- return data;
- }
+ return;
data.Clear();
}
}
- return SymbolFileDWARF::GetCachedSectionData(got_flag, sect_type, data);
+
+ SymbolFileDWARF::LoadSectionData(sect_type, data);
}
lldb::CompUnitSP
Modified: lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDwo.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDwo.h?rev=251007&r1=251006&r2=251007&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDwo.h (original)
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDwo.h Thu Oct 22 06:14:37 2015
@@ -23,11 +23,6 @@ public:
~SymbolFileDWARFDwo() override = default;
- const lldb_private::DWARFDataExtractor&
- GetCachedSectionData(uint32_t got_flag,
- lldb::SectionType sect_type,
- lldb_private::DWARFDataExtractor &data) override;
-
lldb::CompUnitSP
ParseCompileUnit(DWARFCompileUnit* dwarf_cu, uint32_t cu_idx) override;
@@ -44,6 +39,9 @@ public:
GetTypeSystemForLanguage(lldb::LanguageType language) override;
protected:
+ void
+ LoadSectionData (lldb::SectionType sect_type, lldb_private::DWARFDataExtractor& data) override;
+
DIEToTypePtr&
GetDIEToType() override;
More information about the lldb-commits
mailing list