void DwarfInfo::addLineEntries(TCRange range, const Unit *unit, PC instr, FunctionInfo* f) { if (unit == nullptr || instr == nullptr) { // For stubs, just add line 0 f->m_lineTable.push_back(LineEntry(range, 0)); return; } Offset offset = unit->offsetOf(instr); int lineNum = unit->getLineNumber(offset); if (lineNum >= 0) { f->m_lineTable.push_back(LineEntry(range, lineNum)); } }
static LineTable createLineTable(SourceLocTable& srcLoc, Offset bclen) { LineTable lines; for (size_t i = 0; i < srcLoc.size(); ++i) { Offset endOff = i < srcLoc.size() - 1 ? srcLoc[i + 1].first : bclen; lines.push_back(LineEntry(endOff, srcLoc[i].second.line1)); } return lines; }
int Unit::getLineNumber(Offset pc) const { LineEntry key = LineEntry(pc, -1); std::vector<LineEntry>::const_iterator it = upper_bound(m_lineTable.begin(), m_lineTable.end(), key); if (it != m_lineTable.end()) { ASSERT(pc < it->pastOffset()); return it->val(); } return -1; }