uint32_t DWARFDebugLine::LineTable::findRowInSeq(const DWARFDebugLine::Sequence &Seq, uint64_t Address) const { if (!Seq.containsPC(Address)) return UnknownRowIndex; // Search for instruction address in the rows describing the sequence. // Rows are stored in a vector, so we may use arithmetical operations with // iterators. DWARFDebugLine::Row Row; Row.Address = Address; RowIter FirstRow = Rows.begin() + Seq.FirstRowIndex; RowIter LastRow = Rows.begin() + Seq.LastRowIndex; LineTable::RowIter RowPos = std::lower_bound( FirstRow, LastRow, Row, DWARFDebugLine::Row::orderByAddress); if (RowPos == LastRow) { return Seq.LastRowIndex - 1; } uint32_t Index = Seq.FirstRowIndex + (RowPos - FirstRow); if (RowPos->Address > Address) { if (RowPos == FirstRow) return UnknownRowIndex; else Index--; } return Index; }
uint32_t DWARFDebugLine::LineTable::findRowInSeq(const DWARFDebugLine::Sequence &seq, uint64_t address) const { if (!seq.containsPC(address)) return UnknownRowIndex; // Search for instruction address in the rows describing the sequence. // Rows are stored in a vector, so we may use arithmetical operations with // iterators. DWARFDebugLine::Row row; row.Address = address; RowIter first_row = Rows.begin() + seq.FirstRowIndex; RowIter last_row = Rows.begin() + seq.LastRowIndex; LineTable::RowIter row_pos = std::lower_bound( first_row, last_row, row, DWARFDebugLine::Row::orderByAddress); if (row_pos == last_row) { return seq.LastRowIndex - 1; } uint32_t index = seq.FirstRowIndex + (row_pos - first_row); if (row_pos->Address > address) { if (row_pos == first_row) return UnknownRowIndex; else index--; } return index; }