@@ -5489,23 +5489,20 @@ RZ_IPI RzCmdStatus rz_analysis_all_esil_functions_handler(RzCore *core, int argc
54895489 return RZ_CMD_STATUS_OK ;
54905490}
54915491
5492- static RzList /*<ut64 *>*/ * get_xrefs (RzAnalysisBlock * block ) {
5492+ static RzSetU * get_xrefs (RzAnalysisBlock * block ) {
54935493 RzListIter * iter ;
54945494 RzAnalysisXRef * xref ;
5495- RzList * list = NULL ;
5495+ RzSetU * set = rz_set_u_new () ;
54965496 size_t i ;
54975497 for (i = 0 ; i < block -> ninstr ; i ++ ) {
54985498 ut64 ia = block -> addr + block -> op_pos [i ];
54995499 RzList * xrefs = rz_analysis_xrefs_get_to (block -> analysis , ia );
55005500 rz_list_foreach (xrefs , iter , xref ) {
5501- if (!list ) {
5502- list = rz_list_newf (free );
5503- }
5504- rz_list_push (list , ut64_new (xref -> from ));
5501+ rz_set_u_add (set , xref -> from );
55055502 }
55065503 rz_list_free (xrefs );
55075504 }
5508- return list ;
5505+ return set ;
55095506}
55105507
55115508static RZ_OWN RzSetU * get_calls (RzCore * core , RzAnalysisBlock * block ) {
@@ -5522,19 +5519,23 @@ static RZ_OWN RzSetU *get_calls(RzCore *core, RzAnalysisBlock *block) {
55225519 if (ret < 1 ) {
55235520 continue ;
55245521 }
5525- if (op .type == RZ_ANALYSIS_OP_TYPE_CALL ) {
5526- rz_set_u_add (calls , op .jump );
5527-
5528- RzList * xrefs = rz_analysis_xrefs_get_from (block -> analysis , op .addr );
5529- RzAnalysisXRef * xref ;
5530- RzListIter * iter ;
5531- rz_list_foreach (xrefs , iter , xref ) {
5532- if (xref -> type != RZ_ANALYSIS_XREF_TYPE_CALL ) {
5533- continue ;
5522+ if (rz_analysis_op_is_call (& op )) {
5523+ if (op .jump != UT64_MAX ) {
5524+ rz_set_u_add (calls , op .jump );
5525+ } else {
5526+ // No statically know call target.
5527+ // Check if a previous analysis found any xrefs from it.
5528+ RzList * xrefs = rz_analysis_xrefs_get_from (block -> analysis , op .addr );
5529+ RzAnalysisXRef * xref ;
5530+ RzListIter * iter ;
5531+ rz_list_foreach (xrefs , iter , xref ) {
5532+ if (xref -> type != RZ_ANALYSIS_XREF_TYPE_CALL ) {
5533+ continue ;
5534+ }
5535+ rz_set_u_add (calls , xref -> to );
55345536 }
5535- rz_set_u_add ( calls , xref -> to );
5537+ rz_list_free ( xrefs );
55365538 }
5537- rz_list_free (xrefs );
55385539 }
55395540 rz_analysis_op_fini (& op );
55405541 if (op .size > 0 ) {
@@ -5567,7 +5568,7 @@ RZ_IPI RzCmdStatus rz_analysis_basic_block_list_handler(RzCore *core, int argc,
55675568 RzAnalysisBlock * block ;
55685569 RBTree * bb_tree = rz_analysis_get_bb_tree (core -> analysis );
55695570 rz_rbtree_foreach ((* bb_tree ), iter , block , RzAnalysisBlock , _rb ) {
5570- RzList * xrefs = get_xrefs (block );
5571+ RzSetU * xrefs = get_xrefs (block );
55715572 RzSetU * calls = get_calls (core , block );
55725573 switch (state -> mode ) {
55735574 case RZ_OUTPUT_MODE_JSON :
@@ -5584,11 +5585,12 @@ RZ_IPI RzCmdStatus rz_analysis_basic_block_list_handler(RzCore *core, int argc,
55845585 }
55855586 if (xrefs ) {
55865587 pj_ka (pj , "xrefs" );
5587- RzListIter * iter2 ;
55885588 ut64 * addr ;
5589- rz_list_foreach (xrefs , iter2 , addr ) {
5589+ RzIterator * xref_iter = rz_set_u_as_iter (xrefs );
5590+ rz_iterator_foreach (xref_iter , addr ) {
55905591 pj_n (pj , * addr );
55915592 }
5593+ rz_iterator_free (xref_iter );
55925594 pj_end (pj );
55935595 }
55945596 if (calls ) {
@@ -5614,7 +5616,7 @@ RZ_IPI RzCmdStatus rz_analysis_basic_block_list_handler(RzCore *core, int argc,
56145616 char * jump = block -> jump != UT64_MAX ? rz_str_newf ("0x%08" PFMT64x , block -> jump ) : rz_str_dup ("" );
56155617 char * fail = block -> fail != UT64_MAX ? rz_str_newf ("0x%08" PFMT64x , block -> fail ) : rz_str_dup ("" );
56165618 char * call = ut64join (calls );
5617- char * xref = ut64join (calls );
5619+ char * xref = ut64join (xrefs );
56185620 char * fcns = fcnjoin (block -> fcns );
56195621 rz_table_add_rowf (table , "xnddsssss" ,
56205622 block -> addr ,
@@ -5644,12 +5646,12 @@ RZ_IPI RzCmdStatus rz_analysis_basic_block_list_handler(RzCore *core, int argc,
56445646 rz_cons_printf (" .f 0x%08" PFMT64x , block -> fail );
56455647 }
56465648 if (xrefs ) {
5647- RzListIter * iter2 ;
5648- rz_cons_printf (" .x" );
56495649 ut64 * addr ;
5650- rz_list_foreach (xrefs , iter2 , addr ) {
5650+ RzIterator * xref_iter = rz_set_u_as_iter (xrefs );
5651+ rz_iterator_foreach (xref_iter , addr ) {
56515652 rz_cons_printf (" 0x%08" PFMT64x , * addr );
56525653 }
5654+ rz_iterator_free (xref_iter );
56535655 }
56545656 if (calls ) {
56555657 rz_cons_printf (" .c" );
@@ -5674,7 +5676,7 @@ RZ_IPI RzCmdStatus rz_analysis_basic_block_list_handler(RzCore *core, int argc,
56745676 status = RZ_CMD_STATUS_WRONG_ARGS ;
56755677 iter .len = 0 ;
56765678 }
5677- rz_list_free (xrefs );
5679+ rz_set_u_free (xrefs );
56785680 rz_set_u_free (calls );
56795681 }
56805682 rz_cmd_state_output_array_end (state );
0 commit comments