Beispiel #1
0
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));
  }
}
Beispiel #2
0
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;
}
Beispiel #3
0
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;
}