get native dev backend working

This commit is contained in:
Brendan Hansknecht 2024-07-21 20:07:52 -07:00
parent b8fb83af86
commit 5ad85bcd08
No known key found for this signature in database
GPG key ID: 0EA784685083E75B
2 changed files with 92 additions and 36 deletions

View file

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

View file

@ -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,