Skip to content

Commit c5da7f7

Browse files
committed
Show diff color when symbols differ
1 parent 2fd6558 commit c5da7f7

File tree

4 files changed

+28
-13
lines changed

4 files changed

+28
-13
lines changed

objdiff-cli/src/cmd/diff.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -844,10 +844,14 @@ impl FunctionDiffUi {
844844
base_color = COLOR_ROTATION[diff.idx % COLOR_ROTATION.len()]
845845
}
846846
}
847-
DiffText::Symbol(sym) => {
847+
DiffText::Symbol(sym, diff) => {
848848
let name = sym.demangled_name.as_ref().unwrap_or(&sym.name);
849849
label_text = name.clone();
850-
base_color = Color::White;
850+
if let Some(diff) = diff {
851+
base_color = COLOR_ROTATION[diff.idx % COLOR_ROTATION.len()]
852+
} else {
853+
base_color = Color::White;
854+
}
851855
}
852856
DiffText::Spacing(n) => {
853857
line.spans.push(Span::raw(" ".repeat(n)));

objdiff-core/src/diff/code.rs

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -330,8 +330,11 @@ fn compare_ins(
330330
let a_str = match a {
331331
ObjInsArg::PlainText(arg) => arg.to_string(),
332332
ObjInsArg::Arg(arg) => arg.to_string(),
333-
ObjInsArg::Reloc => String::new(),
334-
ObjInsArg::BranchDest(arg) => format!("{arg}"),
333+
ObjInsArg::Reloc => left_ins
334+
.reloc
335+
.as_ref()
336+
.map_or_else(|| "<unknown>".to_string(), |r| r.target.name.clone()),
337+
ObjInsArg::BranchDest(arg) => arg.to_string(),
335338
};
336339
let a_diff = if let Some(idx) = state.left_args_idx.get(&a_str) {
337340
ObjInsArgDiff { idx: *idx }
@@ -344,8 +347,11 @@ fn compare_ins(
344347
let b_str = match b {
345348
ObjInsArg::PlainText(arg) => arg.to_string(),
346349
ObjInsArg::Arg(arg) => arg.to_string(),
347-
ObjInsArg::Reloc => String::new(),
348-
ObjInsArg::BranchDest(arg) => format!("{arg}"),
350+
ObjInsArg::Reloc => right_ins
351+
.reloc
352+
.as_ref()
353+
.map_or_else(|| "<unknown>".to_string(), |r| r.target.name.clone()),
354+
ObjInsArg::BranchDest(arg) => arg.to_string(),
349355
};
350356
let b_diff = if let Some(idx) = state.right_args_idx.get(&b_str) {
351357
ObjInsArgDiff { idx: *idx }

objdiff-core/src/diff/display.rs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ pub enum DiffText<'a> {
2222
/// Branch destination
2323
BranchDest(u64, Option<&'a ObjInsArgDiff>),
2424
/// Symbol name
25-
Symbol(&'a ObjSymbol),
25+
Symbol(&'a ObjSymbol, Option<&'a ObjInsArgDiff>),
2626
/// Number of spaces
2727
Spacing(usize),
2828
/// End of line
@@ -71,7 +71,7 @@ pub fn display_diff<E>(
7171
cb(DiffText::Argument(v, diff))?;
7272
}
7373
ObjInsArg::Reloc => {
74-
display_reloc_name(ins.reloc.as_ref().unwrap(), &mut cb)?;
74+
display_reloc_name(ins.reloc.as_ref().unwrap(), &mut cb, diff)?;
7575
}
7676
ObjInsArg::BranchDest(dest) => {
7777
if let Some(dest) = dest.checked_sub(base_addr) {
@@ -92,8 +92,9 @@ pub fn display_diff<E>(
9292
fn display_reloc_name<E>(
9393
reloc: &ObjReloc,
9494
mut cb: impl FnMut(DiffText) -> Result<(), E>,
95+
diff: Option<&ObjInsArgDiff>,
9596
) -> Result<(), E> {
96-
cb(DiffText::Symbol(&reloc.target))?;
97+
cb(DiffText::Symbol(&reloc.target, diff))?;
9798
match reloc.addend.cmp(&0i64) {
9899
Ordering::Greater => cb(DiffText::Basic(&format!("+{:#x}", reloc.addend))),
99100
Ordering::Less => cb(DiffText::Basic(&format!("-{:#x}", -reloc.addend))),
@@ -106,7 +107,7 @@ impl PartialEq<DiffText<'_>> for HighlightKind {
106107
match (self, other) {
107108
(HighlightKind::Opcode(a), DiffText::Opcode(_, b)) => a == b,
108109
(HighlightKind::Arg(a), DiffText::Argument(b, _)) => a.loose_eq(b),
109-
(HighlightKind::Symbol(a), DiffText::Symbol(b)) => a == &b.name,
110+
(HighlightKind::Symbol(a), DiffText::Symbol(b, _)) => a == &b.name,
110111
(HighlightKind::Address(a), DiffText::Address(b) | DiffText::BranchDest(b, _)) => {
111112
a == b
112113
}
@@ -124,7 +125,7 @@ impl From<DiffText<'_>> for HighlightKind {
124125
match value {
125126
DiffText::Opcode(_, op) => HighlightKind::Opcode(op),
126127
DiffText::Argument(arg, _) => HighlightKind::Arg(arg.clone()),
127-
DiffText::Symbol(sym) => HighlightKind::Symbol(sym.name.to_string()),
128+
DiffText::Symbol(sym, _) => HighlightKind::Symbol(sym.name.to_string()),
128129
DiffText::Address(addr) | DiffText::BranchDest(addr, _) => HighlightKind::Address(addr),
129130
_ => HighlightKind::None,
130131
}

objdiff-gui/src/views/function_diff.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -292,10 +292,14 @@ fn diff_text_ui(
292292
base_color = appearance.diff_colors[diff.idx % appearance.diff_colors.len()]
293293
}
294294
}
295-
DiffText::Symbol(sym) => {
295+
DiffText::Symbol(sym, diff) => {
296296
let name = sym.demangled_name.as_ref().unwrap_or(&sym.name);
297297
label_text = name.clone();
298-
base_color = appearance.emphasized_text_color;
298+
if let Some(diff) = diff {
299+
base_color = appearance.diff_colors[diff.idx % appearance.diff_colors.len()]
300+
} else {
301+
base_color = appearance.emphasized_text_color;
302+
}
299303
}
300304
DiffText::Spacing(n) => {
301305
ui.add_space(n as f32 * space_width);

0 commit comments

Comments
 (0)