diff --git a/Cargo.lock b/Cargo.lock index 59de30f..c544b34 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -195,17 +195,6 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "857253367827bd9d0fd973f0ef15506a96e79e41b0ad7aa691203a4e3214f6c8" -[[package]] -name = "atty" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" -dependencies = [ - "hermit-abi 0.1.19", - "libc", - "winapi", -] - [[package]] name = "autocfg" version = "1.1.0" @@ -224,29 +213,6 @@ version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4a4ddaa51a5bc52a6948f74c06d20aaaddb71924eab79b8c97a8c556e942d6a" -[[package]] -name = "bindgen" -version = "0.60.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "062dddbc1ba4aca46de6338e2bf87771414c335f7b2f2036e8f3e9befebf88e6" -dependencies = [ - "bitflags", - "cexpr", - "clang-sys", - "clap", - "env_logger", - "lazy_static", - "lazycell", - "log", - "peeking_take_while", - "proc-macro2", - "quote", - "regex", - "rustc-hash", - "shlex", - "which", -] - [[package]] name = "bitflags" version = "1.3.2" @@ -354,15 +320,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" -[[package]] -name = "cexpr" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" -dependencies = [ - "nom", -] - [[package]] name = "cfg-expr" version = "0.11.0" @@ -393,41 +350,6 @@ dependencies = [ "libc", ] -[[package]] -name = "clang-sys" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa2e27ae6ab525c3d369ded447057bca5438d86dc3a68f6faafb8269ba82ebf3" -dependencies = [ - "glob", - "libc", - "libloading", -] - -[[package]] -name = "clap" -version = "3.2.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71655c45cb9845d3270c9d6df84ebe72b4dad3c2ba3f7023ad47c144e4e473a5" -dependencies = [ - "atty", - "bitflags", - "clap_lex", - "indexmap", - "strsim", - "termcolor", - "textwrap", -] - -[[package]] -name = "clap_lex" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2850f2f5a82cbf437dd5af4d49848fbdfc27c157c3d010345776f952765261c5" -dependencies = [ - "os_str_bytes", -] - [[package]] name = "clipboard-win" version = "4.5.0" @@ -888,12 +810,6 @@ dependencies = [ "web-sys", ] -[[package]] -name = "either" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90e5c1c8368803113bf0c9584fc495a58b86dc8a29edbf8fe877d21d9507e797" - [[package]] name = "emath" version = "0.20.0" @@ -961,19 +877,6 @@ dependencies = [ "syn", ] -[[package]] -name = "env_logger" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a12e6657c4c97ebab115a42dcee77225f7f482cdd841cf7088c657a42e9e00e7" -dependencies = [ - "atty", - "humantime", - "log", - "regex", - "termcolor", -] - [[package]] name = "epaint" version = "0.20.0" @@ -1455,15 +1358,6 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2540771e65fc8cb83cd6e8a237f70c319bd5c29f78ed1084ba5d50eeac86f7f9" -[[package]] -name = "hermit-abi" -version = "0.1.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" -dependencies = [ - "libc", -] - [[package]] name = "hermit-abi" version = "0.2.6" @@ -1507,12 +1401,6 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" -[[package]] -name = "humantime" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" - [[package]] name = "hyper" version = "0.14.23" @@ -1725,12 +1613,6 @@ version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" -[[package]] -name = "lazycell" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" - [[package]] name = "libc" version = "0.2.139" @@ -2016,7 +1898,7 @@ version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b" dependencies = [ - "hermit-abi 0.2.6", + "hermit-abi", "libc", ] @@ -2211,12 +2093,6 @@ dependencies = [ "vcpkg", ] -[[package]] -name = "os_str_bytes" -version = "6.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b7820b9daea5457c9f21c69448905d723fbd21136ccf521748f23fd49e723ee" - [[package]] name = "overload" version = "0.1.1" @@ -2279,12 +2155,6 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e91099d4268b0e11973f036e885d652fb0b21fedcf69738c627f94db6a44f42" -[[package]] -name = "peeking_take_while" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099" - [[package]] name = "percent-encoding" version = "2.2.0" @@ -2406,13 +2276,13 @@ dependencies = [ [[package]] name = "rabbitizer" -version = "0.1.0" -source = "git+https://github.com/encounter/rabbitizer-rs?rev=10c279b2ef251c62885b1dcdcfe740b0db8e9956#10c279b2ef251c62885b1dcdcfe740b0db8e9956" +version = "1.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eec4aef28c5d3347686a9dc24302c088a74f8f7da6865a76821adb8843b62bda" dependencies = [ - "bindgen", "cc", - "cty", "glob", + "num_enum", ] [[package]] @@ -2601,12 +2471,6 @@ dependencies = [ "serde", ] -[[package]] -name = "rustc-hash" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" - [[package]] name = "rustls" version = "0.20.7" @@ -2820,12 +2684,6 @@ dependencies = [ "lazy_static", ] -[[package]] -name = "shlex" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43b2853a4d09f215c24cc5489c992ce46052d359b5109343cbafbf26bc62f8a3" - [[package]] name = "slab" version = "0.4.7" @@ -2951,21 +2809,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "termcolor" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "textwrap" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "222a222a5bfe1bba4a77b45ec488a741b3cb8872e5e499451fd7d0129c9c7c3d" - [[package]] name = "thiserror" version = "1.0.38" @@ -3544,17 +3387,6 @@ dependencies = [ "webpki", ] -[[package]] -name = "which" -version = "4.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c831fbbee9e129a8cf93e7747a82da9d95ba8e16621cae60ec2cdc849bacb7b" -dependencies = [ - "either", - "libc", - "once_cell", -] - [[package]] name = "winapi" version = "0.3.9" diff --git a/Cargo.toml b/Cargo.toml index 98e6e8f..23886ec 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -32,7 +32,7 @@ notify = "5.0.0" object = { version = "0.30.2", features = ["read_core", "std", "elf"], default-features = false } png = "0.17.7" ppc750cl = { git = "https://github.com/terorie/ppc750cl", rev = "9ae36eef34aa6d74e00972c7671f547a2acfd0aa" } -rabbitizer = { git = "https://github.com/encounter/rabbitizer-rs", rev = "10c279b2ef251c62885b1dcdcfe740b0db8e9956" } +rabbitizer = "1.5.7" rfd = { version = "0.10.0" } #, default-features = false, features = ['xdg-portal'] serde = { version = "1", features = ["derive"] } tempfile = "3.3.0" diff --git a/src/obj/mips.rs b/src/obj/mips.rs index a0e9a1d..44bafaf 100644 --- a/src/obj/mips.rs +++ b/src/obj/mips.rs @@ -1,10 +1,16 @@ use std::collections::BTreeMap; use anyhow::Result; -use rabbitizer::{config_set_register_fpr_abi_names, Abi, Instruction, SimpleOperandType}; +use rabbitizer::{config, Abi, Instruction, InstrCategory, OperandType}; use crate::obj::{ObjIns, ObjInsArg, ObjReloc}; +fn configure_rabbitizer() { + unsafe { + config::RabbitizerConfig_Cfg.reg_names.fpr_abi_names = Abi::O32; + } +} + pub fn process_code( data: &[u8], start_address: u64, @@ -12,7 +18,7 @@ pub fn process_code( relocs: &[ObjReloc], line_info: &Option>, ) -> Result<(Vec, Vec)> { - config_set_register_fpr_abi_names(Abi::RABBITIZER_ABI_O32); + configure_rabbitizer(); let ins_count = data.len() / 4; let mut ops = Vec::::with_capacity(ins_count); @@ -21,21 +27,21 @@ pub fn process_code( for chunk in data.chunks_exact(4) { let reloc = relocs.iter().find(|r| (r.address as u32 & !3) == cur_addr); let code = u32::from_be_bytes(chunk.try_into()?); - let mut instruction = Instruction::new(code, cur_addr); + let instruction = Instruction::new(code, cur_addr, InstrCategory::CPU); - let op = instruction.instr_id() as u8; + let op = instruction.unique_id as u8; ops.push(op); - let mnemonic = instruction.instr_id().get_opcode_name().unwrap_or_default().to_string(); + let mnemonic = instruction.opcode_name().to_string(); let is_branch = instruction.is_branch(); let branch_offset = instruction.branch_offset(); let branch_dest = if is_branch { Some((cur_addr as i32 + branch_offset) as u32) } else { None }; let args = instruction - .simple_operands() + .get_operands_slice() .iter() - .map(|op| match op.kind { - SimpleOperandType::Imm | SimpleOperandType::Label => { + .map(|op| match op { + OperandType::cpu_immediate | OperandType::cpu_label | OperandType::cpu_branch_target_label => { if is_branch { ObjInsArg::BranchOffset(branch_offset) } else if let Some(reloc) = reloc { @@ -49,17 +55,17 @@ pub fn process_code( ObjInsArg::Reloc } } else { - ObjInsArg::MipsArg(op.disassembled.clone()) + ObjInsArg::MipsArg(op.disassemble(&instruction, None)) } } - SimpleOperandType::ImmBase => { + OperandType::cpu_immediate_base => { if reloc.is_some() { ObjInsArg::RelocWithBase } else { - ObjInsArg::MipsArg(op.disassembled.clone()) + ObjInsArg::MipsArg(op.disassemble(&instruction, None)) } } - _ => ObjInsArg::MipsArg(op.disassembled.clone()), + _ => ObjInsArg::MipsArg(op.disassemble(&instruction, None)), }) .collect(); let line =