λ Support functions! #5
@@ -1,12 +1,10 @@
|
||||
use crate::backend::Backend;
|
||||
use crate::eval::EvalError;
|
||||
use crate::ir::{Expression, Program, TopLevel, Type};
|
||||
use crate::syntax::Location;
|
||||
use crate::ir::{Expression, Program, Type};
|
||||
use cranelift_jit::JITModule;
|
||||
use cranelift_object::ObjectModule;
|
||||
#[cfg(test)]
|
||||
use proptest::arbitrary::Arbitrary;
|
||||
use std::collections::HashMap;
|
||||
use std::path::Path;
|
||||
use target_lexicon::Triple;
|
||||
|
||||
@@ -56,45 +54,11 @@ impl Backend<ObjectModule> {
|
||||
//let allocator = Arena::<()>::new();
|
||||
//program.pretty(&allocator).render(80, &mut std::io::stdout())?;
|
||||
let mut backend = Self::object_file(Triple::host())?;
|
||||
let mut function_map = HashMap::new();
|
||||
let mut main_function_body = vec![];
|
||||
|
||||
for item in program.items {
|
||||
match item {
|
||||
TopLevel::Function(name, args, rettype, body) => {
|
||||
let function_id = backend.compile_function(
|
||||
&mut HashMap::new(),
|
||||
name.as_str(),
|
||||
args.as_slice(),
|
||||
rettype,
|
||||
body,
|
||||
)?;
|
||||
function_map.insert(name, function_id);
|
||||
}
|
||||
|
||||
TopLevel::Statement(stmt) => {
|
||||
main_function_body.push(stmt);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
let main_function_body = Expression::Block(
|
||||
Location::manufactured(),
|
||||
Type::Primitive(crate::eval::PrimitiveType::Void),
|
||||
main_function_body,
|
||||
);
|
||||
|
||||
let my_directory = tempfile::tempdir()?;
|
||||
let object_path = my_directory.path().join("object.o");
|
||||
let executable_path = my_directory.path().join("test_executable");
|
||||
|
||||
backend.compile_function(
|
||||
&mut HashMap::new(),
|
||||
"gogogo",
|
||||
&[],
|
||||
Type::Primitive(crate::eval::PrimitiveType::Void),
|
||||
main_function_body,
|
||||
)?;
|
||||
backend.compile_program("gogogo", program)?;
|
||||
let bytes = backend.bytes()?;
|
||||
std::fs::write(&object_path, bytes)?;
|
||||
Self::link(&object_path, &executable_path)?;
|
||||
|
||||
Reference in New Issue
Block a user