mirror of
https://github.com/roc-lang/roc.git
synced 2025-10-01 07:41:12 +00:00
Define basics of x86_64 calling conventions
This commit is contained in:
parent
44ef41f9bb
commit
35fd54b8fd
2 changed files with 73 additions and 40 deletions
|
@ -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>;
|
||||||
|
|
||||||
|
|
|
@ -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),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue