From 34220a8e264868589003f84883a50ce73d9aee94 Mon Sep 17 00:00:00 2001 From: Luke Street Date: Wed, 7 May 2025 17:36:49 -0600 Subject: [PATCH] Add address to ReportItem, stabilize sections/functions ordering --- objdiff-cli/src/cmd/report.rs | 12 ++++++++ objdiff-core/protos/proto_descriptor.bin | Bin 17633 -> 17794 bytes objdiff-core/protos/report.proto | 2 ++ objdiff-core/src/bindings/report.rs | 1 + objdiff-core/src/diff/display.rs | 35 +++++++++-------------- 5 files changed, 29 insertions(+), 21 deletions(-) diff --git a/objdiff-cli/src/cmd/report.rs b/objdiff-cli/src/cmd/report.rs index 5aef191..c6cc8fd 100644 --- a/objdiff-cli/src/cmd/report.rs +++ b/objdiff-cli/src/cmd/report.rs @@ -228,6 +228,7 @@ fn report_object( demangled_name: None, virtual_address: section.virtual_address, }), + address: None, }); match section.kind { @@ -273,6 +274,7 @@ fn report_object( demangled_name: symbol.demangled_name.clone(), virtual_address: symbol.virtual_address, }), + address: symbol.address.checked_sub(section.address), }); if match_percent == 100.0 { measures.matched_functions += 1; @@ -280,6 +282,16 @@ fn report_object( measures.total_functions += 1; } } + sections.sort_by(|a, b| a.name.cmp(&b.name)); + let reverse_fn_order = object.metadata.reverse_fn_order.unwrap_or(false); + functions.sort_by(|a, b| { + if reverse_fn_order { + b.address.unwrap_or(0).cmp(&a.address.unwrap_or(0)) + } else { + a.address.unwrap_or(u64::MAX).cmp(&b.address.unwrap_or(u64::MAX)) + } + .then_with(|| a.size.cmp(&b.size)) + }); if metadata.complete.unwrap_or(false) { measures.complete_code = measures.total_code; measures.complete_data = measures.total_data; diff --git a/objdiff-core/protos/proto_descriptor.bin b/objdiff-core/protos/proto_descriptor.bin index c281ade0bb1343851ead9bd257d3dc12f0df7237..3004765bd2d01da0924e73df9d4e8504d5b68b65 100644 GIT binary patch delta 376 zcmX|*O-sW-5I{5OrnXZRx_Hpg%K8DOh=>Xr!6NpgSC3vwFdLhaCeSQ;6a>ZMF(=P@ z@+9P!6#szrmpE;c9N)~m$4o}>^akI*LVr0-|HMNXCdtjtm(82F;JEHk#__5lz+#th zoey3CIyJ0z2U0n%qnr+6rJEfmb?d!4+Qc$vnii$0HC}?d^!fM$9?y_5Lub6?>Fegc zxR}>PYqcV%8<1Zm_kD g?U_ugF!{01cf&#klEXrV=>^}&WFR?A+ozwkf1I^Qxc~qF delta 197 zcmZqbW_;MmxZ!~U(^G@Zj}*$;7`IK1QeQRsmnz?6Ta6iI^4T!vgMENn~+Ld;o{IW3JXvY5EIc(_ for ReportItem { demangled_name: value.demangled_name, virtual_address: value.address, }), + address: None, } } } diff --git a/objdiff-core/src/diff/display.rs b/objdiff-core/src/diff/display.rs index bbac421..a35834a 100644 --- a/objdiff-core/src/diff/display.rs +++ b/objdiff-core/src/diff/display.rs @@ -687,19 +687,20 @@ pub fn display_sections( continue; } let section_diff = &diff.sections[section_idx]; - if section.kind == SectionKind::Code && reverse_fn_order { - symbols.sort_by(|a, b| { - let a_symbol = &obj.symbols[a.symbol]; - let b_symbol = &obj.symbols[b.symbol]; - symbol_sort_reverse(a_symbol, b_symbol) - }); - } else { - symbols.sort_by(|a, b| { - let a_symbol = &obj.symbols[a.symbol]; - let b_symbol = &obj.symbols[b.symbol]; - symbol_sort(a_symbol, b_symbol) - }); - } + let reverse_fn_order = section.kind == SectionKind::Code && reverse_fn_order; + symbols.sort_by(|a, b| { + let a = &obj.symbols[a.symbol]; + let b = &obj.symbols[b.symbol]; + section_symbol_sort(a, b) + .then_with(|| { + if reverse_fn_order { + b.address.cmp(&a.address) + } else { + a.address.cmp(&b.address) + } + }) + .then_with(|| a.size.cmp(&b.size)) + }); sections.push(SectionDisplay { id: section.id.clone(), name: if section.flags.contains(SectionFlag::Combined) { @@ -737,14 +738,6 @@ fn section_symbol_sort(a: &Symbol, b: &Symbol) -> Ordering { Ordering::Equal } -fn symbol_sort(a: &Symbol, b: &Symbol) -> Ordering { - section_symbol_sort(a, b).then(a.address.cmp(&b.address)).then(a.size.cmp(&b.size)) -} - -fn symbol_sort_reverse(a: &Symbol, b: &Symbol) -> Ordering { - section_symbol_sort(a, b).then(b.address.cmp(&a.address)).then(b.size.cmp(&a.size)) -} - pub fn display_ins_data_labels(obj: &Object, resolved: ResolvedInstructionRef) -> Vec { let Some(reloc) = resolved.relocation else { return Vec::new();