dsymutil: Split out patchStmtList(), NFC

Split out code to patch up the `DW_AT_stmt_list` for the cloned DIE, and
reorganize it so that it doesn't depend on `DIE::values_begin()` and
`DIE::values_end()` (which I'm trying to kill off).

David Blaikie and I talked about adding a range-algorithm version of
`std::find_if()`, but the assertion *still* required getting at the end
iterator.  IMO, a separate helper function with an early return is
easier to reason about here.

A follow-up commit that removes `DIE::setValue()` and mutates the
`DIEValue` directly is coming shortly.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@240701 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Duncan P. N. Exon Smith 2015-06-25 21:42:46 +00:00
parent 7db079305c
commit ee46b796c2

View File

@ -2364,6 +2364,17 @@ static void insertLineSequence(std::vector<DWARFDebugLine::Row> &Seq,
Seq.clear();
}
static void patchStmtList(DIE &Die, DIEInteger Offset) {
for (auto &V : Die.values())
if (V.getAttribute() == dwarf::DW_AT_stmt_list) {
Die.setValue(&V - Die.values_begin(),
DIEValue(V.getAttribute(), V.getForm(), Offset));
return;
}
llvm_unreachable("Didn't find DW_AT_stmt_list in cloned DIE!");
}
/// \brief Extract the line table for \p Unit from \p OrigDwarf, and
/// recreate a relocated version of these for the address ranges that
/// are present in the binary.
@ -2376,18 +2387,8 @@ void DwarfLinker::patchLineTableForUnit(CompileUnit &Unit,
return;
// Update the cloned DW_AT_stmt_list with the correct debug_line offset.
if (auto *OutputDIE = Unit.getOutputUnitDIE()) {
auto Stmt =
std::find_if(OutputDIE->values_begin(), OutputDIE->values_end(),
[](const DIEValue &Value) {
return Value.getAttribute() == dwarf::DW_AT_stmt_list;
});
assert(Stmt != OutputDIE->values_end() &&
"Didn't find DW_AT_stmt_list in cloned DIE!");
OutputDIE->setValue(Stmt - OutputDIE->values_begin(),
DIEValue(Stmt->getAttribute(), Stmt->getForm(),
DIEInteger(Streamer->getLineSectionSize())));
}
if (auto *OutputDIE = Unit.getOutputUnitDIE())
patchStmtList(*OutputDIE, DIEInteger(Streamer->getLineSectionSize()));
// Parse the original line info for the unit.
DWARFDebugLine::LineTable LineTable;