Sketch of prologue generation
@@ -10,9 +10,14 @@ use binemit::{CodeSink, MemoryCodeSink, emit_function};
use super::super::settings as shared_settings;
use isa::enc_tables::{self as shared_enc_tables, lookup_enclist, Encodings};
use isa::Builder as IsaBuilder;
-use isa::{TargetIsa, RegInfo, RegClass, EncInfo};
+use isa::{TargetIsa, RegInfo, RegClass, EncInfo, RegUnit};
+use self::registers::RU;
use ir;
use regalloc;
+use result;
+use ir::InstBuilder;
+use legalizer;
+
#[allow(dead_code)]
struct Isa {
@@ -111,4 +116,44 @@ impl TargetIsa for Isa {
fn reloc_names(&self) -> &'static [&'static str] {
&binemit::RELOC_NAMES
}
+
+ fn prologue_epilogue(&self, func: &mut ir::Function) -> result::CtonResult {
+ use stack_layout::layout_stack;
+ use cursor::{Cursor, EncCursor};
+
+ let word_size = if self.flags().is_64bit() { 8 } else { 4 };
+ let stack_size = layout_stack(&mut func.stack_slots, word_size)?;
+
+ // Append frame pointer to function signature
+ let rbp_arg = ir::AbiParam::special_reg(
+ ir::types::I64,
+ ir::ArgumentPurpose::FramePointer,
+ RU::rbp as RegUnit,
+ );
+ func.signature.params.push(rbp_arg);
+
+ // Append param to entry EBB
+ let entry_ebb = func.layout.entry_block().expect("missing entry block");
+ func.dfg.append_ebb_param(entry_ebb, ir::types::I64);
+
+ // Find our frame pointer parameter Value
+ let fp = func.special_param(ir::ArgumentPurpose::FramePointer)
+ .expect("missing frame pointer");
+
+ // Assign it a location
+ func.locations[fp] = ir::ValueLoc::Reg(RU::rbp as RegUnit);
+
+ // Insert prologue
+ let mut pos = EncCursor::new(func, self).at_first_insertion_point(entry_ebb);
+ pos.ins().x86_push(fp);
+ pos.ins().copy_special(
+ RU::rbp as RegUnit,
+ RU::rsp as RegUnit,
+ );
+ pos.ins().adjust_sp_imm(-(stack_size as i32));
+
+ //legalizer::legalize_function(func, &mut func.cfg, self);
+
+ Ok(())
+ }
}
