use relon_ir::ir::Op;
use crate::error::LlvmError;
use super::*;
impl<'ctx, 'b, 'cp> Emit<'ctx, 'b, 'cp> {
pub(crate) fn lower_schema_rest(
&mut self,
ip: usize,
ip_hint: &str,
op: &Op,
) -> Result<(), LlvmError> {
match op {
Op::LoadSchemaPtr { offset } => self.emit_load_schema_ptr(ip_hint, *offset),
other => Err(LlvmError::Codegen(format!(
"unsupported op (Phase 0b schema seam): {other:?} at ip={ip}"
))),
}
}
fn emit_load_schema_ptr(&mut self, _ip_hint: &str, offset: u32) -> Result<(), LlvmError> {
let arena_base_ptr = self.arena_base_ptr.ok_or_else(|| {
LlvmError::Codegen("Op::LoadSchemaPtr outside buffer-protocol entry shape".into())
})?;
let in_ptr_i32 = self.lookup_param(0)?;
let slot_addr = self.compute_buffer_addr(arena_base_ptr, in_ptr_i32, offset, 4)?;
let name = self.next_name("schemaptr_abs");
let abs = self
.builder
.build_load(self.ctx.i32_type(), slot_addr, &name)
.map_err(|e| LlvmError::Codegen(format!("LoadSchemaPtr slot load: {e}")))?
.into_int_value();
self.push(abs, IrType::I32);
Ok(())
}
}