Skip to content

Commit 196c003

Browse files
authored
Reimplement colorized data relocation hover diffs (#182)
* Reimplement colorized data relocation hover diffs * Fix objdiff-wasm build Data diffing doesn't seem to be fully implemented in objdiff-wasm yet, so just putting placeholders in so it compiles. * Reloc hover: Add separators, override special color too
1 parent 7b00a9e commit 196c003

File tree

6 files changed

+62
-21
lines changed

6 files changed

+62
-21
lines changed

Diff for: objdiff-core/src/diff/display.rs

+33-15
Original file line numberDiff line numberDiff line change
@@ -325,10 +325,14 @@ pub enum SymbolNavigationKind {
325325
Extab,
326326
}
327327

328+
#[derive(Debug, Clone, Default, Eq, PartialEq)]
328329
pub enum HoverItemColor {
329-
Normal, // Gray
330+
#[default]
331+
Normal, // Gray
330332
Emphasized, // White
331333
Special, // Blue
334+
Delete, // Red
335+
Insert, // Green
332336
}
333337

334338
pub enum HoverItem {
@@ -355,7 +359,12 @@ pub fn symbol_context(obj: &Object, symbol_index: usize) -> Vec<ContextItem> {
355359
out
356360
}
357361

358-
pub fn symbol_hover(obj: &Object, symbol_index: usize, addend: i64) -> Vec<HoverItem> {
362+
pub fn symbol_hover(
363+
obj: &Object,
364+
symbol_index: usize,
365+
addend: i64,
366+
override_color: Option<HoverItemColor>,
367+
) -> Vec<HoverItem> {
359368
let symbol = &obj.symbols[symbol_index];
360369
let addend_str = match addend.cmp(&0i64) {
361370
Ordering::Greater => format!("+{:x}", addend),
@@ -366,51 +375,51 @@ pub fn symbol_hover(obj: &Object, symbol_index: usize, addend: i64) -> Vec<Hover
366375
out.push(HoverItem::Text {
367376
label: "Name".into(),
368377
value: format!("{}{}", symbol.name, addend_str),
369-
color: HoverItemColor::Normal,
378+
color: override_color.clone().unwrap_or_default(),
370379
});
371380
if let Some(demangled_name) = &symbol.demangled_name {
372381
out.push(HoverItem::Text {
373382
label: "Demangled".into(),
374383
value: demangled_name.into(),
375-
color: HoverItemColor::Normal,
384+
color: override_color.clone().unwrap_or_default(),
376385
});
377386
}
378387
if let Some(section) = symbol.section {
379388
out.push(HoverItem::Text {
380389
label: "Section".into(),
381390
value: obj.sections[section].name.clone(),
382-
color: HoverItemColor::Normal,
391+
color: override_color.clone().unwrap_or_default(),
383392
});
384393
out.push(HoverItem::Text {
385394
label: "Address".into(),
386395
value: format!("{:x}{}", symbol.address, addend_str),
387-
color: HoverItemColor::Normal,
396+
color: override_color.clone().unwrap_or_default(),
388397
});
389398
if symbol.flags.contains(SymbolFlag::SizeInferred) {
390399
out.push(HoverItem::Text {
391400
label: "Size".into(),
392401
value: format!("{:x} (inferred)", symbol.size),
393-
color: HoverItemColor::Normal,
402+
color: override_color.clone().unwrap_or_default(),
394403
});
395404
} else {
396405
out.push(HoverItem::Text {
397406
label: "Size".into(),
398407
value: format!("{:x}", symbol.size),
399-
color: HoverItemColor::Normal,
408+
color: override_color.clone().unwrap_or_default(),
400409
});
401410
}
402411
if let Some(align) = symbol.align {
403412
out.push(HoverItem::Text {
404413
label: "Alignment".into(),
405414
value: align.get().to_string(),
406-
color: HoverItemColor::Normal,
415+
color: override_color.clone().unwrap_or_default(),
407416
});
408417
}
409418
if let Some(address) = symbol.virtual_address {
410419
out.push(HoverItem::Text {
411420
label: "Virtual address".into(),
412421
value: format!("{:x}", address),
413-
color: HoverItemColor::Special,
422+
color: override_color.clone().unwrap_or(HoverItemColor::Special),
414423
});
415424
}
416425
} else {
@@ -443,22 +452,31 @@ pub fn relocation_context(
443452
out
444453
}
445454

446-
pub fn relocation_hover(obj: &Object, reloc: ResolvedRelocation) -> Vec<HoverItem> {
455+
pub fn relocation_hover(
456+
obj: &Object,
457+
reloc: ResolvedRelocation,
458+
override_color: Option<HoverItemColor>,
459+
) -> Vec<HoverItem> {
447460
let mut out = Vec::new();
448461
if let Some(name) = obj.arch.reloc_name(reloc.relocation.flags) {
449462
out.push(HoverItem::Text {
450463
label: "Relocation".into(),
451464
value: name.to_string(),
452-
color: HoverItemColor::Normal,
465+
color: override_color.clone().unwrap_or_default(),
453466
});
454467
} else {
455468
out.push(HoverItem::Text {
456469
label: "Relocation".into(),
457470
value: format!("<{:?}>", reloc.relocation.flags),
458-
color: HoverItemColor::Normal,
471+
color: override_color.clone().unwrap_or_default(),
459472
});
460473
}
461-
out.append(&mut symbol_hover(obj, reloc.relocation.target_symbol, reloc.relocation.addend));
474+
out.append(&mut symbol_hover(
475+
obj,
476+
reloc.relocation.target_symbol,
477+
reloc.relocation.addend,
478+
override_color,
479+
));
462480
out
463481
}
464482

@@ -545,7 +563,7 @@ pub fn instruction_hover(
545563
}
546564
if let Some(reloc) = resolved.relocation {
547565
out.push(HoverItem::Separator);
548-
out.append(&mut relocation_hover(obj, reloc));
566+
out.append(&mut relocation_hover(obj, reloc, None));
549567
if let Some(ty) = obj.arch.guess_data_type(resolved) {
550568
let literals = display_ins_data_literals(obj, resolved);
551569
if !literals.is_empty() {

Diff for: objdiff-gui/src/views/data_diff.rs

+19-4
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use objdiff_core::{
55
diff::{
66
DataDiff, DataDiffKind, DataRelocationDiff,
77
data::resolve_relocation,
8-
display::{ContextItem, HoverItem, relocation_context, relocation_hover},
8+
display::{ContextItem, HoverItem, HoverItemColor, relocation_context, relocation_hover},
99
},
1010
obj::Object,
1111
};
@@ -19,6 +19,7 @@ fn data_row_hover(obj: &Object, diffs: &[(DataDiff, Vec<DataRelocationDiff>)]) -
1919
let mut out = Vec::new();
2020
let reloc_diffs = diffs.iter().flat_map(|(_, reloc_diffs)| reloc_diffs);
2121
let mut prev_reloc = None;
22+
let mut first = true;
2223
for reloc_diff in reloc_diffs {
2324
let reloc = &reloc_diff.reloc;
2425
if prev_reloc == Some(reloc) {
@@ -29,11 +30,16 @@ fn data_row_hover(obj: &Object, diffs: &[(DataDiff, Vec<DataRelocationDiff>)]) -
2930
}
3031
prev_reloc = Some(reloc);
3132

32-
// TODO: Change hover text color depending on Insert/Delete/Replace kind
33-
// let color = get_color_for_diff_kind(reloc_diff.kind, appearance);
33+
if first {
34+
first = false;
35+
} else {
36+
out.push(HoverItem::Separator);
37+
}
38+
39+
let color = get_hover_item_color_for_diff_kind(reloc_diff.kind);
3440

3541
let reloc = resolve_relocation(&obj.symbols, reloc);
36-
out.append(&mut relocation_hover(obj, reloc));
42+
out.append(&mut relocation_hover(obj, reloc, Some(color)));
3743
}
3844
out
3945
}
@@ -97,6 +103,15 @@ fn get_color_for_diff_kind(diff_kind: DataDiffKind, appearance: &Appearance) ->
97103
}
98104
}
99105

106+
fn get_hover_item_color_for_diff_kind(diff_kind: DataDiffKind) -> HoverItemColor {
107+
match diff_kind {
108+
DataDiffKind::None => HoverItemColor::Normal,
109+
DataDiffKind::Replace => HoverItemColor::Special,
110+
DataDiffKind::Delete => HoverItemColor::Delete,
111+
DataDiffKind::Insert => HoverItemColor::Insert,
112+
}
113+
}
114+
100115
pub(crate) fn data_row_ui(
101116
ui: &mut egui::Ui,
102117
obj: Option<&Object>,

Diff for: objdiff-gui/src/views/diff.rs

+2
Original file line numberDiff line numberDiff line change
@@ -795,6 +795,8 @@ pub fn hover_items_ui(ui: &mut Ui, items: Vec<HoverItem>, appearance: &Appearanc
795795
if !label.is_empty() {
796796
let label_color = match color {
797797
HoverItemColor::Special => appearance.replace_color,
798+
HoverItemColor::Delete => appearance.delete_color,
799+
HoverItemColor::Insert => appearance.insert_color,
798800
_ => appearance.highlight_color,
799801
};
800802
write_text(&label, label_color, &mut job, appearance.code_font.clone());

Diff for: objdiff-gui/src/views/symbol_diff.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -512,7 +512,7 @@ pub fn symbol_hover_ui(
512512
ui.scope(|ui| {
513513
ui.style_mut().override_text_style = Some(egui::TextStyle::Monospace);
514514
ui.style_mut().wrap_mode = Some(egui::TextWrapMode::Wrap);
515-
hover_items_ui(ui, symbol_hover(ctx.obj, symbol_idx, 0), appearance);
515+
hover_items_ui(ui, symbol_hover(ctx.obj, symbol_idx, 0, None), appearance);
516516
});
517517
}
518518

Diff for: objdiff-wasm/src/api.rs

+5-1
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,9 @@ impl GuestDisplay for Component {
230230
) -> Vec<HoverItem> {
231231
let obj_diff = diff.get::<ResourceObjectDiff>();
232232
let obj = obj_diff.0.as_ref();
233-
diff::display::symbol_hover(obj, symbol_display.symbol as usize, 0 /* TODO */)
233+
// TODO: colorize replaced/deleted/inserted relocations
234+
let override_color = None;
235+
diff::display::symbol_hover(obj, symbol_display.symbol as usize, 0, override_color)
234236
.into_iter()
235237
.map(|item| HoverItem::from(item))
236238
.collect()
@@ -501,6 +503,8 @@ impl From<diff::display::HoverItemColor> for HoverItemColor {
501503
diff::display::HoverItemColor::Normal => HoverItemColor::Normal,
502504
diff::display::HoverItemColor::Emphasized => HoverItemColor::Emphasized,
503505
diff::display::HoverItemColor::Special => HoverItemColor::Special,
506+
diff::display::HoverItemColor::Delete => HoverItemColor::Delete,
507+
diff::display::HoverItemColor::Insert => HoverItemColor::Insert,
504508
}
505509
}
506510
}

Diff for: objdiff-wasm/wit/objdiff.wit

+2
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,8 @@ interface display {
137137
normal,
138138
emphasized,
139139
special,
140+
delete,
141+
insert,
140142
}
141143

142144
record hover-item-text {

0 commit comments

Comments
 (0)