diff --git a/src/main.rs b/src/main.rs index c00467d..ae5b142 100644 --- a/src/main.rs +++ b/src/main.rs @@ -12,25 +12,95 @@ struct Cli { ver: u32, } +mod tests { + + use super::*; + #[test] + fn test_lldb() { + let text = "0x3a6 <+22>: fea42623 sw a0, -0x14(s0) + 0x3aa <+26>: 0940003f 00200020 + 0x3b2 <+34>: 021f 0000 1000 + 0x3b8 <+40>: 084f940b + 0x3bc <+44>: b8f2 + 0x3be <+46>: 084f940b + 0x3c2 <+50>: b8f2 + 0x3c4 <+52>: ff042503 lw a0, -0x10(s0) "; + + for (i, line) in text.lines().enumerate() { + if let Ok(data) = parse_insn(&line.to_owned()) { + println!("{i}: {}", decoder::decode(data.0, data.1).unwrap()); + assert!(if [1, 2, 3, 4, 5, 6].iter().find(|x| **x == i).is_some() { + true + } else { + false + }); + } else { + println!("{line}"); + } + } + } + + #[test] + fn test_llvm() { + let text = " + 3a6: fea42623 sw a0, -0x14(s0) + 3aa: 0940003f 00200020 + 3b2: 021f 0000 1000 + 3b8: 084f940b + 3bc: b8f2 fsd ft8, 0x70(sp) + 3be: 084f940b + 3c2: b8f2 fsd ft8, 0x70(sp) + 3c4: ff042503 lw a0, -0x10(s0)"; + + for (i, line) in text.lines().enumerate() { + if let Ok(data) = parse_insn(&line.to_owned()) { + println!("{i}: {}", decoder::decode(data.0, data.1).unwrap()); + assert!(if [2, 3, 4, 6].iter().find(|x| **x == i).is_some() { + true + } else { + false + }); + } else { + println!("{line}"); + } + } + } +} + // Frames fn parse_insn(line: &String) -> Result<(usize, Vec), ()> { // lines are addr: bytes let bstart: usize = line.find(":").ok_or(())?; - let bend = line.find("").ok_or(())?; - let mut sz = 0; let mut bytes = vec![]; - for data in line[bstart + 1..bend].trim().split(" ") { - if data.len() == 8 { - sz += 4; - bytes.push(u16::from_str_radix(&data[0..4], 16).map_err(|_| ())?); - bytes.push(u16::from_str_radix(&data[4..8], 16).map_err(|_| ())?); - } else { - sz += 2; - bytes.push(u16::from_str_radix(&data[0..4], 16).map_err(|_| ())?); + + // llvm objdump style + if let Ok(bend) = line.find("").ok_or(()) { + for data in line[bstart + 1..bend].trim().split(" ") { + let data = data.trim(); + if data.len() == 8 { + sz += 4; + bytes.push(u16::from_str_radix(&data[0..4], 16).map_err(|_| ())?); + bytes.push(u16::from_str_radix(&data[4..8], 16).map_err(|_| ())?); + } else { + sz += 2; + bytes.push(u16::from_str_radix(&data[0..4], 16).map_err(|_| ())?); + } + } + } else { + for data in line[bstart + 1..].trim().split(" ") { + if data.len() == 8 { + sz += 4; + bytes.push(u16::from_str_radix(&data[0..4], 16).map_err(|_| ())?); + bytes.push(u16::from_str_radix(&data[4..8], 16).map_err(|_| ())?); + } else if data.len() == 4 { + sz += 2; + bytes.push(u16::from_str_radix(&data[0..4], 16).map_err(|_| ())?); + } else { + return Err(()); + } } } - Ok((sz, bytes)) } @@ -46,7 +116,7 @@ fn parse_line(s: &String) -> Result { } fn main() { - let _cli = Cli::parse(); + let _cli = Cli::parse(); for line in std::io::stdin().lines() { if let Ok(data) = line { if let Ok(dline) = parse_line(&data) {