Sketch of prologue generation

This commit is contained in:
Tyler McMullen
2017-11-28 17:25:39 -08:00
committed by Jakob Stoklund Olesen
parent fdfe24760a
commit 60b6bc3ab7

View File

@@ -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(())
}
}