mirror of
https://github.com/roc-lang/roc.git
synced 2025-10-02 08:11:12 +00:00
Add base structure for dev compiler backend
Currently we only generate a single static function, but it is probably loaded and run with jit. This is the base to start generating proper code.
This commit is contained in:
parent
2204ee82d5
commit
86c3c0a409
10 changed files with 1341 additions and 20 deletions
31
compiler/gen_dev/src/run_roc.rs
Normal file
31
compiler/gen_dev/src/run_roc.rs
Normal file
|
@ -0,0 +1,31 @@
|
|||
#[macro_export]
|
||||
/// run_jit_function_raw runs an unwrapped jit function.
|
||||
/// The function could throw an execption and break things, or worse, it could not throw and exception and break things.
|
||||
/// This functions is generally a bad idea with an untrused backend, but is being used for now for development purposes.
|
||||
macro_rules! run_jit_function_raw {
|
||||
($lib: expr, $main_fn_name: expr, $ty:ty, $transform:expr) => {{
|
||||
let v: std::vec::Vec<roc_problem::can::Problem> = std::vec::Vec::new();
|
||||
run_jit_function_raw!($lib, $main_fn_name, $ty, $transform, v)
|
||||
}};
|
||||
|
||||
($lib: expr, $main_fn_name: expr, $ty:ty, $transform:expr, $errors:expr) => {{
|
||||
unsafe {
|
||||
let main: libloading::Symbol<unsafe extern "C" fn() -> $ty> = $lib
|
||||
.get($main_fn_name.as_bytes())
|
||||
.ok()
|
||||
.ok_or(format!("Unable to JIT compile `{}`", $main_fn_name))
|
||||
.expect("errored");
|
||||
|
||||
let result = main();
|
||||
|
||||
assert_eq!(
|
||||
$errors,
|
||||
std::vec::Vec::new(),
|
||||
"Encountered errors: {:?}",
|
||||
$errors
|
||||
);
|
||||
|
||||
$transform(result)
|
||||
}
|
||||
}};
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue