Define basics of x86_64 calling conventions

This commit is contained in:
Brendan Hansknecht 2020-11-16 23:37:02 -08:00
parent 44ef41f9bb
commit 35fd54b8fd
2 changed files with 73 additions and 40 deletions

View file

@ -46,7 +46,7 @@ pub fn build_module<'a>(
trait Backend<'a> { trait Backend<'a> {
/// new creates a new backend that will output to the specific Object. /// new creates a new backend that will output to the specific Object.
fn new(env: &'a Env) -> Self; fn new(env: &'a Env, target: &Triple) -> Self;
fn env(&self) -> &'a Env<'a>; fn env(&self) -> &'a Env<'a>;

View file

@ -1,9 +1,10 @@
use crate::{Backend, Env}; use crate::{Backend, Env};
use bumpalo::collections::Vec; use bumpalo::collections::Vec;
use roc_collections::all::MutMap; use roc_collections::all::{ImSet, MutMap};
use roc_module::symbol::Symbol; use roc_module::symbol::Symbol;
use roc_mono::ir::Literal; use roc_mono::ir::Literal;
use roc_mono::layout::Layout; use roc_mono::layout::Layout;
use target_lexicon::{CallingConvention, Triple};
mod asm; mod asm;
use asm::Register; use asm::Register;
@ -32,15 +33,16 @@ pub struct X86_64Backend<'a> {
// Probably need to encode stack parameter knowledge here too. // Probably need to encode stack parameter knowledge here too.
// return parameter register. This includes dealing with multiple value returns. // return parameter register. This includes dealing with multiple value returns.
gp_param_regs: &'static [Register], gp_param_regs: &'static [Register],
caller_saved_regs: &'static [Register], caller_saved_regs: ImSet<Register>,
callee_saved_regs: &'static [Register], callee_saved_regs: ImSet<Register>,
shadow_space_size: u8, shadow_space_size: u8,
red_zone_size: u8, red_zone_size: u8,
} }
impl<'a> Backend<'a> for X86_64Backend<'a> { impl<'a> Backend<'a> for X86_64Backend<'a> {
fn new(env: &'a Env) -> Self { fn new(env: &'a Env, target: &Triple) -> Self {
X86_64Backend { match target.default_calling_convention() {
Ok(CallingConvention::SystemV) => X86_64Backend {
env, env,
leaf_proc: true, leaf_proc: true,
buf: bumpalo::vec!(in env.arena), buf: bumpalo::vec!(in env.arena),
@ -53,7 +55,7 @@ impl<'a> Backend<'a> for X86_64Backend<'a> {
Register::R8, Register::R8,
Register::R9, Register::R9,
], ],
caller_saved_regs: &[ caller_saved_regs: im_rc::hashset![
Register::RAX, Register::RAX,
Register::RCX, Register::RCX,
Register::RDX, Register::RDX,
@ -65,7 +67,7 @@ impl<'a> Backend<'a> for X86_64Backend<'a> {
Register::R10, Register::R10,
Register::R11, Register::R11,
], ],
callee_saved_regs: &[ callee_saved_regs: im_rc::hashset![
Register::RBX, Register::RBX,
Register::RBP, Register::RBP,
Register::R12, Register::R12,
@ -75,6 +77,37 @@ impl<'a> Backend<'a> for X86_64Backend<'a> {
], ],
shadow_space_size: 0, shadow_space_size: 0,
red_zone_size: 128, red_zone_size: 128,
},
Ok(CallingConvention::WindowsFastcall) => X86_64Backend {
env,
leaf_proc: true,
buf: bumpalo::vec!(in env.arena),
symbols_map: MutMap::default(),
gp_param_regs: &[Register::RCX, Register::RDX, Register::R8, Register::R9],
caller_saved_regs: im_rc::hashset![
Register::RAX,
Register::RCX,
Register::RDX,
Register::R8,
Register::R9,
Register::R10,
Register::R11,
],
callee_saved_regs: im_rc::hashset![
Register::RBX,
Register::RBP,
Register::RSI,
Register::RSP,
Register::RDI,
Register::R12,
Register::R13,
Register::R14,
Register::R15,
],
shadow_space_size: 32,
red_zone_size: 0,
},
x => panic!("unsupported backend: {:?}", x),
} }
} }