diff --git a/src/arch/x86_64/encode.rs b/src/arch/x86_64/encode.rs index a213662..a80d4e3 100644 --- a/src/arch/x86_64/encode.rs +++ b/src/arch/x86_64/encode.rs @@ -7,7 +7,7 @@ pub struct Encoder { pub missing: Vec<(usize, Symbol)>, } -pub fn encode_program(p: &Program) -> Result, CompilerMsg> { +pub fn compile(p: &Program) -> Result, CompilerMsg> { let mut encoder = Encoder::new(p.sym_count()); p.encode_data(&mut encoder.data, &mut encoder.sym_tab); @@ -24,7 +24,7 @@ pub fn encode_program(p: &Program) -> Result, Compile let addr = encoder .sym_tab .get(sym) - .ok_or(CompilerMsg::from(format!("unknown symbol {sym:?}")))?; + .ok_or(CompilerMsg::from(format!("missing symbol {sym:?}")))?; encoder.data[pos..pos + 4].copy_from_slice(&addr_offset(pos, addr)) } @@ -37,12 +37,12 @@ pub fn encode_program(p: &Program) -> Result, Compile type BInstr = crate::backend::Instr; fn compile_instr(encoder: &mut Encoder, instr: &BInstr) -> Result<(), CompilerMsg> { match instr { - BInstr::Copy { dst, src } => todo!(), BInstr::Asm(asm) => { for i in &asm.instrs { encoder.asm(*i)?; } } + _ => todo!(), } Ok(()) } @@ -95,13 +95,7 @@ impl Encoder { 0x8d, 0x05 | (dst.base() << 3), ]); - let Some(addr) = self.sym_tab.get(sym) else { - let pos = self.data.len(); - self.data.extend([0; 4]); - self.missing.push((pos, sym)); - return; - }; - self.data.extend(addr_offset(self.data.len(), addr)); + self.sym_offset4(sym); } pub fn int(&mut self, code: u8) { @@ -112,6 +106,17 @@ impl Encoder { self.data.extend([0x0f, 0x05]) } + /// inserts a 32 bit offset from a symbol + pub fn sym_offset4(&mut self, sym: Symbol) { + let Some(addr) = self.sym_tab.get(sym) else { + let pos = self.data.len(); + self.data.extend([0; 4]); + self.missing.push((pos, sym)); + return; + }; + self.data.extend(addr_offset(self.data.len(), addr)); + } + pub fn asm(&mut self, instr: Instr) -> Result<(), CompilerMsg> { match instr { Instr::Mov { dst, src } => self.mov(dst, src)?, diff --git a/src/arch/x86_64/mod.rs b/src/arch/x86_64/mod.rs index 60f8d14..9364860 100644 --- a/src/arch/x86_64/mod.rs +++ b/src/arch/x86_64/mod.rs @@ -21,6 +21,6 @@ impl Arch for X86_64 { type Asm = Asm; type Addr = u64; fn compile(p: &Program) -> Result, CompilerMsg> { - encode_program(p) + compile(p) } } diff --git a/src/backend/ir/mod.rs b/src/backend/ir/mod.rs index 36e534b..cc2b2ce 100644 --- a/src/backend/ir/mod.rs +++ b/src/backend/ir/mod.rs @@ -24,7 +24,10 @@ pub struct Func { } pub enum Instr { + Set { dst: VarId, src: Vec }, + Call { dst: FnId, args: Vec }, Copy { dst: VarId, src: VarId }, + Free(VarId), Asm(A::Asm), }