/* * We ask DR to expand any x86 string instructions like REP MOVSB, so * that we can log all the individual memory accesses without getting * confused. */ static dr_emit_flags_t expand_rep_movsb( void *drcontext, void *tag, instrlist_t *bb, bool for_trace, bool translating) { bool ok = drutil_expand_rep_string(drcontext, bb); DR_ASSERT(ok); return DR_EMIT_DEFAULT; }
/* We transform string loops into regular loops so we can more easily * monitor every memory reference they make. */ static dr_emit_flags_t event_bb_app2app(void *drcontext, void *tag, instrlist_t *bb, bool for_trace, bool translating) { if (!drutil_expand_rep_string(drcontext, bb)) { DR_ASSERT(false); /* in release build, carry on: we'll just miss per-iter refs */ } return DR_EMIT_DEFAULT; }