mirror of
https://github.com/encounter/objdiff.git
synced 2025-12-16 00:17:16 +00:00
Compare commits
6 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 100f8f8ac5 | |||
| 2f778932a4 | |||
| 42601b4750 | |||
| 636a8e00c5 | |||
|
|
cd46be7726 | ||
|
|
019493f944 |
2002
Cargo.lock
generated
2002
Cargo.lock
generated
File diff suppressed because it is too large
Load Diff
47
Cargo.toml
47
Cargo.toml
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "objdiff"
|
name = "objdiff"
|
||||||
version = "0.3.0"
|
version = "0.3.2"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
rust-version = "1.65"
|
rust-version = "1.65"
|
||||||
authors = ["Luke Street <luke@street.dev>"]
|
authors = ["Luke Street <luke@street.dev>"]
|
||||||
@@ -11,6 +11,7 @@ description = """
|
|||||||
A local diffing tool for decompilation projects.
|
A local diffing tool for decompilation projects.
|
||||||
"""
|
"""
|
||||||
publish = false
|
publish = false
|
||||||
|
build = "build.rs"
|
||||||
|
|
||||||
[profile.release]
|
[profile.release]
|
||||||
lto = "thin"
|
lto = "thin"
|
||||||
@@ -21,40 +22,40 @@ default = []
|
|||||||
wgpu = ["eframe/wgpu"]
|
wgpu = ["eframe/wgpu"]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
anyhow = "1.0.68"
|
anyhow = "1.0.71"
|
||||||
bytes = "1.3.0"
|
bytes = "1.4.0"
|
||||||
cfg-if = "1.0.0"
|
cfg-if = "1.0.0"
|
||||||
const_format = "0.2.30"
|
const_format = "0.2.30"
|
||||||
cwdemangle = "0.1.4"
|
cwdemangle = "0.1.5"
|
||||||
eframe = { version = "0.20.1", features = ["persistence"] }
|
eframe = { version = "0.21.3", features = ["persistence"] }
|
||||||
egui = "0.20.1"
|
egui = "0.21.0"
|
||||||
egui_extras = "0.20.0"
|
egui_extras = "0.21.0"
|
||||||
flagset = "0.4.3"
|
flagset = "0.4.3"
|
||||||
log = "0.4.17"
|
log = "0.4.17"
|
||||||
memmap2 = "0.5.8"
|
memmap2 = "0.6.1"
|
||||||
notify = "5.0.0"
|
notify = "5.1.0"
|
||||||
object = { version = "0.30.2", features = ["read_core", "std", "elf"], default-features = false }
|
object = { version = "0.31.1", features = ["read_core", "std", "elf"], default-features = false }
|
||||||
png = "0.17.7"
|
png = "0.17.8"
|
||||||
ppc750cl = { git = "https://github.com/terorie/ppc750cl", rev = "9ae36eef34aa6d74e00972c7671f547a2acfd0aa" }
|
ppc750cl = { git = "https://github.com/terorie/ppc750cl", rev = "9ae36eef34aa6d74e00972c7671f547a2acfd0aa" }
|
||||||
rabbitizer = "1.5.8"
|
rabbitizer = "1.7.1"
|
||||||
rfd = { version = "0.10.0" } #, default-features = false, features = ['xdg-portal']
|
rfd = { version = "0.11.3" } #, default-features = false, features = ['xdg-portal']
|
||||||
serde = { version = "1", features = ["derive"] }
|
serde = { version = "1", features = ["derive"] }
|
||||||
tempfile = "3.3.0"
|
tempfile = "3.5.0"
|
||||||
thiserror = "1.0.38"
|
thiserror = "1.0.40"
|
||||||
time = { version = "0.3.17", features = ["formatting", "local-offset"] }
|
time = { version = "0.3.21", features = ["formatting", "local-offset"] }
|
||||||
toml = "0.5.11"
|
toml = "0.7.3"
|
||||||
twox-hash = "1.6.3"
|
twox-hash = "1.6.3"
|
||||||
byteorder = "1.4.3"
|
byteorder = "1.4.3"
|
||||||
|
|
||||||
# For Linux static binaries, use rustls
|
# For Linux static binaries, use rustls
|
||||||
[target.'cfg(target_os = "linux")'.dependencies]
|
[target.'cfg(target_os = "linux")'.dependencies]
|
||||||
reqwest = { version = "0.11.14", default-features = false, features = ["blocking", "json", "rustls"] }
|
reqwest = { version = "0.11.17", default-features = false, features = ["blocking", "json", "rustls"] }
|
||||||
self_update = { version = "0.34.0", default-features = false, features = ["rustls"] }
|
self_update = { version = "0.36.0", default-features = false, features = ["rustls"] }
|
||||||
|
|
||||||
# For all other platforms, use native TLS
|
# For all other platforms, use native TLS
|
||||||
[target.'cfg(not(target_os = "linux"))'.dependencies]
|
[target.'cfg(not(target_os = "linux"))'.dependencies]
|
||||||
reqwest = "0.11.14"
|
reqwest = "0.11.17"
|
||||||
self_update = "0.34.0"
|
self_update = "0.36.0"
|
||||||
|
|
||||||
[target.'cfg(windows)'.dependencies]
|
[target.'cfg(windows)'.dependencies]
|
||||||
path-slash = "0.2.1"
|
path-slash = "0.2.1"
|
||||||
@@ -76,5 +77,5 @@ console_error_panic_hook = "0.1.7"
|
|||||||
tracing-wasm = "0.2"
|
tracing-wasm = "0.2"
|
||||||
|
|
||||||
[build-dependencies]
|
[build-dependencies]
|
||||||
anyhow = "1.0.68"
|
anyhow = "1.0.71"
|
||||||
vergen = { version = "7.5.0", features = ["build", "cargo", "git"], default-features = false }
|
vergen = { version = "8.1.3", features = ["build", "cargo", "git", "gitcl"] }
|
||||||
|
|||||||
4
build.rs
4
build.rs
@@ -1,10 +1,10 @@
|
|||||||
use anyhow::Result;
|
use anyhow::Result;
|
||||||
use vergen::{vergen, Config};
|
use vergen::EmitBuilder;
|
||||||
|
|
||||||
fn main() -> Result<()> {
|
fn main() -> Result<()> {
|
||||||
#[cfg(windows)]
|
#[cfg(windows)]
|
||||||
{
|
{
|
||||||
winres::WindowsResource::new().set_icon("assets/icon.ico").compile()?;
|
winres::WindowsResource::new().set_icon("assets/icon.ico").compile()?;
|
||||||
}
|
}
|
||||||
vergen(Config::default())
|
EmitBuilder::builder().fail_on_error().all_build().all_cargo().all_git().emit()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -362,7 +362,7 @@ impl eframe::App for App {
|
|||||||
ui.colored_label(Color32::LIGHT_BLUE, &demangled);
|
ui.colored_label(Color32::LIGHT_BLUE, &demangled);
|
||||||
});
|
});
|
||||||
if ui.button("Copy").clicked() {
|
if ui.button("Copy").clicked() {
|
||||||
ui.output().copied_text = demangled;
|
ui.output_mut(|output| output.copied_text = demangled);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
ui.scope(|ui| {
|
ui.scope(|ui| {
|
||||||
|
|||||||
65
src/diff.rs
65
src/diff.rs
@@ -133,7 +133,6 @@ pub fn diff_code(
|
|||||||
right_diff.push(ObjInsDiff::default());
|
right_diff.push(ObjInsDiff::default());
|
||||||
cur_left = left_iter.next();
|
cur_left = left_iter.next();
|
||||||
}
|
}
|
||||||
LevEditType::Keep => unreachable!(),
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
break;
|
break;
|
||||||
@@ -363,20 +362,26 @@ fn compare_ins(
|
|||||||
Ok(result)
|
Ok(result)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn find_symbol<'a>(symbols: &'a mut [ObjSymbol], name: &str) -> Option<&'a mut ObjSymbol> {
|
fn find_section_and_symbol(obj: &ObjInfo, name: &str) -> Option<(usize, usize)> {
|
||||||
symbols.iter_mut().find(|s| s.name == name)
|
for (section_idx, section) in obj.sections.iter().enumerate() {
|
||||||
|
let symbol_idx = match section.symbols.iter().position(|symbol| symbol.name == name) {
|
||||||
|
Some(symbol_idx) => symbol_idx,
|
||||||
|
None => continue,
|
||||||
|
};
|
||||||
|
return Some((section_idx, symbol_idx));
|
||||||
|
}
|
||||||
|
None
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn diff_objs(left: &mut ObjInfo, right: &mut ObjInfo, _diff_config: &DiffConfig) -> Result<()> {
|
pub fn diff_objs(left: &mut ObjInfo, right: &mut ObjInfo, _diff_config: &DiffConfig) -> Result<()> {
|
||||||
for left_section in &mut left.sections {
|
for left_section in &mut left.sections {
|
||||||
let Some(right_section) = right.sections.iter_mut().find(|s| s.name == left_section.name) else {
|
|
||||||
continue;
|
|
||||||
};
|
|
||||||
if left_section.kind == ObjSectionKind::Code {
|
if left_section.kind == ObjSectionKind::Code {
|
||||||
for left_symbol in &mut left_section.symbols {
|
for left_symbol in &mut left_section.symbols {
|
||||||
if let Some(right_symbol) =
|
if let Some((right_section_idx, right_symbol_idx)) =
|
||||||
find_symbol(&mut right_section.symbols, &left_symbol.name)
|
find_section_and_symbol(right, &left_symbol.name)
|
||||||
{
|
{
|
||||||
|
let right_section = &mut right.sections[right_section_idx];
|
||||||
|
let right_symbol = &mut right_section.symbols[right_symbol_idx];
|
||||||
left_symbol.diff_symbol = Some(right_symbol.name.clone());
|
left_symbol.diff_symbol = Some(right_symbol.name.clone());
|
||||||
right_symbol.diff_symbol = Some(left_symbol.name.clone());
|
right_symbol.diff_symbol = Some(left_symbol.name.clone());
|
||||||
diff_code(
|
diff_code(
|
||||||
@@ -400,22 +405,29 @@ pub fn diff_objs(left: &mut ObjInfo, right: &mut ObjInfo, _diff_config: &DiffCon
|
|||||||
)?;
|
)?;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for right_symbol in &mut right_section.symbols {
|
} else {
|
||||||
if right_symbol.instructions.is_empty() {
|
let Some(right_section) = right.sections.iter_mut().find(|s| s.name == left_section.name) else {
|
||||||
no_diff_code(
|
continue;
|
||||||
left.architecture,
|
};
|
||||||
&right_section.data,
|
if left_section.kind == ObjSectionKind::Data {
|
||||||
right_symbol,
|
diff_data(left_section, right_section);
|
||||||
&right_section.relocations,
|
// diff_data_symbols(left_section, right_section)?;
|
||||||
&left.line_info,
|
} else if left_section.kind == ObjSectionKind::Bss {
|
||||||
)?;
|
diff_bss_symbols(&mut left_section.symbols, &mut right_section.symbols)?;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for right_section in right.sections.iter_mut().filter(|s| s.kind == ObjSectionKind::Code) {
|
||||||
|
for right_symbol in &mut right_section.symbols {
|
||||||
|
if right_symbol.instructions.is_empty() {
|
||||||
|
no_diff_code(
|
||||||
|
right.architecture,
|
||||||
|
&right_section.data,
|
||||||
|
right_symbol,
|
||||||
|
&right_section.relocations,
|
||||||
|
&right.line_info,
|
||||||
|
)?;
|
||||||
}
|
}
|
||||||
} else if left_section.kind == ObjSectionKind::Data {
|
|
||||||
diff_data(left_section, right_section);
|
|
||||||
// diff_data_symbols(left_section, right_section)?;
|
|
||||||
} else if left_section.kind == ObjSectionKind::Bss {
|
|
||||||
diff_bss_symbols(&mut left_section.symbols, &mut right_section.symbols)?;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
diff_bss_symbols(&mut left.common, &mut right.common)?;
|
diff_bss_symbols(&mut left.common, &mut right.common)?;
|
||||||
@@ -424,7 +436,7 @@ pub fn diff_objs(left: &mut ObjInfo, right: &mut ObjInfo, _diff_config: &DiffCon
|
|||||||
|
|
||||||
fn diff_bss_symbols(left_symbols: &mut [ObjSymbol], right_symbols: &mut [ObjSymbol]) -> Result<()> {
|
fn diff_bss_symbols(left_symbols: &mut [ObjSymbol], right_symbols: &mut [ObjSymbol]) -> Result<()> {
|
||||||
for left_symbol in left_symbols {
|
for left_symbol in left_symbols {
|
||||||
if let Some(right_symbol) = find_symbol(right_symbols, &left_symbol.name) {
|
if let Some(right_symbol) = right_symbols.iter_mut().find(|s| s.name == left_symbol.name) {
|
||||||
left_symbol.diff_symbol = Some(right_symbol.name.clone());
|
left_symbol.diff_symbol = Some(right_symbol.name.clone());
|
||||||
right_symbol.diff_symbol = Some(left_symbol.name.clone());
|
right_symbol.diff_symbol = Some(left_symbol.name.clone());
|
||||||
let percent = if left_symbol.size == right_symbol.size { 100.0 } else { 50.0 };
|
let percent = if left_symbol.size == right_symbol.size { 100.0 } else { 50.0 };
|
||||||
@@ -511,13 +523,12 @@ fn diff_data(left: &mut ObjSection, right: &mut ObjSection) {
|
|||||||
let mut right_diff = Vec::<ObjDataDiff>::new();
|
let mut right_diff = Vec::<ObjDataDiff>::new();
|
||||||
let mut left_cur = 0usize;
|
let mut left_cur = 0usize;
|
||||||
let mut right_cur = 0usize;
|
let mut right_cur = 0usize;
|
||||||
let mut cur_op = LevEditType::Keep;
|
let mut cur_op = LevEditType::Replace;
|
||||||
let mut cur_left_data = Vec::<u8>::new();
|
let mut cur_left_data = Vec::<u8>::new();
|
||||||
let mut cur_right_data = Vec::<u8>::new();
|
let mut cur_right_data = Vec::<u8>::new();
|
||||||
for op in edit_ops {
|
for op in edit_ops {
|
||||||
if cur_op != op.op_type || left_cur < op.first_start || right_cur < op.second_start {
|
if cur_op != op.op_type || left_cur < op.first_start || right_cur < op.second_start {
|
||||||
match cur_op {
|
match cur_op {
|
||||||
LevEditType::Keep => {}
|
|
||||||
LevEditType::Replace => {
|
LevEditType::Replace => {
|
||||||
let left_data = take(&mut cur_left_data);
|
let left_data = take(&mut cur_left_data);
|
||||||
let right_data = take(&mut cur_right_data);
|
let right_data = take(&mut cur_right_data);
|
||||||
@@ -603,7 +614,6 @@ fn diff_data(left: &mut ObjSection, right: &mut ObjSection) {
|
|||||||
cur_left_data.push(left.data[left_cur]);
|
cur_left_data.push(left.data[left_cur]);
|
||||||
left_cur += 1;
|
left_cur += 1;
|
||||||
}
|
}
|
||||||
LevEditType::Keep => unreachable!(),
|
|
||||||
}
|
}
|
||||||
cur_op = op.op_type;
|
cur_op = op.op_type;
|
||||||
}
|
}
|
||||||
@@ -627,7 +637,6 @@ fn diff_data(left: &mut ObjSection, right: &mut ObjSection) {
|
|||||||
|
|
||||||
// TODO: merge with above
|
// TODO: merge with above
|
||||||
match cur_op {
|
match cur_op {
|
||||||
LevEditType::Keep => {}
|
|
||||||
LevEditType::Replace => {
|
LevEditType::Replace => {
|
||||||
let left_data = take(&mut cur_left_data);
|
let left_data = take(&mut cur_left_data);
|
||||||
let right_data = take(&mut cur_right_data);
|
let right_data = take(&mut cur_right_data);
|
||||||
|
|||||||
117
src/editops.rs
117
src/editops.rs
@@ -27,7 +27,6 @@
|
|||||||
|
|
||||||
#[derive(Debug, PartialEq, Eq, Copy, Clone)]
|
#[derive(Debug, PartialEq, Eq, Copy, Clone)]
|
||||||
pub enum LevEditType {
|
pub enum LevEditType {
|
||||||
Keep,
|
|
||||||
Replace,
|
Replace,
|
||||||
Insert,
|
Insert,
|
||||||
Delete,
|
Delete,
|
||||||
@@ -77,98 +76,66 @@ where T: PartialEq {
|
|||||||
cache_matrix[current + 1 + p] = x;
|
cache_matrix[current + 1 + p] = x;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
editops_from_cost_matrix(
|
editops_from_cost_matrix(matrix_columns, matrix_rows, prefix_len, cache_matrix)
|
||||||
first_string,
|
|
||||||
second_string,
|
|
||||||
matrix_columns,
|
|
||||||
matrix_rows,
|
|
||||||
prefix_len,
|
|
||||||
cache_matrix,
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn editops_from_cost_matrix<T>(
|
fn editops_from_cost_matrix(
|
||||||
string1: &[T],
|
|
||||||
string2: &[T],
|
|
||||||
len1: usize,
|
len1: usize,
|
||||||
len2: usize,
|
len2: usize,
|
||||||
prefix_len: usize,
|
prefix_len: usize,
|
||||||
cache_matrix: Vec<usize>,
|
cache_matrix: Vec<usize>,
|
||||||
) -> Vec<LevEditOp>
|
) -> Vec<LevEditOp> {
|
||||||
where
|
let mut ops = Vec::with_capacity(cache_matrix[len1 * len2 - 1]);
|
||||||
T: PartialEq,
|
|
||||||
{
|
|
||||||
let mut dir = 0;
|
let mut dir = 0;
|
||||||
|
|
||||||
let mut ops: Vec<LevEditOp> = vec![];
|
|
||||||
ops.reserve(cache_matrix[len1 * len2 - 1]);
|
|
||||||
|
|
||||||
let mut i = len1 - 1;
|
let mut i = len1 - 1;
|
||||||
let mut j = len2 - 1;
|
let mut j = len2 - 1;
|
||||||
let mut p = len1 * len2 - 1;
|
let mut p = len1 * len2 - 1;
|
||||||
|
|
||||||
// let string1_chars: Vec<char> = string1.chars().collect();
|
|
||||||
// let string2_chars: Vec<char> = string2.chars().collect();
|
|
||||||
|
|
||||||
//TODO this is still pretty ugly
|
//TODO this is still pretty ugly
|
||||||
while i > 0 || j > 0 {
|
while i > 0 || j > 0 {
|
||||||
let current_value = cache_matrix[p];
|
let current_value = cache_matrix[p];
|
||||||
|
|
||||||
let op_type;
|
// More than one operation can be possible at a time. We use `dir` to
|
||||||
|
// decide when ambiguous.
|
||||||
|
let is_insert = j > 0 && current_value == cache_matrix[p - 1] + 1;
|
||||||
|
let is_delete = i > 0 && current_value == cache_matrix[p - len2] + 1;
|
||||||
|
let is_replace = i > 0 && j > 0 && current_value == cache_matrix[p - len2 - 1] + 1;
|
||||||
|
|
||||||
if dir == -1 && j > 0 && current_value == cache_matrix[p - 1] + 1 {
|
let (op_type, new_dir) = match (dir, is_insert, is_delete, is_replace) {
|
||||||
op_type = LevEditType::Insert;
|
(_, false, false, false) => (None, 0),
|
||||||
} else if dir == 1 && i > 0 && current_value == cache_matrix[p - len2] + 1 {
|
(-1, true, _, _) => (Some(LevEditType::Insert), -1),
|
||||||
op_type = LevEditType::Delete;
|
(1, _, true, _) => (Some(LevEditType::Delete), 1),
|
||||||
} else if i > 0
|
(_, _, _, true) => (Some(LevEditType::Replace), 0),
|
||||||
&& j > 0
|
(0, true, _, _) => (Some(LevEditType::Insert), -1),
|
||||||
&& current_value == cache_matrix[p - len2 - 1]
|
(0, _, true, _) => (Some(LevEditType::Delete), 1),
|
||||||
&& string1[i - 1] == string2[j - 1]
|
_ => panic!("something went terribly wrong"),
|
||||||
{
|
|
||||||
op_type = LevEditType::Keep;
|
|
||||||
} else if i > 0 && j > 0 && current_value == cache_matrix[p - len2 - 1] + 1 {
|
|
||||||
op_type = LevEditType::Replace;
|
|
||||||
}
|
|
||||||
/* we can't turn directly from -1 to 1, in this case it would be better
|
|
||||||
* to go diagonally, but check it (dir == 0) */
|
|
||||||
else if dir == 0 && j > 0 && current_value == cache_matrix[p - 1] + 1 {
|
|
||||||
op_type = LevEditType::Insert;
|
|
||||||
} else if dir == 0 && i > 0 && current_value == cache_matrix[p - len2] + 1 {
|
|
||||||
op_type = LevEditType::Delete;
|
|
||||||
} else {
|
|
||||||
panic!("something went terribly wrong");
|
|
||||||
}
|
|
||||||
|
|
||||||
match op_type {
|
|
||||||
LevEditType::Insert => {
|
|
||||||
j -= 1;
|
|
||||||
p -= 1;
|
|
||||||
dir = -1;
|
|
||||||
}
|
|
||||||
LevEditType::Delete => {
|
|
||||||
i -= 1;
|
|
||||||
p -= len2;
|
|
||||||
dir = 1;
|
|
||||||
}
|
|
||||||
LevEditType::Replace => {
|
|
||||||
i -= 1;
|
|
||||||
j -= 1;
|
|
||||||
p -= len2 + 1;
|
|
||||||
dir = 0;
|
|
||||||
}
|
|
||||||
LevEditType::Keep => {
|
|
||||||
i -= 1;
|
|
||||||
j -= 1;
|
|
||||||
p -= len2 + 1;
|
|
||||||
dir = 0;
|
|
||||||
/* LevEditKeep does not has to be stored */
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
let edit_op =
|
match new_dir {
|
||||||
LevEditOp { op_type, first_start: i + prefix_len, second_start: j + prefix_len };
|
-1 => {
|
||||||
ops.insert(0, edit_op);
|
j -= 1;
|
||||||
|
p -= 1;
|
||||||
|
}
|
||||||
|
1 => {
|
||||||
|
i -= 1;
|
||||||
|
p -= len2;
|
||||||
|
}
|
||||||
|
0 => {
|
||||||
|
i -= 1;
|
||||||
|
j -= 1;
|
||||||
|
p -= len2 + 1;
|
||||||
|
}
|
||||||
|
_ => panic!("something went terribly wrong"),
|
||||||
|
};
|
||||||
|
dir = new_dir;
|
||||||
|
|
||||||
|
if let Some(op_type) = op_type {
|
||||||
|
ops.insert(0, LevEditOp {
|
||||||
|
op_type,
|
||||||
|
first_start: i + prefix_len,
|
||||||
|
second_start: j + prefix_len,
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ops
|
ops
|
||||||
|
|||||||
@@ -54,7 +54,8 @@ fn main() {
|
|||||||
"objdiff",
|
"objdiff",
|
||||||
native_options,
|
native_options,
|
||||||
Box::new(move |cc| Box::new(objdiff::App::new(cc, utc_offset, exec_path_clone))),
|
Box::new(move |cc| Box::new(objdiff::App::new(cc, utc_offset, exec_path_clone))),
|
||||||
);
|
)
|
||||||
|
.expect("Failed to run eframe application");
|
||||||
|
|
||||||
// Attempt to relaunch application from the updated path
|
// Attempt to relaunch application from the updated path
|
||||||
if let Ok(mut guard) = exec_path.lock() {
|
if let Ok(mut guard) = exec_path.lock() {
|
||||||
|
|||||||
@@ -126,13 +126,11 @@ fn symbols_by_section(obj_file: &File<'_>, section: &ObjSection) -> Result<Vec<O
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn common_symbols(obj_file: &File<'_>) -> Result<Vec<ObjSymbol>> {
|
fn common_symbols(obj_file: &File<'_>) -> Result<Vec<ObjSymbol>> {
|
||||||
let mut result = Vec::<ObjSymbol>::new();
|
obj_file
|
||||||
for symbol in obj_file.symbols() {
|
.symbols()
|
||||||
if symbol.is_common() {
|
.filter(Symbol::is_common)
|
||||||
result.push(to_obj_symbol(obj_file, &symbol, 0)?);
|
.map(|symbol| to_obj_symbol(obj_file, &symbol, 0))
|
||||||
}
|
.collect::<Result<Vec<ObjSymbol>>>()
|
||||||
}
|
|
||||||
Ok(result)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn find_section_symbol(
|
fn find_section_symbol(
|
||||||
|
|||||||
@@ -74,7 +74,7 @@ pub fn config_ui(ui: &mut egui::Ui, config: &Arc<RwLock<AppConfig>>, view_state:
|
|||||||
ui.label(formatcp!("Git branch: {}", env!("VERGEN_GIT_BRANCH")));
|
ui.label(formatcp!("Git branch: {}", env!("VERGEN_GIT_BRANCH")));
|
||||||
ui.label(formatcp!("Git commit: {}", env!("VERGEN_GIT_SHA")));
|
ui.label(formatcp!("Git commit: {}", env!("VERGEN_GIT_SHA")));
|
||||||
ui.label(formatcp!("Build target: {}", env!("VERGEN_CARGO_TARGET_TRIPLE")));
|
ui.label(formatcp!("Build target: {}", env!("VERGEN_CARGO_TARGET_TRIPLE")));
|
||||||
ui.label(formatcp!("Build type: {}", env!("VERGEN_CARGO_PROFILE")));
|
ui.label(formatcp!("Debug: {}", env!("VERGEN_CARGO_DEBUG")));
|
||||||
});
|
});
|
||||||
if let Some(state) = &view_state.check_update {
|
if let Some(state) = &view_state.check_update {
|
||||||
ui.label(format!("Latest version: {}", state.latest_release.version));
|
ui.label(format!("Latest version: {}", state.latest_release.version));
|
||||||
@@ -96,8 +96,10 @@ pub fn config_ui(ui: &mut egui::Ui, config: &Arc<RwLock<AppConfig>>, view_state:
|
|||||||
.on_hover_text_at_pointer("Open a link to the latest release on GitHub")
|
.on_hover_text_at_pointer("Open a link to the latest release on GitHub")
|
||||||
.clicked()
|
.clicked()
|
||||||
{
|
{
|
||||||
ui.output().open_url =
|
ui.output_mut(|output| {
|
||||||
Some(OpenUrl { url: RELEASE_URL.to_string(), new_tab: true });
|
output.open_url =
|
||||||
|
Some(OpenUrl { url: RELEASE_URL.to_string(), new_tab: true })
|
||||||
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -226,31 +226,31 @@ fn ins_context_menu(ui: &mut egui::Ui, ins: &ObjIns) {
|
|||||||
match arg {
|
match arg {
|
||||||
Argument::Uimm(v) => {
|
Argument::Uimm(v) => {
|
||||||
if ui.button(format!("Copy \"{v}\"")).clicked() {
|
if ui.button(format!("Copy \"{v}\"")).clicked() {
|
||||||
ui.output().copied_text = format!("{v}");
|
ui.output_mut(|output| output.copied_text = format!("{v}"));
|
||||||
ui.close_menu();
|
ui.close_menu();
|
||||||
}
|
}
|
||||||
if ui.button(format!("Copy \"{}\"", v.0)).clicked() {
|
if ui.button(format!("Copy \"{}\"", v.0)).clicked() {
|
||||||
ui.output().copied_text = format!("{}", v.0);
|
ui.output_mut(|output| output.copied_text = format!("{}", v.0));
|
||||||
ui.close_menu();
|
ui.close_menu();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Argument::Simm(v) => {
|
Argument::Simm(v) => {
|
||||||
if ui.button(format!("Copy \"{v}\"")).clicked() {
|
if ui.button(format!("Copy \"{v}\"")).clicked() {
|
||||||
ui.output().copied_text = format!("{v}");
|
ui.output_mut(|output| output.copied_text = format!("{v}"));
|
||||||
ui.close_menu();
|
ui.close_menu();
|
||||||
}
|
}
|
||||||
if ui.button(format!("Copy \"{}\"", v.0)).clicked() {
|
if ui.button(format!("Copy \"{}\"", v.0)).clicked() {
|
||||||
ui.output().copied_text = format!("{}", v.0);
|
ui.output_mut(|output| output.copied_text = format!("{}", v.0));
|
||||||
ui.close_menu();
|
ui.close_menu();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Argument::Offset(v) => {
|
Argument::Offset(v) => {
|
||||||
if ui.button(format!("Copy \"{v}\"")).clicked() {
|
if ui.button(format!("Copy \"{v}\"")).clicked() {
|
||||||
ui.output().copied_text = format!("{v}");
|
ui.output_mut(|output| output.copied_text = format!("{v}"));
|
||||||
ui.close_menu();
|
ui.close_menu();
|
||||||
}
|
}
|
||||||
if ui.button(format!("Copy \"{}\"", v.0)).clicked() {
|
if ui.button(format!("Copy \"{}\"", v.0)).clicked() {
|
||||||
ui.output().copied_text = format!("{}", v.0);
|
ui.output_mut(|output| output.copied_text = format!("{}", v.0));
|
||||||
ui.close_menu();
|
ui.close_menu();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -261,12 +261,12 @@ fn ins_context_menu(ui: &mut egui::Ui, ins: &ObjIns) {
|
|||||||
if let Some(reloc) = &ins.reloc {
|
if let Some(reloc) = &ins.reloc {
|
||||||
if let Some(name) = &reloc.target.demangled_name {
|
if let Some(name) = &reloc.target.demangled_name {
|
||||||
if ui.button(format!("Copy \"{name}\"")).clicked() {
|
if ui.button(format!("Copy \"{name}\"")).clicked() {
|
||||||
ui.output().copied_text = name.clone();
|
ui.output_mut(|output| output.copied_text = name.clone());
|
||||||
ui.close_menu();
|
ui.close_menu();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ui.button(format!("Copy \"{}\"", reloc.target.name)).clicked() {
|
if ui.button(format!("Copy \"{}\"", reloc.target.name)).clicked() {
|
||||||
ui.output().copied_text = reloc.target.name.clone();
|
ui.output_mut(|output| output.copied_text = reloc.target.name.clone());
|
||||||
ui.close_menu();
|
ui.close_menu();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,12 +28,12 @@ fn symbol_context_menu_ui(ui: &mut Ui, symbol: &ObjSymbol) {
|
|||||||
|
|
||||||
if let Some(name) = &symbol.demangled_name {
|
if let Some(name) = &symbol.demangled_name {
|
||||||
if ui.button(format!("Copy \"{name}\"")).clicked() {
|
if ui.button(format!("Copy \"{name}\"")).clicked() {
|
||||||
ui.output().copied_text = name.clone();
|
ui.output_mut(|output| output.copied_text = name.clone());
|
||||||
ui.close_menu();
|
ui.close_menu();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ui.button(format!("Copy \"{}\"", symbol.name)).clicked() {
|
if ui.button(format!("Copy \"{}\"", symbol.name)).clicked() {
|
||||||
ui.output().copied_text = symbol.name.clone();
|
ui.output_mut(|output| output.copied_text = symbol.name.clone());
|
||||||
ui.close_menu();
|
ui.close_menu();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -282,9 +282,9 @@ pub fn symbol_diff_ui(ui: &mut Ui, view_state: &mut ViewState) {
|
|||||||
strip.strip(|builder| {
|
strip.strip(|builder| {
|
||||||
builder.sizes(Size::remainder(), 2).horizontal(|mut strip| {
|
builder.sizes(Size::remainder(), 2).horizontal(|mut strip| {
|
||||||
strip.cell(|ui| {
|
strip.cell(|ui| {
|
||||||
if result.first_status.success {
|
ui.push_id("left", |ui| {
|
||||||
if let Some(obj) = &result.first_obj {
|
if result.first_status.success {
|
||||||
ui.push_id("left", |ui| {
|
if let Some(obj) = &result.first_obj {
|
||||||
symbol_list_ui(
|
symbol_list_ui(
|
||||||
ui,
|
ui,
|
||||||
obj,
|
obj,
|
||||||
@@ -294,16 +294,16 @@ pub fn symbol_diff_ui(ui: &mut Ui, view_state: &mut ViewState) {
|
|||||||
&lower_search,
|
&lower_search,
|
||||||
&view_state.view_config,
|
&view_state.view_config,
|
||||||
);
|
);
|
||||||
});
|
}
|
||||||
|
} else {
|
||||||
|
build_log_ui(ui, &result.first_status);
|
||||||
}
|
}
|
||||||
} else {
|
});
|
||||||
build_log_ui(ui, &result.first_status);
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
strip.cell(|ui| {
|
strip.cell(|ui| {
|
||||||
if result.second_status.success {
|
ui.push_id("right", |ui| {
|
||||||
if let Some(obj) = &result.second_obj {
|
if result.second_status.success {
|
||||||
ui.push_id("right", |ui| {
|
if let Some(obj) = &result.second_obj {
|
||||||
symbol_list_ui(
|
symbol_list_ui(
|
||||||
ui,
|
ui,
|
||||||
obj,
|
obj,
|
||||||
@@ -313,11 +313,11 @@ pub fn symbol_diff_ui(ui: &mut Ui, view_state: &mut ViewState) {
|
|||||||
&lower_search,
|
&lower_search,
|
||||||
&view_state.view_config,
|
&view_state.view_config,
|
||||||
);
|
);
|
||||||
});
|
}
|
||||||
|
} else {
|
||||||
|
build_log_ui(ui, &result.second_status);
|
||||||
}
|
}
|
||||||
} else {
|
});
|
||||||
build_log_ui(ui, &result.second_status);
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user