@@ -362,20 +362,26 @@ fn compare_ins(
362362 Ok ( result)
363363}
364364
365- fn find_symbol < ' a > ( symbols : & ' a mut [ ObjSymbol ] , name : & str ) -> Option < & ' a mut ObjSymbol > {
366- symbols. iter_mut ( ) . find ( |s| s. name == name)
365+ fn find_section_and_symbol ( obj : & ObjInfo , name : & str ) -> Option < ( usize , usize ) > {
366+ for ( section_idx, section) in obj. sections . iter ( ) . enumerate ( ) {
367+ let symbol_idx = match section. symbols . iter ( ) . position ( |symbol| symbol. name == name) {
368+ Some ( symbol_idx) => symbol_idx,
369+ None => continue ,
370+ } ;
371+ return Some ( ( section_idx, symbol_idx) ) ;
372+ }
373+ None
367374}
368375
369376pub fn diff_objs ( left : & mut ObjInfo , right : & mut ObjInfo , _diff_config : & DiffConfig ) -> Result < ( ) > {
370377 for left_section in & mut left. sections {
371- let Some ( right_section) = right. sections . iter_mut ( ) . find ( |s| s. name == left_section. name ) else {
372- continue ;
373- } ;
374378 if left_section. kind == ObjSectionKind :: Code {
375379 for left_symbol in & mut left_section. symbols {
376- if let Some ( right_symbol ) =
377- find_symbol ( & mut right_section . symbols , & left_symbol. name )
380+ if let Some ( ( right_section_idx , right_symbol_idx ) ) =
381+ find_section_and_symbol ( right , & left_symbol. name )
378382 {
383+ let right_section = & mut right. sections [ right_section_idx] ;
384+ let right_symbol = & mut right_section. symbols [ right_symbol_idx] ;
379385 left_symbol. diff_symbol = Some ( right_symbol. name . clone ( ) ) ;
380386 right_symbol. diff_symbol = Some ( left_symbol. name . clone ( ) ) ;
381387 diff_code (
@@ -399,22 +405,29 @@ pub fn diff_objs(left: &mut ObjInfo, right: &mut ObjInfo, _diff_config: &DiffCon
399405 ) ?;
400406 }
401407 }
402- for right_symbol in & mut right_section. symbols {
403- if right_symbol. instructions . is_empty ( ) {
404- no_diff_code (
405- left. architecture ,
406- & right_section. data ,
407- right_symbol,
408- & right_section. relocations ,
409- & left. line_info ,
410- ) ?;
411- }
408+ } else {
409+ let Some ( right_section) = right. sections . iter_mut ( ) . find ( |s| s. name == left_section. name ) else {
410+ continue ;
411+ } ;
412+ if left_section. kind == ObjSectionKind :: Data {
413+ diff_data ( left_section, right_section) ;
414+ // diff_data_symbols(left_section, right_section)?;
415+ } else if left_section. kind == ObjSectionKind :: Bss {
416+ diff_bss_symbols ( & mut left_section. symbols , & mut right_section. symbols ) ?;
417+ }
418+ }
419+ }
420+ for right_section in right. sections . iter_mut ( ) . filter ( |s| s. kind == ObjSectionKind :: Code ) {
421+ for right_symbol in & mut right_section. symbols {
422+ if right_symbol. instructions . is_empty ( ) {
423+ no_diff_code (
424+ right. architecture ,
425+ & right_section. data ,
426+ right_symbol,
427+ & right_section. relocations ,
428+ & right. line_info ,
429+ ) ?;
412430 }
413- } else if left_section. kind == ObjSectionKind :: Data {
414- diff_data ( left_section, right_section) ;
415- // diff_data_symbols(left_section, right_section)?;
416- } else if left_section. kind == ObjSectionKind :: Bss {
417- diff_bss_symbols ( & mut left_section. symbols , & mut right_section. symbols ) ?;
418431 }
419432 }
420433 diff_bss_symbols ( & mut left. common , & mut right. common ) ?;
@@ -423,7 +436,7 @@ pub fn diff_objs(left: &mut ObjInfo, right: &mut ObjInfo, _diff_config: &DiffCon
423436
424437fn diff_bss_symbols ( left_symbols : & mut [ ObjSymbol ] , right_symbols : & mut [ ObjSymbol ] ) -> Result < ( ) > {
425438 for left_symbol in left_symbols {
426- if let Some ( right_symbol) = find_symbol ( right_symbols, & left_symbol. name ) {
439+ if let Some ( right_symbol) = right_symbols. iter_mut ( ) . find ( |s| s . name == left_symbol. name ) {
427440 left_symbol. diff_symbol = Some ( right_symbol. name . clone ( ) ) ;
428441 right_symbol. diff_symbol = Some ( left_symbol. name . clone ( ) ) ;
429442 let percent = if left_symbol. size == right_symbol. size { 100.0 } else { 50.0 } ;
0 commit comments