Instruction hover / context menu improvements

This commit is contained in:
2024-05-20 17:38:20 -06:00
parent 8b36fa4fc6
commit 5bfaaaaf65
10 changed files with 68 additions and 25 deletions

View File

@@ -49,6 +49,7 @@ impl ObjArch for ObjArchMips {
let code = self.endianness.read_u32_bytes(chunk.try_into()?);
let instruction = Instruction::new(code, cur_addr, InstrCategory::CPU);
let formatted = instruction.disassemble(None, 0);
let op = instruction.unique_id as u16;
ops.push(op);
@@ -123,6 +124,7 @@ impl ObjArch for ObjArchMips {
reloc: reloc.cloned(),
branch_dest,
line,
formatted,
orig: None,
});
cur_addr += 4;

View File

@@ -59,6 +59,7 @@ impl ObjArch for ObjArchPpc {
let orig = ins.basic().to_string();
let simplified = ins.simplified();
let formatted = simplified.to_string();
let mut reloc_arg = None;
if let Some(reloc) = reloc {
@@ -144,6 +145,7 @@ impl ObjArch for ObjArchPpc {
op: ins.op as u16,
branch_dest,
line,
formatted,
orig: Some(orig),
});
}

View File

@@ -57,6 +57,7 @@ impl ObjArch for ObjArchX86 {
reloc: None,
branch_dest: None,
line: None,
formatted: String::new(),
orig: None,
},
error: None,
@@ -81,6 +82,7 @@ impl ObjArch for ObjArchX86 {
reloc: reloc.cloned(),
branch_dest: None,
line: obj.line_info.as_ref().and_then(|m| m.get(&address).cloned()),
formatted: String::new(),
orig: None,
};
// Run the formatter, which will populate output.ins
@@ -89,7 +91,7 @@ impl ObjArch for ObjArchX86 {
return Err(error);
}
ensure!(output.ins_operands.len() == output.ins.args.len());
output.ins.orig = Some(output.formatted.clone());
output.ins.formatted.clone_from(&output.formatted);
// Make sure we've put the relocation somewhere in the instruction
if reloc.is_some() && !output.ins.args.iter().any(|a| matches!(a, ObjInsArg::Reloc)) {

View File

@@ -5,7 +5,7 @@ use crate::{
obj::{ObjInsArg, ObjInsArgValue, ObjReloc, ObjSymbol},
};
#[derive(Debug, Clone)]
#[derive(Debug, Copy, Clone)]
pub enum DiffText<'a> {
/// Basic text
Basic(&'a str),
@@ -95,8 +95,8 @@ fn display_reloc_name<E>(
) -> Result<(), E> {
cb(DiffText::Symbol(&reloc.target))?;
match reloc.target.addend.cmp(&0i64) {
Ordering::Greater => cb(DiffText::Basic(&format!("+{:#X}", reloc.target.addend))),
Ordering::Less => cb(DiffText::Basic(&format!("-{:#X}", -reloc.target.addend))),
Ordering::Greater => cb(DiffText::Basic(&format!("+{:#x}", reloc.target.addend))),
Ordering::Less => cb(DiffText::Basic(&format!("-{:#x}", -reloc.target.addend))),
_ => Ok(()),
}
}

View File

@@ -101,6 +101,8 @@ pub struct ObjIns {
pub branch_dest: Option<u64>,
/// Line number
pub line: Option<u64>,
/// Formatted instruction
pub formatted: String,
/// Original (unsimplified) instruction
pub orig: Option<String>,
}

View File

@@ -252,7 +252,7 @@ fn relocations_by_section(
} else {
reloc.addend()
};
// println!("Reloc: {reloc:?}, symbol: {symbol:?}, addend: {addend:#X}");
// println!("Reloc: {reloc:?}, symbol: {symbol:?}, addend: {addend:#x}");
let target = match symbol.kind() {
SymbolKind::Text | SymbolKind::Data | SymbolKind::Label | SymbolKind::Unknown => {
to_obj_symbol(arch, obj_file, &symbol, addend, split_meta)