diff --git a/Cargo.lock b/Cargo.lock index 9065268..0e43ace 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,6 +2,115 @@ # It is not intended for manual editing. version = 4 +[[package]] +name = "arrayvec" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" + +[[package]] +name = "bitcode" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a6ed1b54d8dc333e7be604d00fa9262f4635485ffea923647b6521a5fff045d" +dependencies = [ + "arrayvec", + "bitcode_derive", + "bytemuck", + "glam", + "serde", +] + +[[package]] +name = "bitcode_derive" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "238b90427dfad9da4a9abd60f3ec1cdee6b80454bde49ed37f1781dd8e9dc7f9" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "bytemuck" +version = "1.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec" + +[[package]] +name = "glam" +version = "0.33.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "898f5a568a84989b6c0f8caa50a93074b97dbdc58fc6d9543157bb4562758933" + [[package]] name = "lang" version = "0.1.0" +dependencies = [ + "bitcode", +] + +[[package]] +name = "proc-macro2" +version = "1.0.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "serde" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "syn" +version = "2.0.117" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "unicode-ident" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" diff --git a/Cargo.toml b/Cargo.toml index 3760968..811604c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,3 +4,6 @@ version = "0.1.0" edition = "2024" [dependencies] + +[dev-dependencies] +bitcode = "0.6.9" diff --git a/src/arch/x86_64/test/bin.rs b/src/arch/x86_64/test/bin.rs index 3606303..dc18d04 100644 --- a/src/arch/x86_64/test/bin.rs +++ b/src/arch/x86_64/test/bin.rs @@ -48,7 +48,7 @@ fn linux() -> Result<(), CompilerMsg> { program.entry = Some(entry); let linked = program.compile().expect("failed to compile"); let binary = linked.to_elf(); - let path = "./x86_64_test"; + let path = "./test/x86_64_test"; write(path, &binary); println!("running..."); let gdb = false; @@ -106,7 +106,7 @@ fn windows() -> Result<(), CompilerMsg> { let linked = program.compile().expect("failed to compile"); let binary = linked.to_pe(); - let path = "./x86_64_test.exe"; + let path = "./test/x86_64_test.exe"; write(path, &binary); let mut cmd = Command::new("wine"); diff --git a/src/arch/x86_64/test/nasm.rs b/src/arch/x86_64/test/nasm.rs index 3d57725..92840b7 100644 --- a/src/arch/x86_64/test/nasm.rs +++ b/src/arch/x86_64/test/nasm.rs @@ -1,5 +1,5 @@ use crate::arch::x86_64::*; -use std::{fs::OpenOptions, io::Write, process::Command}; +use std::{collections::HashMap, fs::OpenOptions, io::Write, process::Command}; const DISPS: &[i32] = &[ 0x0, @@ -34,7 +34,8 @@ const WIDTHS: &[Width] = &[Width::B8, Width::B16, Width::B32, Width::B64]; #[test] fn mov() { - let c = &mut Code::default(); + let c = &mut TestCtx::new(); + for &r1 in Reg::IMPORTANT { for &r2 in Reg::IMPORTANT { eq(c, format!("mov {r1}, {r2}"), |c| c.mov(r1, r2)); @@ -59,13 +60,27 @@ fn mov() { } } +struct TestCtx { + code: Code, + cache: HashMap, String>>, + changed: bool, +} + fn eq( - code: &mut Code, + ctx: &mut TestCtx, asm: impl AsRef, instr: impl FnOnce(&mut Code) -> Result<(), CompilerMsg>, ) { let asm = asm.as_ref(); - let expected = nasm(asm); + let expected = if let Some(val) = ctx.cache.get(asm) { + val + } else { + ctx.changed = true; + let res = nasm(asm); + ctx.cache.insert(asm.to_string(), res); + ctx.cache.get(asm).unwrap() + }; + let code = &mut ctx.code; let res = instr(code); match (expected, res) { (Ok(expected), Err(e)) => { @@ -129,3 +144,27 @@ fn write(path: &str, binary: &[u8]) { file.write_all(binary).expect("Failed to write to file"); file.sync_all().expect("Failed to sync file"); } + +const CACHE_PATH: &str = "test/nasm_test_cache"; + +impl TestCtx { + fn new() -> Self { + let cache = match std::fs::read(CACHE_PATH) { + Ok(bytes) => bitcode::decode(&bytes).unwrap_or_default(), + Err(_) => Default::default(), + }; + Self { + code: Default::default(), + cache, + changed: Default::default(), + } + } +} + +impl Drop for TestCtx { + fn drop(&mut self) { + if self.changed { + write(CACHE_PATH, &bitcode::encode(&self.cache)); + } + } +} diff --git a/test/nasm_test_cache b/test/nasm_test_cache new file mode 100644 index 0000000..48944ce Binary files /dev/null and b/test/nasm_test_cache differ diff --git a/test/x86_64_test b/test/x86_64_test new file mode 100755 index 0000000..f306b2c Binary files /dev/null and b/test/x86_64_test differ diff --git a/x86_64_test.exe b/test/x86_64_test.exe similarity index 100% rename from x86_64_test.exe rename to test/x86_64_test.exe diff --git a/x86_64_test b/x86_64_test deleted file mode 100755 index 5ce75c5..0000000 Binary files a/x86_64_test and /dev/null differ