use crate::{
compiler::state::State,
immediate,
x86::{self, Ins, Register::RAX, ASM},
};
pub fn eval(s: &State, data: &str) -> ASM {
let index = s
.symbols
.get(data)
.unwrap_or_else(|| panic!("Symbol `{}` not found in symbol table", data));
x86::lea(RAX, &label(*index), immediate::SYM).into()
}
pub fn inline(s: &State) -> ASM {
let mut asm = ASM(vec![]);
for (symbol, index) in &s.symbols {
asm += Ins::from("");
asm += Ins::from(".p2align 3");
asm += x86::label(&label(*index));
asm += Ins(format!(".quad {}", index));
asm += Ins(format!(".quad {}", symbol.len()));
asm += Ins(format!(".asciz \"{}\"", symbol))
}
asm
}
fn label(index: usize) -> String {
format!("inc_sym_{}", index)
}