Modified the host process monitor callback function Host::StartMonitoringChildProcess
to spawn a thread for each process that is being monitored. Previously
LLDB would spawn a single thread that would wait for any child process which
isn't ok to do as a shared library (LLDB.framework on Mac OSX, or lldb.so on
linux). The old single thread used to call wait4() with a pid of -1 which
could cause it to reap child processes that it shouldn't have.
Re-wrote the way Function blocks are handles. Previously I attempted to keep
all blocks in a single memory allocation (in a std::vector). This made the
code somewhat efficient, but hard to work with. I got rid of the old BlockList
class, and went to a straight parent with children relationship. This new
approach will allow for partial parsing of the blocks within a function.
llvm-svn: 111706
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
index 96aec78..c64bb4a 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
+++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
@@ -785,8 +785,7 @@
static void
AddRangesToBlock
(
- BlockList& blocks,
- lldb::user_id_t blockID,
+ Block& block,
DWARFDebugRanges::RangeList& ranges,
addr_t block_base_addr
)
@@ -796,7 +795,7 @@
const DWARFDebugRanges::Range *debug_range;
for (range_idx = 0; (debug_range = ranges.RangeAtIndex(range_idx)) != NULL; range_idx++)
{
- blocks.AddRange(blockID, debug_range->begin_offset, debug_range->end_offset);
+ block.AddRange(debug_range->begin_offset, debug_range->end_offset);
}
}
@@ -1129,7 +1128,7 @@
SymbolFileDWARF::ParseFunctionBlocks
(
const SymbolContext& sc,
- lldb::user_id_t parentBlockID,
+ Block *parent_block,
const DWARFCompileUnit* dwarf_cu,
const DWARFDebugInfoEntry *die,
addr_t subprogram_low_pc,
@@ -1151,18 +1150,31 @@
DWARFDebugRanges::RangeList ranges;
const char *name = NULL;
const char *mangled_name = NULL;
- BlockList& blocks = sc.function->GetBlocks(false);
+ Block *block = NULL;
+ if (tag != DW_TAG_subprogram)
+ {
+ BlockSP block_sp(new Block (die->GetOffset()));
+ parent_block->AddChild(block_sp);
+ block = block_sp.get();
+ }
+ else
+ {
+ block = parent_block;
+ }
- lldb::user_id_t blockID = blocks.AddChild(parentBlockID, die->GetOffset());
int decl_file = 0;
int decl_line = 0;
int decl_column = 0;
int call_file = 0;
int call_line = 0;
int call_column = 0;
- if (die->GetDIENamesAndRanges(this, dwarf_cu, name, mangled_name, ranges,
- decl_file, decl_line, decl_column,
- call_file, call_line, call_column))
+ if (die->GetDIENamesAndRanges (this,
+ dwarf_cu,
+ name,
+ mangled_name,
+ ranges,
+ decl_file, decl_line, decl_column,
+ call_file, call_line, call_column))
{
if (tag == DW_TAG_subprogram)
{
@@ -1185,7 +1197,7 @@
}
}
- AddRangesToBlock (blocks, blockID, ranges, subprogram_low_pc);
+ AddRangesToBlock (*block, ranges, subprogram_low_pc);
if (tag != DW_TAG_subprogram && (name != NULL || mangled_name != NULL))
{
@@ -1199,15 +1211,20 @@
call_ap.reset(new Declaration(sc.comp_unit->GetSupportFiles().GetFileSpecAtIndex(call_file),
call_line, call_column));
- blocks.SetInlinedFunctionInfo(blockID, name, mangled_name, decl_ap.get(), call_ap.get());
+ block->SetInlinedFunctionInfo (name, mangled_name, decl_ap.get(), call_ap.get());
}
++blocks_added;
if (parse_children && die->HasChildren())
{
- blocks_added += ParseFunctionBlocks(sc, blockID, dwarf_cu, die->GetFirstChild(),
- subprogram_low_pc, true, true);
+ blocks_added += ParseFunctionBlocks (sc,
+ block,
+ dwarf_cu,
+ die->GetFirstChild(),
+ subprogram_low_pc,
+ true,
+ true);
}
}
}
@@ -1582,12 +1599,12 @@
if (resolve_scope & eSymbolContextBlock)
{
- BlockList& blocks = sc.function->GetBlocks(true);
+ Block& block = sc.function->GetBlock (true);
if (block_die != NULL)
- sc.block = blocks.GetBlockByID(block_die->GetOffset());
+ sc.block = block.FindBlockByID (block_die->GetOffset());
else
- sc.block = blocks.GetBlockByID(function_die->GetOffset());
+ sc.block = block.FindBlockByID (function_die->GetOffset());
if (sc.block)
resolved |= eSymbolContextBlock;
}
@@ -1674,12 +1691,12 @@
if (sc.function != NULL)
{
- BlockList& blocks = sc.function->GetBlocks(true);
+ Block& block = sc.function->GetBlock (true);
if (block_die != NULL)
- sc.block = blocks.GetBlockByID(block_die->GetOffset());
+ sc.block = block.FindBlockByID (block_die->GetOffset());
else
- sc.block = blocks.GetBlockByID(function_die->GetOffset());
+ sc.block = block.FindBlockByID (function_die->GetOffset());
}
}
}
@@ -3126,7 +3143,7 @@
}
else if (sc.function != NULL)
{
- symbol_context_scope = sc.function->GetBlocks(true).GetBlockByID(sc_parent_die->GetOffset());
+ symbol_context_scope = sc.function->GetBlock(true).FindBlockByID(sc_parent_die->GetOffset());
if (symbol_context_scope == NULL)
symbol_context_scope = sc.function;
}
@@ -3235,7 +3252,7 @@
const DWARFDebugInfoEntry *function_die = dwarf_cu->GetDIEPtr(function_die_offset);
if (function_die)
{
- ParseFunctionBlocks(sc, Block::RootID, dwarf_cu, function_die, LLDB_INVALID_ADDRESS, false, true);
+ ParseFunctionBlocks(sc, &sc.function->GetBlock (false), dwarf_cu, function_die, LLDB_INVALID_ADDRESS, false, true);
}
}
@@ -3430,7 +3447,7 @@
}
else if (sc.function != NULL)
{
- symbol_context_scope = sc.function->GetBlocks(true).GetBlockByID(sc_parent_die->GetOffset());
+ symbol_context_scope = sc.function->GetBlock(true).FindBlockByID(sc_parent_die->GetOffset());
if (symbol_context_scope == NULL)
symbol_context_scope = sc.function;
}
@@ -3495,11 +3512,14 @@
if (sc.function != NULL)
{
// Check to see if we already have parsed the variables for the given scope
- variables = sc.function->GetBlocks(true).GetVariableList(sc_parent_die->GetOffset(), false, false);
+
+ Block *block = sc.function->GetBlock(true).FindBlockByID(sc_parent_die->GetOffset());
+ assert (block != NULL);
+ variables = block->GetVariableList(false, true);
if (variables.get() == NULL)
{
variables.reset(new VariableList());
- sc.function->GetBlocks(true).SetVariableList(sc_parent_die->GetOffset(), variables);
+ block->SetVariableList(variables);
}
}
else