From ef35509c98f2bd5435643a1d082b397c5e44b5eb Mon Sep 17 00:00:00 2001 From: Shadow Cat Date: Sat, 6 Jun 2026 21:19:09 -0400 Subject: [PATCH] arbitrary addr --- src/arch/mod.rs | 5 +++-- src/arch/x86_64/encode.rs | 8 ++++---- src/arch/x86_64/mod.rs | 3 ++- src/backend/elf.rs | 2 +- src/backend/ir/addr.rs | 15 +++++++++++++++ src/backend/ir/mod.rs | 8 +++++--- src/backend/ir/symbol.rs | 6 ++---- src/backend/link.rs | 6 +++--- 8 files changed, 35 insertions(+), 18 deletions(-) create mode 100644 src/backend/ir/addr.rs diff --git a/src/arch/mod.rs b/src/arch/mod.rs index 5d31702..28f4de2 100644 --- a/src/arch/mod.rs +++ b/src/arch/mod.rs @@ -1,5 +1,5 @@ use crate::{ - backend::{LinkedProgram, Program}, + backend::{Addr, LinkedProgram, Program}, io::CompilerMsg, }; @@ -8,5 +8,6 @@ pub mod x86_64; pub trait Arch: Sized { const NAME: &str; type Asm; - fn compile(p: &Program) -> Result; + type Addr: Addr; + fn compile(p: &Program) -> Result, CompilerMsg>; } diff --git a/src/arch/x86_64/encode.rs b/src/arch/x86_64/encode.rs index 2574651..a213662 100644 --- a/src/arch/x86_64/encode.rs +++ b/src/arch/x86_64/encode.rs @@ -1,13 +1,13 @@ use super::*; -use crate::backend::{Addr, LinkedProgram, SymTable, Symbol}; +use crate::backend::{LinkedProgram, SymTable, Symbol}; pub struct Encoder { pub data: Vec, - pub sym_tab: SymTable, + pub sym_tab: SymTable, pub missing: Vec<(usize, Symbol)>, } -pub fn encode_program(p: &Program) -> Result { +pub fn encode_program(p: &Program) -> Result, CompilerMsg> { let mut encoder = Encoder::new(p.sym_count()); p.encode_data(&mut encoder.data, &mut encoder.sym_tab); @@ -124,7 +124,7 @@ impl Encoder { } /// assumes the next instruction is directly after -fn addr_offset(pos: usize, addr: Addr) -> [u8; 4] { +fn addr_offset(pos: usize, addr: u64) -> [u8; 4] { let pos = (pos + 4) as i32; let offset = addr as i32 - pos; offset.to_le_bytes() diff --git a/src/arch/x86_64/mod.rs b/src/arch/x86_64/mod.rs index 5b6c633..738bf58 100644 --- a/src/arch/x86_64/mod.rs +++ b/src/arch/x86_64/mod.rs @@ -19,7 +19,8 @@ pub struct X86_64; impl Arch for X86_64 { const NAME: &str = "x86_64"; type Asm = Asm; - fn compile(p: &Program) -> Result { + type Addr = u64; + fn compile(p: &Program) -> Result, CompilerMsg> { encode_program(p) } } diff --git a/src/backend/elf.rs b/src/backend/elf.rs index bdea22d..117d76e 100644 --- a/src/backend/elf.rs +++ b/src/backend/elf.rs @@ -74,7 +74,7 @@ pub enum EType { } // this is currently specialized for riscv64; obviously add params later -pub fn create(program: &[u8], start_offset: Addr) -> Vec { +pub fn create(program: &[u8], start_offset: u64) -> Vec { let pie = true; let addr_start = if pie { 0 } else { 0x400000 }; let page_size = 0x1000; diff --git a/src/backend/ir/addr.rs b/src/backend/ir/addr.rs new file mode 100644 index 0000000..362652a --- /dev/null +++ b/src/backend/ir/addr.rs @@ -0,0 +1,15 @@ +pub trait Addr: Clone + Copy { + fn from_len(len: usize) -> Self; +} + +impl Addr for u64 { + fn from_len(len: usize) -> Self { + len as Self + } +} + +impl Addr for u32 { + fn from_len(len: usize) -> Self { + len as Self + } +} diff --git a/src/backend/ir/mod.rs b/src/backend/ir/mod.rs index 21890f8..36e534b 100644 --- a/src/backend/ir/mod.rs +++ b/src/backend/ir/mod.rs @@ -1,4 +1,6 @@ +mod addr; mod symbol; +pub use addr::*; pub use symbol::*; use crate::{arch::Arch, backend::LinkedProgram, io::CompilerMsg}; @@ -30,9 +32,9 @@ pub type VarId = usize; pub type FnId = usize; impl Program { - pub fn encode_data(&self, data: &mut Vec, sym_tab: &mut SymTable) { + pub fn encode_data(&self, data: &mut Vec, sym_tab: &mut SymTable) { for d in &self.ro_data { - let addr = data.len() as u64; + let addr = A::Addr::from_len(data.len()); data.extend(&d.bytes); sym_tab.insert(d.sym, addr); } @@ -58,7 +60,7 @@ impl Program { res } - pub fn compile(&self) -> Result { + pub fn compile(&self) -> Result, CompilerMsg> { A::compile(self) } diff --git a/src/backend/ir/symbol.rs b/src/backend/ir/symbol.rs index 4fec23b..b49e333 100644 --- a/src/backend/ir/symbol.rs +++ b/src/backend/ir/symbol.rs @@ -1,10 +1,8 @@ #[derive(Debug, Clone, Copy, Hash, PartialEq, Eq)] pub struct Symbol(pub(super) usize); -pub type Addr = u64; - -pub struct SymTable(Vec>); -impl SymTable { +pub struct SymTable(Vec>); +impl SymTable { pub fn new(len: usize) -> Self { Self(vec![None; len]) } diff --git a/src/backend/link.rs b/src/backend/link.rs index 027eefe..9336c52 100644 --- a/src/backend/link.rs +++ b/src/backend/link.rs @@ -1,11 +1,11 @@ -use crate::backend::{Addr, elf}; +use crate::backend::elf; -pub struct LinkedProgram { +pub struct LinkedProgram { pub code: Vec, pub entry: Option, } -impl LinkedProgram { +impl LinkedProgram { pub fn to_elf(&self) -> Vec { elf::create(&self.code, self.entry.expect("no start")) }