@@ -362,20 +362,26 @@ fn compare_ins(
362
362
Ok ( result)
363
363
}
364
364
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
367
374
}
368
375
369
376
pub fn diff_objs ( left : & mut ObjInfo , right : & mut ObjInfo , _diff_config : & DiffConfig ) -> Result < ( ) > {
370
377
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
- } ;
374
378
if left_section. kind == ObjSectionKind :: Code {
375
379
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 )
378
382
{
383
+ let right_section = & mut right. sections [ right_section_idx] ;
384
+ let right_symbol = & mut right_section. symbols [ right_symbol_idx] ;
379
385
left_symbol. diff_symbol = Some ( right_symbol. name . clone ( ) ) ;
380
386
right_symbol. diff_symbol = Some ( left_symbol. name . clone ( ) ) ;
381
387
diff_code (
@@ -399,22 +405,29 @@ pub fn diff_objs(left: &mut ObjInfo, right: &mut ObjInfo, _diff_config: &DiffCon
399
405
) ?;
400
406
}
401
407
}
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
+ ) ?;
412
430
}
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 ) ?;
418
431
}
419
432
}
420
433
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
423
436
424
437
fn diff_bss_symbols ( left_symbols : & mut [ ObjSymbol ] , right_symbols : & mut [ ObjSymbol ] ) -> Result < ( ) > {
425
438
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 ) {
427
440
left_symbol. diff_symbol = Some ( right_symbol. name . clone ( ) ) ;
428
441
right_symbol. diff_symbol = Some ( left_symbol. name . clone ( ) ) ;
429
442
let percent = if left_symbol. size == right_symbol. size { 100.0 } else { 50.0 } ;
0 commit comments