| 195 | } |
| 196 | |
| 197 | pub fn diff_objs( |
| 198 | left: Option<&Object>, |
| 199 | right: Option<&Object>, |
| 200 | prev: Option<&Object>, |
| 201 | diff_config: &DiffObjConfig, |
| 202 | mapping_config: &MappingConfig, |
| 203 | ) -> Result<DiffObjsResult> { |
| 204 | let symbol_matches = matching_symbols(left, right, prev, mapping_config)?; |
| 205 | let section_matches = matching_sections(left, right)?; |
| 206 | let mut left = left.map(|p| (p, ObjectDiff::new_from_obj(p))); |
| 207 | let mut right = right.map(|p| (p, ObjectDiff::new_from_obj(p))); |
| 208 | let mut prev = prev.map(|p| (p, ObjectDiff::new_from_obj(p))); |
| 209 | |
| 210 | for symbol_match in symbol_matches { |
| 211 | match symbol_match { |
| 212 | SymbolMatch { |
| 213 | left: Some(left_symbol_ref), |
| 214 | right: Some(right_symbol_ref), |
| 215 | prev: prev_symbol_ref, |
| 216 | section_kind, |
| 217 | } => { |
| 218 | let (left_obj, left_out) = left.as_mut().unwrap(); |
| 219 | let (right_obj, right_out) = right.as_mut().unwrap(); |
| 220 | match section_kind { |
| 221 | SectionKind::Code => { |
| 222 | let (left_diff, right_diff) = diff_code( |
| 223 | left_obj, |
| 224 | right_obj, |
| 225 | left_symbol_ref, |
| 226 | right_symbol_ref, |
| 227 | diff_config, |
| 228 | )?; |
| 229 | left_out.symbols[left_symbol_ref] = left_diff; |
| 230 | right_out.symbols[right_symbol_ref] = right_diff; |
| 231 | |
| 232 | if let Some(prev_symbol_ref) = prev_symbol_ref { |
| 233 | let (_prev_obj, prev_out) = prev.as_mut().unwrap(); |
| 234 | let (_, prev_diff) = diff_code( |
| 235 | left_obj, |
| 236 | right_obj, |
| 237 | right_symbol_ref, |
| 238 | prev_symbol_ref, |
| 239 | diff_config, |
| 240 | )?; |
| 241 | prev_out.symbols[prev_symbol_ref] = prev_diff; |
| 242 | } |
| 243 | } |
| 244 | SectionKind::Data => { |
| 245 | let (left_diff, right_diff) = diff_data_symbol( |
| 246 | left_obj, |
| 247 | right_obj, |
| 248 | left_symbol_ref, |
| 249 | right_symbol_ref, |
| 250 | )?; |
| 251 | left_out.symbols[left_symbol_ref] = left_diff; |
| 252 | right_out.symbols[right_symbol_ref] = right_diff; |
| 253 | } |
| 254 | SectionKind::Bss | SectionKind::Common => { |