Skip to main content

lamina_codegen/riscv/
frame.rs

1/// RISC-V stack frame management utilities
2pub struct RiscVFrame;
3
4impl RiscVFrame {
5    /// Generate function prologue
6    pub fn generate_prologue<W: std::io::Write>(
7        writer: &mut W,
8        stack_size: usize,
9    ) -> Result<(), std::io::Error> {
10        // Save return address and frame pointer
11        writeln!(writer, "    addi sp, sp, -16")?;
12        writeln!(writer, "    sd ra, 8(sp)")?;
13        writeln!(writer, "    sd fp, 0(sp)")?;
14        writeln!(writer, "    addi fp, sp, 16")?;
15
16        // Allocate stack space for local variables if needed
17        if stack_size > 0 {
18            writeln!(writer, "    addi sp, sp, -{}", stack_size)?;
19        }
20        Ok(())
21    }
22
23    /// Generate function epilogue
24    pub fn generate_epilogue<W: std::io::Write>(
25        writer: &mut W,
26        stack_size: usize,
27    ) -> Result<(), std::io::Error> {
28        // Deallocate stack space for local variables if needed
29        if stack_size > 0 {
30            writeln!(writer, "    addi sp, sp, {}", stack_size)?;
31        }
32
33        // Restore return address and frame pointer
34        writeln!(writer, "    ld ra, -8(fp)")?;
35        writeln!(writer, "    ld fp, -16(fp)")?;
36        writeln!(writer, "    addi sp, sp, 16")?;
37        writeln!(writer, "    ret")?;
38        Ok(())
39    }
40
41    /// Calculate stack slot offset from frame pointer (fp)
42    pub fn calculate_stack_offset(slot_index: usize) -> i32 {
43        -((slot_index as i32 + 1) * 8)
44    }
45}