(user_src: &str)
| 177 | let mut rv = CompilerRv64::new(); |
| 178 | let (_, tokens) = rv.compile_with_tokens(&out.ir); |
| 179 | let obj = Assembler::assemble(&tokens) |
| 180 | .unwrap_or_else(|e| panic!("stdlib `{name}` assemble failed: {e}")); |
| 181 | ((*name).to_owned(), obj) |
| 182 | }) |
| 183 | .collect() |
| 184 | }) |
| 185 | } |
| 186 | |
| 187 | fn run_kernel_hll(user_src: &str) -> (String, Option<i64>) { |
| 188 | let stdlib_objs = compiled_stdlib(); |
| 189 | let (source_prelude, module_aliases) = direct_imports(user_src); |
| 190 | |
| 191 | let user_compiler = HllCompiler::new(CompileConfig { |
| 192 | target: TargetMode::Kernel, |
| 193 | strict: true, |
| 194 | string_prefix: None, |
| 195 | type_prelude: Vec::new(), |
| 196 | source_prelude: Some(source_prelude), |
| 197 | module_aliases, |
| 198 | module_mangle_prefix: None, |
| 199 | source_file: Some("user.hll".to_owned()), |
| 200 | }); |
| 201 | let user_out = user_compiler |
| 202 | .compile(user_src) |
| 203 | .unwrap_or_else(|diags| panic!("user compile failed: {diags:?}")); |
| 204 | let mut user_rv = CompilerRv64::new(); |
| 205 | let (_, user_tokens) = user_rv.compile_with_tokens(&user_out.ir); |
| 206 | |
| 207 | let mut user_obj = |
| 208 | Assembler::assemble(&user_tokens).unwrap_or_else(|e| panic!("user assemble failed: {e}")); |
| 209 | for export in kernel_snippet_abi_exports() { |
| 210 | user_obj.mark_entry_global(&export); |
| 211 | } |
| 212 | let mut modules: Vec<(&str, &AssembledOutput)> = |
| 213 | stdlib_objs.iter().map(|(n, o)| (n.as_str(), o)).collect(); |
| 214 | modules.push(("user", &user_obj)); |
| 215 | let mut assembled = ObjectLinker::link(&modules).unwrap_or_else(|e| panic!("link failed: {e}")); |
| 216 | let layout = LinkLayout::freestanding_kernel(); |
| 217 | if layout.emit_layout_symbols { |
| 218 | assembled.inject_layout_symbols(&layout); |
| 219 | } |
| 220 | |
| 221 | let mut vm = VirtualMachine::new_kernel(&assembled); |
| 222 | let run = vm.run(10_000_000); |
no test coverage detected