mirror of
https://github.com/radareorg/radare2.git
synced 2025-03-03 19:59:09 +00:00
* Add optimization in gdiff based on function size boundaries
- Makes bin diffing 5 times faster
This commit is contained in:
parent
92baebdadd
commit
ea73472ee6
@ -54,9 +54,9 @@ static void gdiff_diff_bb(RAnalFcn *mfcn, RAnalFcn *mfcn2, RList *bbs, RList *bb
|
|||||||
bb2->addr >= mfcn2->addr && bb2->addr < mfcn2->addr + mfcn2->size) {
|
bb2->addr >= mfcn2->addr && bb2->addr < mfcn2->addr + mfcn2->size) {
|
||||||
r_diff_buffers_distance (NULL, bb->fingerprint, bb->size,
|
r_diff_buffers_distance (NULL, bb->fingerprint, bb->size,
|
||||||
bb2->fingerprint, bb2->size, NULL, &t);
|
bb2->fingerprint, bb2->size, NULL, &t);
|
||||||
#if 0
|
#if 0
|
||||||
eprintf ("BB: %llx - %llx => %i - %i - %i => %f\n", bb->addr, bb2->addr,
|
eprintf ("BB: %llx - %llx => %lli - %lli => %f\n", bb->addr, bb2->addr,
|
||||||
bb->ninstr, bb2->ninstr, p, t);
|
bb->size, bb->size, t);
|
||||||
#endif
|
#endif
|
||||||
if (t > THRESHOLDBB && t > ot) {
|
if (t > THRESHOLDBB && t > ot) {
|
||||||
ot = t;
|
ot = t;
|
||||||
@ -82,6 +82,7 @@ static void gdiff_diff_bb(RAnalFcn *mfcn, RAnalFcn *mfcn2, RList *bbs, RList *bb
|
|||||||
static void gdiff_diff_fcn(RList *fcns, RList *fcns2, RList *bbs, RList *bbs2) {
|
static void gdiff_diff_fcn(RList *fcns, RList *fcns2, RList *bbs, RList *bbs2) {
|
||||||
RAnalFcn *fcn, *fcn2, *mfcn, *mfcn2;
|
RAnalFcn *fcn, *fcn2, *mfcn, *mfcn2;
|
||||||
RListIter *iter, *iter2;
|
RListIter *iter, *iter2;
|
||||||
|
ut64 maxsize, minsize;
|
||||||
double t, ot;
|
double t, ot;
|
||||||
|
|
||||||
iter = r_list_iterator (fcns);
|
iter = r_list_iterator (fcns);
|
||||||
@ -94,7 +95,15 @@ static void gdiff_diff_fcn(RList *fcns, RList *fcns2, RList *bbs, RList *bbs2) {
|
|||||||
iter2 = r_list_iterator (fcns2);
|
iter2 = r_list_iterator (fcns2);
|
||||||
while (r_list_iter_next (iter2)) {
|
while (r_list_iter_next (iter2)) {
|
||||||
fcn2 = r_list_iter_get (iter2);
|
fcn2 = r_list_iter_get (iter2);
|
||||||
if (fcn2->type != R_ANAL_FCN_TYPE_FCN || fcn2->diff->type != R_ANAL_DIFF_TYPE_NULL)
|
if (fcn->size > fcn2->size) {
|
||||||
|
maxsize = fcn->size;
|
||||||
|
minsize = fcn2->size;
|
||||||
|
} else {
|
||||||
|
maxsize = fcn2->size;
|
||||||
|
minsize = fcn->size;
|
||||||
|
}
|
||||||
|
if (fcn2->type != R_ANAL_FCN_TYPE_FCN || fcn2->diff->type != R_ANAL_DIFF_TYPE_NULL ||
|
||||||
|
(maxsize * THRESHOLDFCN > minsize))
|
||||||
continue;
|
continue;
|
||||||
r_diff_buffers_distance (NULL, fcn->fingerprint, fcn->size,
|
r_diff_buffers_distance (NULL, fcn->fingerprint, fcn->size,
|
||||||
fcn2->fingerprint, fcn2->size, NULL, &t);
|
fcn2->fingerprint, fcn2->size, NULL, &t);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user