Use rabbitizer 2

Co-Authored-By: Luke Street <luke@street.dev>
This commit is contained in:
angie 2024-10-05 09:53:54 -06:00 committed by Luke Street
parent bbd8d9714f
commit 6d3c63ccd8
3 changed files with 123 additions and 185 deletions

185
Cargo.lock generated
View File

@ -89,7 +89,7 @@ dependencies = [
"ndk", "ndk",
"ndk-context", "ndk-context",
"ndk-sys 0.6.0+11769913", "ndk-sys 0.6.0+11769913",
"num_enum 0.7.3", "num_enum",
"thiserror 1.0.69", "thiserror 1.0.69",
] ]
@ -147,7 +147,7 @@ dependencies = [
"proc-macro2", "proc-macro2",
"pulldown-cmark", "pulldown-cmark",
"quote", "quote",
"syn 2.0.96", "syn",
] ]
[[package]] [[package]]
@ -318,7 +318,7 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.96", "syn",
] ]
[[package]] [[package]]
@ -353,7 +353,7 @@ checksum = "3f934833b4b7233644e5848f235df3f57ed8c80f1528a26c3dfa13d2147fa056"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.96", "syn",
] ]
[[package]] [[package]]
@ -498,7 +498,7 @@ checksum = "3fa76293b4f7bb636ab88fd78228235b5248b4d05cc589aed610f954af5d7c7a"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.96", "syn",
] ]
[[package]] [[package]]
@ -870,7 +870,7 @@ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"strsim", "strsim",
"syn 2.0.96", "syn",
] ]
[[package]] [[package]]
@ -881,7 +881,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806"
dependencies = [ dependencies = [
"darling_core", "darling_core",
"quote", "quote",
"syn 2.0.96", "syn",
] ]
[[package]] [[package]]
@ -928,7 +928,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.96", "syn",
] ]
[[package]] [[package]]
@ -1182,7 +1182,7 @@ checksum = "f282cfdfe92516eb26c2af8589c274c7c17681f5ecc03c18255fe741c6aa64eb"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.96", "syn",
] ]
[[package]] [[package]]
@ -1203,7 +1203,7 @@ checksum = "fc4caf64a58d7a6d65ab00639b046ff54399a39f5f2554728895ace4b297cd79"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.96", "syn",
] ]
[[package]] [[package]]
@ -1214,7 +1214,7 @@ checksum = "2f9ed6b3789237c8a0c1c505af1c7eb2c560df6186f01b098c3a1064ea532f38"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.96", "syn",
] ]
[[package]] [[package]]
@ -1444,7 +1444,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.96", "syn",
] ]
[[package]] [[package]]
@ -1537,7 +1537,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.96", "syn",
] ]
[[package]] [[package]]
@ -1618,12 +1618,6 @@ dependencies = [
"xml-rs", "xml-rs",
] ]
[[package]]
name = "glob"
version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2"
[[package]] [[package]]
name = "globset" name = "globset"
version = "0.4.15" version = "0.4.15"
@ -2079,7 +2073,7 @@ checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.96", "syn",
] ]
[[package]] [[package]]
@ -2187,7 +2181,7 @@ dependencies = [
"indoc", "indoc",
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.96", "syn",
] ]
[[package]] [[package]]
@ -2587,7 +2581,7 @@ dependencies = [
"jni-sys", "jni-sys",
"log", "log",
"ndk-sys 0.6.0+11769913", "ndk-sys 0.6.0+11769913",
"num_enum 0.7.3", "num_enum",
"raw-window-handle", "raw-window-handle",
"thiserror 1.0.69", "thiserror 1.0.69",
] ]
@ -2698,34 +2692,13 @@ dependencies = [
"autocfg", "autocfg",
] ]
[[package]]
name = "num_enum"
version = "0.5.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9"
dependencies = [
"num_enum_derive 0.5.11",
]
[[package]] [[package]]
name = "num_enum" name = "num_enum"
version = "0.7.3" version = "0.7.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179"
dependencies = [ dependencies = [
"num_enum_derive 0.7.3", "num_enum_derive",
]
[[package]]
name = "num_enum_derive"
version = "0.5.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799"
dependencies = [
"proc-macro-crate 1.3.1",
"proc-macro2",
"quote",
"syn 1.0.109",
] ]
[[package]] [[package]]
@ -2734,10 +2707,10 @@ version = "0.7.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56"
dependencies = [ dependencies = [
"proc-macro-crate 3.2.0", "proc-macro-crate",
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.96", "syn",
] ]
[[package]] [[package]]
@ -3031,7 +3004,7 @@ dependencies = [
"similar", "similar",
"spin", "spin",
"strum", "strum",
"syn 2.0.96", "syn",
"talc", "talc",
"tempfile", "tempfile",
"time", "time",
@ -3134,7 +3107,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.96", "syn",
] ]
[[package]] [[package]]
@ -3310,7 +3283,7 @@ checksum = "d56a66c0c55993aa927429d0f8a0abfd74f084e4d9c192cffed01e418d83eefb"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.96", "syn",
] ]
[[package]] [[package]]
@ -3416,17 +3389,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6924ced06e1f7dfe3fa48d57b9f74f55d8915f5036121bef647ef4b204895fac" checksum = "6924ced06e1f7dfe3fa48d57b9f74f55d8915f5036121bef647ef4b204895fac"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"syn 2.0.96", "syn",
]
[[package]]
name = "proc-macro-crate"
version = "1.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919"
dependencies = [
"once_cell",
"toml_edit 0.19.15",
] ]
[[package]] [[package]]
@ -3435,7 +3398,7 @@ version = "3.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8ecf48c7ca261d60b74ab1a7b20da18bede46776b2e55535cb958eb595c5fa7b" checksum = "8ecf48c7ca261d60b74ab1a7b20da18bede46776b2e55535cb958eb595c5fa7b"
dependencies = [ dependencies = [
"toml_edit 0.22.22", "toml_edit",
] ]
[[package]] [[package]]
@ -3479,7 +3442,7 @@ dependencies = [
"prost", "prost",
"prost-types", "prost-types",
"regex", "regex",
"syn 2.0.96", "syn",
"tempfile", "tempfile",
] ]
@ -3493,7 +3456,7 @@ dependencies = [
"itertools", "itertools",
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.96", "syn",
] ]
[[package]] [[package]]
@ -3598,13 +3561,10 @@ dependencies = [
[[package]] [[package]]
name = "rabbitizer" name = "rabbitizer"
version = "1.12.5" version = "2.0.0-dev0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "git+https://github.com/Decompollaborate/rabbitizer.git?branch=🦀#aa49a93e06904afc66fc730eb5900e51088ee34c"
checksum = "676ff0dc2e6bd3f7a42c7b49985d8af5644c4466f819fbc30f916ea474426ed3"
dependencies = [ dependencies = [
"cc", "bitflags 2.8.0",
"glob",
"num_enum 0.5.11",
] ]
[[package]] [[package]]
@ -4085,7 +4045,7 @@ checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.96", "syn",
] ]
[[package]] [[package]]
@ -4108,7 +4068,7 @@ checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.96", "syn",
] ]
[[package]] [[package]]
@ -4340,7 +4300,7 @@ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"rustversion", "rustversion",
"syn 2.0.96", "syn",
] ]
[[package]] [[package]]
@ -4358,17 +4318,6 @@ dependencies = [
"is_ci", "is_ci",
] ]
[[package]]
name = "syn"
version = "1.0.109"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"
dependencies = [
"proc-macro2",
"quote",
"unicode-ident",
]
[[package]] [[package]]
name = "syn" name = "syn"
version = "2.0.96" version = "2.0.96"
@ -4397,7 +4346,7 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.96", "syn",
] ]
[[package]] [[package]]
@ -4474,7 +4423,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.96", "syn",
] ]
[[package]] [[package]]
@ -4485,7 +4434,7 @@ checksum = "26afc1baea8a989337eeb52b6e72a039780ce45c3edfcc9c5b9d112feeb173c2"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.96", "syn",
] ]
[[package]] [[package]]
@ -4613,7 +4562,7 @@ dependencies = [
"serde", "serde",
"serde_spanned", "serde_spanned",
"toml_datetime", "toml_datetime",
"toml_edit 0.22.22", "toml_edit",
] ]
[[package]] [[package]]
@ -4625,17 +4574,6 @@ dependencies = [
"serde", "serde",
] ]
[[package]]
name = "toml_edit"
version = "0.19.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421"
dependencies = [
"indexmap",
"toml_datetime",
"winnow 0.5.40",
]
[[package]] [[package]]
name = "toml_edit" name = "toml_edit"
version = "0.22.22" version = "0.22.22"
@ -4646,7 +4584,7 @@ dependencies = [
"serde", "serde",
"serde_spanned", "serde_spanned",
"toml_datetime", "toml_datetime",
"winnow 0.6.24", "winnow",
] ]
[[package]] [[package]]
@ -4695,7 +4633,7 @@ checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.96", "syn",
] ]
[[package]] [[package]]
@ -4960,7 +4898,7 @@ dependencies = [
"log", "log",
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.96", "syn",
"wasm-bindgen-shared", "wasm-bindgen-shared",
] ]
@ -4995,7 +4933,7 @@ checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.96", "syn",
"wasm-bindgen-backend", "wasm-bindgen-backend",
"wasm-bindgen-shared", "wasm-bindgen-shared",
] ]
@ -5372,7 +5310,7 @@ checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.96", "syn",
] ]
[[package]] [[package]]
@ -5383,7 +5321,7 @@ checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.96", "syn",
] ]
[[package]] [[package]]
@ -5696,15 +5634,6 @@ dependencies = [
"xkbcommon-dl", "xkbcommon-dl",
] ]
[[package]]
name = "winnow"
version = "0.5.40"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876"
dependencies = [
"memchr",
]
[[package]] [[package]]
name = "winnow" name = "winnow"
version = "0.6.24" version = "0.6.24"
@ -5773,7 +5702,7 @@ dependencies = [
"heck", "heck",
"indexmap", "indexmap",
"prettyplease", "prettyplease",
"syn 2.0.96", "syn",
"wasm-metadata", "wasm-metadata",
"wit-bindgen-core", "wit-bindgen-core",
"wit-component", "wit-component",
@ -5789,7 +5718,7 @@ dependencies = [
"prettyplease", "prettyplease",
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.96", "syn",
"wit-bindgen-core", "wit-bindgen-core",
"wit-bindgen-rust", "wit-bindgen-rust",
] ]
@ -5975,7 +5904,7 @@ checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.96", "syn",
"synstructure", "synstructure",
] ]
@ -6008,7 +5937,7 @@ dependencies = [
"tracing", "tracing",
"uds_windows", "uds_windows",
"windows-sys 0.59.0", "windows-sys 0.59.0",
"winnow 0.6.24", "winnow",
"xdg-home", "xdg-home",
"zbus_macros", "zbus_macros",
"zbus_names", "zbus_names",
@ -6021,10 +5950,10 @@ version = "5.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3685b5c81fce630efc3e143a4ded235b107f1b1cdf186c3f115529e5e5ae4265" checksum = "3685b5c81fce630efc3e143a4ded235b107f1b1cdf186c3f115529e5e5ae4265"
dependencies = [ dependencies = [
"proc-macro-crate 3.2.0", "proc-macro-crate",
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.96", "syn",
"zbus_names", "zbus_names",
"zvariant", "zvariant",
"zvariant_utils", "zvariant_utils",
@ -6038,7 +5967,7 @@ checksum = "519629a3f80976d89c575895b05677cbc45eaf9f70d62a364d819ba646409cc8"
dependencies = [ dependencies = [
"serde", "serde",
"static_assertions", "static_assertions",
"winnow 0.6.24", "winnow",
"zvariant", "zvariant",
] ]
@ -6060,7 +5989,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.96", "syn",
] ]
[[package]] [[package]]
@ -6080,7 +6009,7 @@ checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.96", "syn",
"synstructure", "synstructure",
] ]
@ -6109,7 +6038,7 @@ checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.96", "syn",
] ]
[[package]] [[package]]
@ -6123,7 +6052,7 @@ dependencies = [
"serde", "serde",
"static_assertions", "static_assertions",
"url", "url",
"winnow 0.6.24", "winnow",
"zvariant_derive", "zvariant_derive",
"zvariant_utils", "zvariant_utils",
] ]
@ -6134,10 +6063,10 @@ version = "5.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "573a8dd76961957108b10f7a45bac6ab1ea3e9b7fe01aff88325dc57bb8f5c8b" checksum = "573a8dd76961957108b10f7a45bac6ab1ea3e9b7fe01aff88325dc57bb8f5c8b"
dependencies = [ dependencies = [
"proc-macro-crate 3.2.0", "proc-macro-crate",
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.96", "syn",
"zvariant_utils", "zvariant_utils",
] ]
@ -6151,6 +6080,6 @@ dependencies = [
"quote", "quote",
"serde", "serde",
"static_assertions", "static_assertions",
"syn 2.0.96", "syn",
"winnow 0.6.24", "winnow",
] ]

View File

@ -155,7 +155,7 @@ cwextab = { version = "1.0", optional = true, git = "https://github.com/encounte
ppc750cl = { version = "0.3", optional = true } ppc750cl = { version = "0.3", optional = true }
# mips # mips
rabbitizer = { version = "1.12", optional = true } rabbitizer = { git = "https://github.com/Decompollaborate/rabbitizer.git", branch = "🦀", default-features = false, optional = true }
# x86 # x86
cpp_demangle = { version = "0.4", default-features = false, features = ["alloc"], optional = true } cpp_demangle = { version = "0.4", default-features = false, features = ["alloc"], optional = true }

View File

@ -1,12 +1,16 @@
use alloc::{borrow::Cow, collections::BTreeMap, format, vec::Vec}; use alloc::{borrow::Cow, collections::BTreeMap, format, string::ToString, vec::Vec};
use std::sync::Mutex;
use anyhow::{anyhow, bail, Result}; use anyhow::{bail, Result};
use object::{ use object::{
elf, Endian, Endianness, File, FileFlags, Object, ObjectSection, ObjectSymbol, Relocation, elf, Endian, Endianness, File, FileFlags, Object, ObjectSection, ObjectSymbol, Relocation,
RelocationFlags, RelocationTarget, RelocationFlags, RelocationTarget,
}; };
use rabbitizer::{config, Abi, InstrCategory, Instruction, OperandType}; use rabbitizer::{
abi::Abi,
operands::{ValuedOperand, IU16},
registers_meta::Register,
Instruction, InstructionDisplayFlags, InstructionFlags, IsaExtension, IsaVersion, Vram,
};
use crate::{ use crate::{
arch::{ObjArch, ProcessCodeResult}, arch::{ObjArch, ProcessCodeResult},
@ -14,18 +18,10 @@ use crate::{
obj::{ObjIns, ObjInsArg, ObjInsArgValue, ObjReloc, ObjSection}, obj::{ObjIns, ObjInsArg, ObjInsArgValue, ObjReloc, ObjSection},
}; };
static RABBITIZER_MUTEX: Mutex<()> = Mutex::new(());
fn configure_rabbitizer(abi: Abi) {
unsafe {
config::RabbitizerConfig_Cfg.reg_names.fpr_abi_names = abi;
}
}
pub struct ObjArchMips { pub struct ObjArchMips {
pub endianness: Endianness, pub endianness: Endianness,
pub abi: Abi, pub abi: Abi,
pub instr_category: InstrCategory, pub isa_extension: Option<IsaExtension>,
pub ri_gp_value: i32, pub ri_gp_value: i32,
} }
@ -39,8 +35,8 @@ const R_MIPS15_S3: u32 = 119;
impl ObjArchMips { impl ObjArchMips {
pub fn new(object: &File) -> Result<Self> { pub fn new(object: &File) -> Result<Self> {
let mut abi = Abi::NUMERIC; let mut abi = Abi::O32;
let mut instr_category = InstrCategory::CPU; let mut isa_extension = None;
match object.flags() { match object.flags() {
FileFlags::None => {} FileFlags::None => {}
FileFlags::Elf { e_flags, .. } => { FileFlags::Elf { e_flags, .. } => {
@ -51,14 +47,14 @@ impl ObjArchMips {
if e_flags & elf::EF_MIPS_ABI2 != 0 { if e_flags & elf::EF_MIPS_ABI2 != 0 {
Abi::N32 Abi::N32
} else { } else {
Abi::NUMERIC Abi::O32
} }
} }
}; };
instr_category = match e_flags & EF_MIPS_MACH { isa_extension = match e_flags & EF_MIPS_MACH {
EF_MIPS_MACH_ALLEGREX => InstrCategory::R4000ALLEGREX, EF_MIPS_MACH_ALLEGREX => Some(IsaExtension::R4000ALLEGREX),
EF_MIPS_MACH_5900 => InstrCategory::R5900, EF_MIPS_MACH_5900 => Some(IsaExtension::R5900),
_ => InstrCategory::CPU, _ => None,
}; };
} }
_ => bail!("Unsupported MIPS file flags"), _ => bail!("Unsupported MIPS file flags"),
@ -75,7 +71,7 @@ impl ObjArchMips {
.map(|bytes| object.endianness().read_i32_bytes(bytes)) .map(|bytes| object.endianness().read_i32_bytes(bytes))
.unwrap_or(0); .unwrap_or(0);
Ok(Self { endianness: object.endianness(), abi, instr_category, ri_gp_value }) Ok(Self { endianness: object.endianness(), abi, isa_extension, ri_gp_value })
} }
} }
@ -89,21 +85,25 @@ impl ObjArch for ObjArchMips {
line_info: &BTreeMap<u64, u32>, line_info: &BTreeMap<u64, u32>,
config: &DiffObjConfig, config: &DiffObjConfig,
) -> Result<ProcessCodeResult> { ) -> Result<ProcessCodeResult> {
let _guard = RABBITIZER_MUTEX.lock().map_err(|e| anyhow!("Failed to lock mutex: {e}"))?; let isa_extension = match config.mips_instr_category {
configure_rabbitizer(match config.mips_abi { MipsInstrCategory::Auto => self.isa_extension,
MipsInstrCategory::Cpu => None,
MipsInstrCategory::Rsp => Some(IsaExtension::RSP),
MipsInstrCategory::R3000gte => Some(IsaExtension::R3000GTE),
MipsInstrCategory::R4000allegrex => Some(IsaExtension::R4000ALLEGREX),
MipsInstrCategory::R5900 => Some(IsaExtension::R5900),
};
let instruction_flags = match isa_extension {
Some(extension) => InstructionFlags::new_extension(extension),
None => InstructionFlags::new_isa(IsaVersion::MIPS_III, None),
}
.with_abi(match config.mips_abi {
MipsAbi::Auto => self.abi, MipsAbi::Auto => self.abi,
MipsAbi::O32 => Abi::O32, MipsAbi::O32 => Abi::O32,
MipsAbi::N32 => Abi::N32, MipsAbi::N32 => Abi::N32,
MipsAbi::N64 => Abi::N64, MipsAbi::N64 => Abi::N64,
}); });
let instr_category = match config.mips_instr_category { let display_flags = InstructionDisplayFlags::default().with_unknown_instr_comment(false);
MipsInstrCategory::Auto => self.instr_category,
MipsInstrCategory::Cpu => InstrCategory::CPU,
MipsInstrCategory::Rsp => InstrCategory::RSP,
MipsInstrCategory::R3000gte => InstrCategory::R3000GTE,
MipsInstrCategory::R4000allegrex => InstrCategory::R4000ALLEGREX,
MipsInstrCategory::R5900 => InstrCategory::R5900,
};
let start_address = address; let start_address = address;
let end_address = address + code.len() as u64; let end_address = address + code.len() as u64;
@ -114,32 +114,35 @@ impl ObjArch for ObjArchMips {
for chunk in code.chunks_exact(4) { for chunk in code.chunks_exact(4) {
let reloc = relocations.iter().find(|r| (r.address as u32 & !3) == cur_addr); let reloc = relocations.iter().find(|r| (r.address as u32 & !3) == cur_addr);
let code = self.endianness.read_u32_bytes(chunk.try_into()?); let code = self.endianness.read_u32_bytes(chunk.try_into()?);
let instruction = Instruction::new(code, cur_addr, instr_category); let instruction = Instruction::new(code, Vram::new(cur_addr), instruction_flags);
let formatted = instruction.disassemble(None, 0); let formatted = instruction.display(&display_flags, None::<&str>, 0).to_string();
let op = instruction.unique_id as u16; let op = instruction.opcode() as u16;
ops.push(op); ops.push(op);
let mnemonic = instruction.opcode_name(); let mnemonic = instruction.opcode().name();
let is_branch = instruction.is_branch(); let mut branch_dest = instruction.get_branch_offset_generic().map(|a| a.inner() as u64);
let branch_offset = instruction.branch_offset();
let mut branch_dest = if is_branch {
cur_addr.checked_add_signed(branch_offset).map(|a| a as u64)
} else {
None
};
let operands = instruction.get_operands_slice(); let operands = instruction.valued_operands_iter();
let mut args = Vec::with_capacity(operands.len() + 1);
for (idx, op) in operands.iter().enumerate() { let mut args = Vec::with_capacity(6);
for (idx, op) in operands.enumerate() {
if idx > 0 { if idx > 0 {
args.push(ObjInsArg::PlainText(config.separator().into())); args.push(ObjInsArg::PlainText(config.separator().into()));
} }
match op { match op {
OperandType::cpu_immediate ValuedOperand::core_immediate(imm) => {
| OperandType::cpu_label if let Some(reloc) = reloc {
| OperandType::cpu_branch_target_label => { push_reloc(&mut args, reloc)?;
} else {
args.push(ObjInsArg::Arg(match imm {
IU16::Integer(s) => ObjInsArgValue::Signed(s as i64),
IU16::Unsigned(u) => ObjInsArgValue::Unsigned(u as u64),
}));
}
}
ValuedOperand::core_label(..) | ValuedOperand::core_branch_target_label(..) => {
if let Some(reloc) = reloc { if let Some(reloc) = reloc {
// If the relocation target is within the current function, we can // If the relocation target is within the current function, we can
// convert it into a relative branch target. Note that we check // convert it into a relative branch target. Note that we check
@ -161,25 +164,29 @@ impl ObjArch for ObjArchMips {
args.push(ObjInsArg::BranchDest(branch_dest)); args.push(ObjInsArg::BranchDest(branch_dest));
} else { } else {
args.push(ObjInsArg::Arg(ObjInsArgValue::Opaque( args.push(ObjInsArg::Arg(ObjInsArgValue::Opaque(
op.disassemble(&instruction, None).into(), op.display(&instruction, &display_flags, None::<&str>)
.to_string()
.into(),
))); )));
} }
} }
OperandType::cpu_immediate_base => { ValuedOperand::core_immediate_base(imm, base) => {
if let Some(reloc) = reloc { if let Some(reloc) = reloc {
push_reloc(&mut args, reloc)?; push_reloc(&mut args, reloc)?;
} else { } else {
args.push(ObjInsArg::Arg(ObjInsArgValue::Opaque( args.push(ObjInsArg::Arg(match imm {
OperandType::cpu_immediate.disassemble(&instruction, None).into(), IU16::Integer(s) => ObjInsArgValue::Signed(s as i64),
))); IU16::Unsigned(u) => ObjInsArgValue::Unsigned(u as u64),
}));
} }
args.push(ObjInsArg::PlainText("(".into())); args.push(ObjInsArg::PlainText("(".into()));
args.push(ObjInsArg::Arg(ObjInsArgValue::Opaque( args.push(ObjInsArg::Arg(ObjInsArgValue::Opaque(
OperandType::cpu_rs.disassemble(&instruction, None).into(), base.either_name(instruction.flags().abi(), display_flags.named_gpr())
.into(),
))); )));
args.push(ObjInsArg::PlainText(")".into())); args.push(ObjInsArg::PlainText(")".into()));
} }
// OperandType::r5900_immediate15 => match reloc { // ValuedOperand::r5900_immediate15(..) => match reloc {
// Some(reloc) // Some(reloc)
// if reloc.flags == RelocationFlags::Elf { r_type: R_MIPS15_S3 } => // if reloc.flags == RelocationFlags::Elf { r_type: R_MIPS15_S3 } =>
// { // {
@ -193,7 +200,9 @@ impl ObjArch for ObjArchMips {
// }, // },
_ => { _ => {
args.push(ObjInsArg::Arg(ObjInsArgValue::Opaque( args.push(ObjInsArg::Arg(ObjInsArgValue::Opaque(
op.disassemble(&instruction, None).into(), op.display(&instruction, &display_flags, None::<&str>)
.to_string()
.into(),
))); )));
} }
} }