mirror of
https://github.com/roc-lang/roc.git
synced 2025-09-27 13:59:08 +00:00
get native dev backend working
This commit is contained in:
parent
b8fb83af86
commit
5ad85bcd08
2 changed files with 92 additions and 36 deletions
|
@ -2318,6 +2318,22 @@ impl<
|
|||
refcount_proc_name
|
||||
}
|
||||
|
||||
fn build_indirect_copy(&mut self, layout: InLayout<'a>) -> Symbol {
|
||||
let ident_ids = self
|
||||
.interns
|
||||
.all_ident_ids
|
||||
.get_mut(&self.env.module_id)
|
||||
.unwrap();
|
||||
|
||||
let (refcount_proc_name, linker_data) =
|
||||
self.helper_proc_gen
|
||||
.gen_copy_proc(ident_ids, self.layout_interner, layout);
|
||||
|
||||
self.helper_proc_symbols_mut().extend(linker_data);
|
||||
|
||||
refcount_proc_name
|
||||
}
|
||||
|
||||
fn build_higher_order_lowlevel(
|
||||
&mut self,
|
||||
dst: &Symbol,
|
||||
|
@ -2413,8 +2429,9 @@ impl<
|
|||
// Load element_refcounted argument (bool).
|
||||
self.load_layout_refcounted(element_layout, Symbol::DEV_TMP3);
|
||||
|
||||
let inc_elem_fn = self.increment_fn_pointer(element_layout);
|
||||
let dec_elem_fn = self.decrement_fn_pointer(element_layout);
|
||||
let inc_fn_ptr = self.increment_fn_pointer(element_layout);
|
||||
let dec_fn_ptr = self.decrement_fn_pointer(element_layout);
|
||||
let copy_fn_ptr = self.copy_fn_pointer(element_layout);
|
||||
|
||||
// input: RocList,
|
||||
// caller: CompareFn,
|
||||
|
@ -2426,6 +2443,7 @@ impl<
|
|||
// element_refcounted: bool,
|
||||
// inc: Inc,
|
||||
// dec: Dec,
|
||||
// copy: CopyFn,
|
||||
|
||||
let arguments = [
|
||||
xs,
|
||||
|
@ -2436,8 +2454,9 @@ impl<
|
|||
alignment,
|
||||
element_width,
|
||||
Symbol::DEV_TMP3,
|
||||
inc_elem_fn,
|
||||
dec_elem_fn,
|
||||
inc_fn_ptr,
|
||||
dec_fn_ptr,
|
||||
copy_fn_ptr,
|
||||
];
|
||||
|
||||
let layouts = [
|
||||
|
@ -2451,6 +2470,7 @@ impl<
|
|||
Layout::BOOL,
|
||||
usize_,
|
||||
usize_,
|
||||
usize_,
|
||||
];
|
||||
|
||||
self.build_fn_call_stack_return(
|
||||
|
@ -2493,8 +2513,8 @@ impl<
|
|||
// Load element_refcounted argument (bool).
|
||||
self.load_layout_refcounted(elem_layout, Symbol::DEV_TMP3);
|
||||
|
||||
let inc_elem_fn = self.increment_fn_pointer(elem_layout);
|
||||
let dec_elem_fn = self.decrement_fn_pointer(elem_layout);
|
||||
let inc_fn_ptr = self.increment_fn_pointer(elem_layout);
|
||||
let dec_fn_ptr = self.decrement_fn_pointer(elem_layout);
|
||||
|
||||
// Setup the return location.
|
||||
let base_offset =
|
||||
|
@ -2510,9 +2530,9 @@ impl<
|
|||
// element_refcounted
|
||||
Symbol::DEV_TMP3,
|
||||
// inc
|
||||
inc_elem_fn,
|
||||
inc_fn_ptr,
|
||||
// dec
|
||||
dec_elem_fn,
|
||||
dec_fn_ptr,
|
||||
];
|
||||
let usize_layout = Layout::U64;
|
||||
let lowlevel_arg_layouts = [
|
||||
|
@ -2564,7 +2584,7 @@ impl<
|
|||
// Load element_refcounted argument (bool).
|
||||
self.load_layout_refcounted(elem_layout, Symbol::DEV_TMP3);
|
||||
|
||||
let inc_elem_fn = self.increment_fn_pointer(elem_layout);
|
||||
let inc_fn_ptr = self.increment_fn_pointer(elem_layout);
|
||||
|
||||
// Setup the return location.
|
||||
let base_offset =
|
||||
|
@ -2580,7 +2600,7 @@ impl<
|
|||
// element_refcounted
|
||||
Symbol::DEV_TMP3,
|
||||
// Inc element fn
|
||||
inc_elem_fn,
|
||||
inc_fn_ptr,
|
||||
];
|
||||
let layout_usize = Layout::U64;
|
||||
let lowlevel_arg_layouts = [
|
||||
|
@ -2637,7 +2657,7 @@ impl<
|
|||
self.load_layout_stack_size(element_layout, Symbol::DEV_TMP2);
|
||||
self.load_layout_refcounted(element_layout, Symbol::DEV_TMP3);
|
||||
|
||||
let inc_elem_fn = self.increment_fn_pointer(element_layout);
|
||||
let inc_fn_ptr = self.increment_fn_pointer(element_layout);
|
||||
|
||||
// Load UpdateMode.Immutable argument (0u8)
|
||||
let u8_layout = Layout::U8;
|
||||
|
@ -2664,7 +2684,7 @@ impl<
|
|||
// element_refcounted
|
||||
Symbol::DEV_TMP3,
|
||||
// Inc element fn
|
||||
inc_elem_fn,
|
||||
inc_fn_ptr,
|
||||
// update_mode
|
||||
Symbol::DEV_TMP4,
|
||||
];
|
||||
|
@ -2733,6 +2753,7 @@ impl<
|
|||
let base_offset =
|
||||
self.storage_manager
|
||||
.claim_stack_area_layout(self.layout_interner, *dst, *ret_layout);
|
||||
let copy_fn_ptr = self.copy_fn_pointer(elem_layout);
|
||||
|
||||
let lowlevel_args = [
|
||||
list,
|
||||
|
@ -2740,8 +2761,11 @@ impl<
|
|||
Symbol::DEV_TMP,
|
||||
// element_width
|
||||
Symbol::DEV_TMP2,
|
||||
// copy
|
||||
copy_fn_ptr,
|
||||
];
|
||||
let lowlevel_arg_layouts = [list_layout, Layout::U64, Layout::U64];
|
||||
let usize_layout = Layout::U64;
|
||||
let lowlevel_arg_layouts = [list_layout, Layout::U64, Layout::U64, usize_layout];
|
||||
|
||||
self.build_fn_call(
|
||||
&Symbol::DEV_TMP3,
|
||||
|
@ -2844,8 +2868,9 @@ impl<
|
|||
// Load element_refcounted argument (bool).
|
||||
self.load_layout_refcounted(elem_layout, Symbol::DEV_TMP4);
|
||||
|
||||
let inc_elem_fn = self.increment_fn_pointer(elem_layout);
|
||||
let dec_elem_fn = self.decrement_fn_pointer(elem_layout);
|
||||
let inc_fn_ptr = self.increment_fn_pointer(elem_layout);
|
||||
let dec_fn_ptr = self.decrement_fn_pointer(elem_layout);
|
||||
let copy_fn_ptr = self.copy_fn_pointer(elem_layout);
|
||||
|
||||
// Setup the return location.
|
||||
let base_offset =
|
||||
|
@ -2891,9 +2916,10 @@ impl<
|
|||
Symbol::DEV_TMP2,
|
||||
Symbol::DEV_TMP3,
|
||||
Symbol::DEV_TMP4,
|
||||
inc_elem_fn,
|
||||
dec_elem_fn,
|
||||
inc_fn_ptr,
|
||||
dec_fn_ptr,
|
||||
Symbol::DEV_TMP5,
|
||||
copy_fn_ptr,
|
||||
];
|
||||
let lowlevel_arg_layouts = [
|
||||
list_layout,
|
||||
|
@ -2905,6 +2931,7 @@ impl<
|
|||
u64_layout,
|
||||
u64_layout,
|
||||
u64_layout,
|
||||
u64_layout,
|
||||
];
|
||||
|
||||
let out = self.debug_symbol("out");
|
||||
|
@ -2955,8 +2982,8 @@ impl<
|
|||
// Load element_refcounted argument (bool).
|
||||
self.load_layout_refcounted(elem_layout, Symbol::DEV_TMP3);
|
||||
|
||||
let inc_elem_fn = self.increment_fn_pointer(elem_layout);
|
||||
let dec_elem_fn = self.decrement_fn_pointer(elem_layout);
|
||||
let inc_fn_ptr = self.increment_fn_pointer(elem_layout);
|
||||
let dec_fn_ptr = self.decrement_fn_pointer(elem_layout);
|
||||
|
||||
// Setup the return location.
|
||||
let base_offset =
|
||||
|
@ -2973,8 +3000,8 @@ impl<
|
|||
Symbol::DEV_TMP2,
|
||||
// element_refcounted
|
||||
Symbol::DEV_TMP3,
|
||||
inc_elem_fn,
|
||||
dec_elem_fn,
|
||||
inc_fn_ptr,
|
||||
dec_fn_ptr,
|
||||
];
|
||||
let lowlevel_arg_layouts = [
|
||||
list_a_layout,
|
||||
|
@ -3042,7 +3069,8 @@ impl<
|
|||
// Load element_refcounted argument (bool).
|
||||
self.load_layout_refcounted(elem_layout, Symbol::DEV_TMP4);
|
||||
|
||||
let inc_elem_fn = self.increment_fn_pointer(elem_layout);
|
||||
let inc_fn_ptr = self.increment_fn_pointer(elem_layout);
|
||||
let copy_fn_ptr = self.copy_fn_pointer(elem_layout);
|
||||
|
||||
// Setup the return location.
|
||||
let base_offset =
|
||||
|
@ -3060,7 +3088,9 @@ impl<
|
|||
// element_refcounted
|
||||
Symbol::DEV_TMP4,
|
||||
// inc
|
||||
inc_elem_fn,
|
||||
inc_fn_ptr,
|
||||
// copy
|
||||
copy_fn_ptr,
|
||||
];
|
||||
let usize_layout = Layout::U64;
|
||||
let lowlevel_arg_layouts = [
|
||||
|
@ -3070,6 +3100,7 @@ impl<
|
|||
Layout::U64,
|
||||
Layout::BOOL,
|
||||
usize_layout,
|
||||
usize_layout,
|
||||
];
|
||||
|
||||
self.build_fn_call(
|
||||
|
|
|
@ -485,6 +485,26 @@ trait Backend<'a> {
|
|||
element_decrement
|
||||
}
|
||||
|
||||
fn copy_fn_pointer(&mut self, layout: InLayout<'a>) -> Symbol {
|
||||
let box_layout = self
|
||||
.interner_mut()
|
||||
.insert_direct_no_semantic(LayoutRepr::Ptr(layout));
|
||||
|
||||
let element_copy = self.debug_symbol("element_copy");
|
||||
let element_copy_symbol = self.build_indirect_copy(layout);
|
||||
|
||||
let element_copy_string = self.lambda_name_to_string(
|
||||
LambdaName::no_niche(element_copy_symbol),
|
||||
[box_layout, box_layout].into_iter(),
|
||||
None,
|
||||
Layout::UNIT,
|
||||
);
|
||||
|
||||
self.build_fn_pointer(&element_copy, element_copy_string);
|
||||
|
||||
element_copy
|
||||
}
|
||||
|
||||
fn helper_proc_gen_mut(&mut self) -> &mut CodeGenHelp<'a>;
|
||||
|
||||
fn helper_proc_symbols_mut(&mut self) -> &mut Vec<'a, (Symbol, ProcLayout<'a>)>;
|
||||
|
@ -1955,8 +1975,9 @@ trait Backend<'a> {
|
|||
let update_mode = self.debug_symbol("update_mode");
|
||||
self.load_literal_i8(&update_mode, UpdateMode::Immutable as i8);
|
||||
|
||||
let inc_elem_fn = self.increment_fn_pointer(list_argument.element_layout);
|
||||
let dec_elem_fn = self.decrement_fn_pointer(list_argument.element_layout);
|
||||
let inc_fn_ptr = self.increment_fn_pointer(list_argument.element_layout);
|
||||
let dec_fn_ptr = self.decrement_fn_pointer(list_argument.element_layout);
|
||||
let copy_fn_ptr = self.copy_fn_pointer(list_argument.element_layout);
|
||||
|
||||
let layout_usize = Layout::U64;
|
||||
|
||||
|
@ -1969,6 +1990,7 @@ trait Backend<'a> {
|
|||
// inc: Inc
|
||||
// dec: Dec
|
||||
// update_mode: UpdateMode,
|
||||
// copy: CopyFn
|
||||
|
||||
self.build_fn_call(
|
||||
sym,
|
||||
|
@ -1980,9 +2002,10 @@ trait Backend<'a> {
|
|||
i,
|
||||
j,
|
||||
list_argument.element_refcounted,
|
||||
inc_elem_fn,
|
||||
dec_elem_fn,
|
||||
inc_fn_ptr,
|
||||
dec_fn_ptr,
|
||||
update_mode,
|
||||
copy_fn_ptr,
|
||||
],
|
||||
&[
|
||||
list_layout,
|
||||
|
@ -1994,6 +2017,7 @@ trait Backend<'a> {
|
|||
layout_usize,
|
||||
layout_usize,
|
||||
Layout::U8,
|
||||
layout_usize,
|
||||
],
|
||||
ret_layout,
|
||||
);
|
||||
|
@ -2007,8 +2031,8 @@ trait Backend<'a> {
|
|||
let update_mode = self.debug_symbol("update_mode");
|
||||
self.load_literal_i8(&update_mode, UpdateMode::Immutable as i8);
|
||||
|
||||
let inc_elem_fn = self.increment_fn_pointer(list_argument.element_layout);
|
||||
let dec_elem_fn = self.decrement_fn_pointer(list_argument.element_layout);
|
||||
let inc_fn_ptr = self.increment_fn_pointer(list_argument.element_layout);
|
||||
let dec_fn_ptr = self.decrement_fn_pointer(list_argument.element_layout);
|
||||
|
||||
let layout_usize = Layout::U64;
|
||||
|
||||
|
@ -2016,8 +2040,8 @@ trait Backend<'a> {
|
|||
// alignment: u32,
|
||||
// element_width: usize,
|
||||
// element_refcounted: bool,
|
||||
// inc_elem_fn: Inc,
|
||||
// dec_elem_fn: Dec,
|
||||
// inc_fn_ptr: Inc,
|
||||
// dec_fn_ptr: Dec,
|
||||
// update_mode: UpdateMode,
|
||||
|
||||
self.build_fn_call(
|
||||
|
@ -2028,8 +2052,8 @@ trait Backend<'a> {
|
|||
list_argument.alignment,
|
||||
list_argument.element_width,
|
||||
list_argument.element_refcounted,
|
||||
inc_elem_fn,
|
||||
dec_elem_fn,
|
||||
inc_fn_ptr,
|
||||
dec_fn_ptr,
|
||||
update_mode,
|
||||
],
|
||||
&[
|
||||
|
@ -2082,7 +2106,7 @@ trait Backend<'a> {
|
|||
let list_layout = arg_layouts[0];
|
||||
let list_argument = self.list_argument(list_layout);
|
||||
|
||||
let dec_elem_fn = self.decrement_fn_pointer(list_argument.element_layout);
|
||||
let dec_fn_ptr = self.decrement_fn_pointer(list_argument.element_layout);
|
||||
|
||||
let layout_usize = Layout::U64;
|
||||
|
||||
|
@ -2090,7 +2114,7 @@ trait Backend<'a> {
|
|||
// alignment: u32,
|
||||
// element_width: usize,
|
||||
// element_refcounted: bool,
|
||||
// dec_elem_fn: Dec,
|
||||
// dec_fn_ptr: Dec,
|
||||
|
||||
self.build_fn_call(
|
||||
sym,
|
||||
|
@ -2100,7 +2124,7 @@ trait Backend<'a> {
|
|||
list_argument.alignment,
|
||||
list_argument.element_width,
|
||||
list_argument.element_refcounted,
|
||||
dec_elem_fn,
|
||||
dec_fn_ptr,
|
||||
],
|
||||
&[
|
||||
list_layout,
|
||||
|
@ -2582,6 +2606,7 @@ trait Backend<'a> {
|
|||
fn build_indirect_inc(&mut self, layout: InLayout<'a>) -> Symbol;
|
||||
fn build_indirect_inc_n(&mut self, layout: InLayout<'a>) -> Symbol;
|
||||
fn build_indirect_dec(&mut self, layout: InLayout<'a>) -> Symbol;
|
||||
fn build_indirect_copy(&mut self, layout: InLayout<'a>) -> Symbol;
|
||||
|
||||
fn build_list_clone(
|
||||
&mut self,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue