wasm: Create ProcLookupData structure to help with callconv wrapper

This commit is contained in:
Brian Carroll 2022-03-23 23:19:33 +00:00
parent 448140d223
commit 973d6dc41f
2 changed files with 70 additions and 16 deletions

View file

@ -18,7 +18,7 @@ use roc_mono::ir::{Proc, ProcLayout};
use roc_mono::layout::LayoutIds;
use roc_target::TargetInfo;
use crate::backend::WasmBackend;
use crate::backend::{ProcLookupData, ProcSource, WasmBackend};
use crate::wasm_module::{
Align, CodeBuilder, Export, ExportType, LocalId, SymInfo, ValueType, WasmModule,
};
@ -107,7 +107,12 @@ pub fn build_module_without_wrapper<'a>(
let linker_sym_index = linker_symbols.len() as u32;
// linker_sym_index is redundant for these procs from user code, but needed for generated helpers!
proc_lookup.push((sym, proc_layout, linker_sym_index));
proc_lookup.push(ProcLookupData {
name: sym,
layout: proc_layout,
linker_index: linker_sym_index,
source: ProcSource::Roc,
});
linker_symbols.push(linker_sym);
fn_index += 1;
@ -144,7 +149,7 @@ pub fn build_module_without_wrapper<'a>(
}
// Generate specialized helpers for refcounting & equality
let helper_procs = backend.generate_helpers();
let helper_procs = backend.get_helpers();
backend.register_symbol_debug_names();
@ -156,9 +161,28 @@ pub fn build_module_without_wrapper<'a>(
}
}
// Generate Wasm for refcounting procs
for proc in helper_procs.iter() {
backend.build_proc(proc);
// Generate Wasm for helpers and Zig/Roc wrappers
let sources = Vec::from_iter_in(
backend
.proc_lookup
.iter()
.map(|ProcLookupData { source, .. }| *source),
env.arena,
);
let mut helper_iter = helper_procs.iter();
for source in sources {
use ProcSource::*;
match source {
Roc => { /* already generated */ }
Helper => {
if let Some(proc) = helper_iter.next() {
backend.build_proc(proc);
}
}
ZigCallConvWrapper => {
todo!("Generate Wasm wrapper to convert from Zig CC to CCC");
}
}
}
let (module, called_preload_fns) = backend.finalize();