mirror of
https://github.com/roc-lang/roc.git
synced 2025-09-13 23:36:29 +00:00
Merge branch 'trunk' of github.com:rtfeldman/roc into crates-folder
This commit is contained in:
commit
b74fc3554b
35 changed files with 359 additions and 1204 deletions
|
@ -5,7 +5,7 @@ use roc_error_macros::internal_error;
|
|||
use roc_module::low_level::LowLevel;
|
||||
use roc_module::symbol::Symbol;
|
||||
use roc_mono::code_gen_help::HelperOp;
|
||||
use roc_mono::ir::{HigherOrderLowLevel, ListLiteralElement, PassedFunction, ProcLayout};
|
||||
use roc_mono::ir::{HigherOrderLowLevel, PassedFunction, ProcLayout};
|
||||
use roc_mono::layout::{Builtin, FieldOrderHash, Layout, UnionLayout};
|
||||
use roc_mono::low_level::HigherOrder;
|
||||
|
||||
|
@ -290,7 +290,7 @@ impl<'a> LowLevelCall<'a> {
|
|||
|
||||
ListMap | ListMap2 | ListMap3 | ListMap4 | ListMapWithIndex | ListKeepIf | ListWalk
|
||||
| ListWalkUntil | ListWalkBackwards | ListKeepOks | ListKeepErrs | ListSortWith
|
||||
| ListAny | ListAll | ListFindUnsafe | DictWalk => {
|
||||
| ListFindUnsafe | DictWalk => {
|
||||
internal_error!("HigherOrder lowlevels should not be handled here")
|
||||
}
|
||||
|
||||
|
@ -419,12 +419,6 @@ impl<'a> LowLevelCall<'a> {
|
|||
// There is an in-place version of this but we don't use it for dev backends. No morphic_lib analysis.
|
||||
backend.call_host_fn_after_loading_args(bitcode::LIST_REPLACE, 8, false);
|
||||
}
|
||||
ListSingle => {
|
||||
let elem = self.arguments[0];
|
||||
let elem_layout = &backend.storage.symbol_layouts[&elem].clone();
|
||||
let elems = backend.env.arena.alloc([ListLiteralElement::Symbol(elem)]);
|
||||
backend.expr_array(self.ret_symbol, &self.ret_storage, elem_layout, elems)
|
||||
}
|
||||
ListWithCapacity => {
|
||||
// List.withCapacity : Nat -> List elem
|
||||
|
||||
|
@ -446,72 +440,6 @@ impl<'a> LowLevelCall<'a> {
|
|||
|
||||
backend.call_host_fn_after_loading_args(bitcode::LIST_WITH_CAPACITY, 4, false);
|
||||
}
|
||||
ListRepeat => {
|
||||
// List.repeat : elem, Nat -> List elem
|
||||
|
||||
let element: Symbol = self.arguments[0];
|
||||
let count: Symbol = self.arguments[1];
|
||||
let elem_layout = unwrap_list_elem_layout(self.ret_layout);
|
||||
let (elem_width, elem_align) = elem_layout.stack_size_and_alignment(TARGET_INFO);
|
||||
|
||||
let (elem_local, elem_offset, elem_in_memory_layout) =
|
||||
ensure_symbol_is_in_memory(backend, element, *elem_layout, backend.env.arena);
|
||||
|
||||
let inc_fn = backend.get_refcount_fn_index(elem_in_memory_layout, HelperOp::Inc);
|
||||
let inc_fn_ptr = backend.get_fn_ptr(inc_fn);
|
||||
|
||||
// Zig arguments Wasm types
|
||||
// (return pointer) i32
|
||||
// count: usize i32
|
||||
// alignment: u32 i32
|
||||
// element: Opaque i32
|
||||
// element_width: usize i32
|
||||
// inc_n_element: IncN i32
|
||||
|
||||
backend
|
||||
.storage
|
||||
.load_symbols(&mut backend.code_builder, &[self.ret_symbol, count]);
|
||||
backend.code_builder.i32_const(elem_align as i32);
|
||||
|
||||
backend.code_builder.get_local(elem_local);
|
||||
if elem_offset > 0 {
|
||||
backend.code_builder.i32_const(elem_offset as i32);
|
||||
backend.code_builder.i32_add();
|
||||
}
|
||||
|
||||
backend.code_builder.i32_const(elem_width as i32);
|
||||
backend.code_builder.i32_const(inc_fn_ptr);
|
||||
|
||||
backend.call_host_fn_after_loading_args(bitcode::LIST_REPEAT, 6, false);
|
||||
}
|
||||
ListReverse => {
|
||||
// List.reverse : List elem -> List elem
|
||||
// Zig arguments Wasm types
|
||||
// (return pointer) i32
|
||||
// list: RocList i64, i32
|
||||
// alignment: u32 i32
|
||||
// element_width: usize i32
|
||||
// update_mode: UpdateMode i32
|
||||
|
||||
// Load the arguments that have symbols
|
||||
backend.storage.load_symbols_for_call(
|
||||
backend.env.arena,
|
||||
&mut backend.code_builder,
|
||||
self.arguments,
|
||||
self.ret_symbol,
|
||||
&WasmLayout::new(&self.ret_layout),
|
||||
CallConv::Zig,
|
||||
);
|
||||
|
||||
// Load monomorphization constants
|
||||
let elem_layout = unwrap_list_elem_layout(self.ret_layout);
|
||||
let (elem_width, elem_align) = elem_layout.stack_size_and_alignment(TARGET_INFO);
|
||||
backend.code_builder.i32_const(elem_align as i32);
|
||||
backend.code_builder.i32_const(elem_width as i32);
|
||||
backend.code_builder.i32_const(UPDATE_MODE_IMMUTABLE);
|
||||
|
||||
backend.call_host_fn_after_loading_args(bitcode::LIST_REVERSE, 6, false);
|
||||
}
|
||||
ListConcat => {
|
||||
// List.concat : List elem, List elem -> List elem
|
||||
// Zig arguments Wasm types
|
||||
|
@ -539,7 +467,6 @@ impl<'a> LowLevelCall<'a> {
|
|||
|
||||
backend.call_host_fn_after_loading_args(bitcode::LIST_CONCAT, 7, false);
|
||||
}
|
||||
ListContains => todo!("{:?}", self.lowlevel),
|
||||
ListAppend => {
|
||||
// List.append : List elem, elem -> List elem
|
||||
|
||||
|
@ -583,33 +510,6 @@ impl<'a> LowLevelCall<'a> {
|
|||
backend.call_host_fn_after_loading_args(bitcode::LIST_APPEND, 7, false);
|
||||
}
|
||||
ListPrepend => todo!("{:?}", self.lowlevel),
|
||||
ListJoin => {
|
||||
// List.join : List (List elem) -> List elem
|
||||
// Zig arguments Wasm types
|
||||
// (return pointer) i32
|
||||
// list_of_lists: RocList i64, i32
|
||||
// alignment: u32 i32
|
||||
// element_width: usize i32
|
||||
|
||||
// Load the arguments that have symbols
|
||||
backend.storage.load_symbols_for_call(
|
||||
backend.env.arena,
|
||||
&mut backend.code_builder,
|
||||
self.arguments,
|
||||
self.ret_symbol,
|
||||
&WasmLayout::new(&self.ret_layout),
|
||||
CallConv::Zig,
|
||||
);
|
||||
|
||||
// Load monomorphization constants
|
||||
let elem_layout = unwrap_list_elem_layout(self.ret_layout);
|
||||
let (elem_width, elem_align) = elem_layout.stack_size_and_alignment(TARGET_INFO);
|
||||
backend.code_builder.i32_const(elem_align as i32);
|
||||
backend.code_builder.i32_const(elem_width as i32);
|
||||
|
||||
backend.call_host_fn_after_loading_args(bitcode::LIST_JOIN, 5, false);
|
||||
}
|
||||
ListRange => todo!("{:?}", self.lowlevel),
|
||||
ListSublist => {
|
||||
// As a low-level, record is destructured
|
||||
// List.sublist : List elem, start : Nat, len : Nat -> List elem
|
||||
|
|
|
@ -134,7 +134,9 @@ impl<'a> Storage<'a> {
|
|||
}
|
||||
|
||||
fn allocate_stack_memory(&mut self, size: u32, alignment_bytes: u32) -> u32 {
|
||||
if self.stack_frame_pointer.is_none() && size > 0 {
|
||||
// Note: We need a stack frame pointer even if size is zero.
|
||||
// e.g. when passing an empty record to a Zig builtin, we pass the frame pointer
|
||||
if self.stack_frame_pointer.is_none() {
|
||||
let next_local_id = self.get_next_local_id();
|
||||
self.stack_frame_pointer = Some(next_local_id);
|
||||
self.local_types.push(PTR_TYPE);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue