int PCFilter::addRanges(const Unit* unit, const OffsetRangeVec& offsets) { int counter = 0; for (auto range = offsets.cbegin(); range != offsets.cend(); ++range) { for (PC pc = unit->at(range->m_base); pc < unit->at(range->m_past); pc += instrLen((Opcode*)pc)) { addPC(pc); counter++; } } return counter; }
// Adds a range of PCs to the filter given a collection of offset ranges. // Omit PCs which have opcodes that don't pass the given opcode filter. void PCFilter::addRanges(const Unit* unit, const OffsetRangeVec& offsets, OpcodeFilter isOpcodeAllowed) { for (auto range = offsets.cbegin(); range != offsets.cend(); ++range) { TRACE(3, "\toffsets [%d, %d)\n", range->m_base, range->m_past); for (PC pc = unit->at(range->m_base); pc < unit->at(range->m_past); pc += instrLen(pc)) { if (isOpcodeAllowed(*pc)) { TRACE(3, "\t\tpc %p\n", pc); addPC(pc); } else { TRACE(3, "\t\tpc %p -- skipping (offset %d)\n", pc, unit->offsetOf(pc)); } } } }
// Removes a range of PCs to the filter given a collection of offset ranges. // Omit PCs which have opcodes that don't pass the given opcode filter. void PCFilter::removeRanges(const Unit* unit, const OffsetRangeVec& offsets, OpcodeFilter isOpcodeAllowed) { for (auto range = offsets.cbegin(); range != offsets.cend(); ++range) { TRACE(3, "\toffsets [%d, %d) (remove)\n", range->m_base, range->m_past); for (PC pc = unit->at(range->m_base); pc < unit->at(range->m_past); pc += instrLen((Op*) pc)) { if (isOpcodeAllowed(*reinterpret_cast<const Op*>(pc))) { TRACE(3, "\t\tpc %p (remove)\n", pc); removePC(pc); } else { TRACE(3, "\t\tpc %p -- skipping (offset %d) (remove)\n", pc, unit->offsetOf(pc)); } } } }