| 56 | const PENALTY_INSERT_DELETE: u64 = 100; |
| 57 | |
| 58 | pub fn diff_code( |
| 59 | left_obj: &Object, |
| 60 | right_obj: &Object, |
| 61 | left_symbol_idx: usize, |
| 62 | right_symbol_idx: usize, |
| 63 | diff_config: &DiffObjConfig, |
| 64 | ) -> Result<(SymbolDiff, SymbolDiff)> { |
| 65 | let left_symbol = &left_obj.symbols[left_symbol_idx]; |
| 66 | let right_symbol = &right_obj.symbols[right_symbol_idx]; |
| 67 | let left_section = left_symbol |
| 68 | .section |
| 69 | .and_then(|i| left_obj.sections.get(i)) |
| 70 | .ok_or_else(|| anyhow!("Missing section for symbol"))?; |
| 71 | let right_section = right_symbol |
| 72 | .section |
| 73 | .and_then(|i| right_obj.sections.get(i)) |
| 74 | .ok_or_else(|| anyhow!("Missing section for symbol"))?; |
| 75 | let left_data = left_section |
| 76 | .data_range(left_symbol.address, left_symbol.size as usize) |
| 77 | .ok_or_else(|| { |
| 78 | anyhow!( |
| 79 | "Symbol data out of bounds: {:#x}..{:#x}", |
| 80 | left_symbol.address, |
| 81 | left_symbol.address + left_symbol.size |
| 82 | ) |
| 83 | })?; |
| 84 | let right_data = right_section |
| 85 | .data_range(right_symbol.address, right_symbol.size as usize) |
| 86 | .ok_or_else(|| { |
| 87 | anyhow!( |
| 88 | "Symbol data out of bounds: {:#x}..{:#x}", |
| 89 | right_symbol.address, |
| 90 | right_symbol.address + right_symbol.size |
| 91 | ) |
| 92 | })?; |
| 93 | |
| 94 | let left_section_idx = left_symbol.section.unwrap(); |
| 95 | let right_section_idx = right_symbol.section.unwrap(); |
| 96 | let left_ops = left_obj.arch.scan_instructions( |
| 97 | ResolvedSymbol { |
| 98 | obj: left_obj, |
| 99 | symbol_index: left_symbol_idx, |
| 100 | symbol: left_symbol, |
| 101 | section_index: left_section_idx, |
| 102 | section: left_section, |
| 103 | data: left_data, |
| 104 | }, |
| 105 | diff_config, |
| 106 | )?; |
| 107 | let right_ops = right_obj.arch.scan_instructions( |
| 108 | ResolvedSymbol { |
| 109 | obj: right_obj, |
| 110 | symbol_index: right_symbol_idx, |
| 111 | symbol: right_symbol, |
| 112 | section_index: right_section_idx, |
| 113 | section: right_section, |
| 114 | data: right_data, |
| 115 | }, |