From a797b43068905640eb88a3b1fd66161a3d7a270c Mon Sep 17 00:00:00 2001 From: Adam Wick Date: Fri, 23 Dec 2022 19:48:50 -0800 Subject: [PATCH] checkpoint --- runtime/rts.c | 2 +- runtime/sample.c | 7 +++++++ src/lib.rs | 1 + src/passes/into_crane.rs | 5 ++--- src/runtime.rs | 42 ++++++++++++++++++++++++++++++++++++++++ 5 files changed, 53 insertions(+), 4 deletions(-) create mode 100644 runtime/sample.c create mode 100644 src/runtime.rs diff --git a/runtime/rts.c b/runtime/rts.c index 51b21a7..4f955e6 100644 --- a/runtime/rts.c +++ b/runtime/rts.c @@ -2,7 +2,7 @@ #include void print(char *variable_name, uint64_t value) { - printf("%s = %lu", variable_name, value); + printf("%s = %llu\n", variable_name, value); } void caller() { diff --git a/runtime/sample.c b/runtime/sample.c new file mode 100644 index 0000000..c45eaa5 --- /dev/null +++ b/runtime/sample.c @@ -0,0 +1,7 @@ +#include + +void print(char *variable_name, uint64_t value); + +void gogogo() { + print("x", 4); +} \ No newline at end of file diff --git a/src/lib.rs b/src/lib.rs index 1bdb953..7a09d0c 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -2,6 +2,7 @@ pub mod asts; pub mod backend; pub mod errors; pub mod passes; +pub mod runtime; pub mod syntax; pub mod util; pub mod variable_map; diff --git a/src/passes/into_crane.rs b/src/passes/into_crane.rs index 4399ba5..a06c6aa 100644 --- a/src/passes/into_crane.rs +++ b/src/passes/into_crane.rs @@ -1,13 +1,12 @@ use crate::asts::lil::{Program, Statement, Primitive, SimpleExpression, Value}; use cranelift_codegen::entity::EntityRef; -use cranelift_codegen::ir::{Function, UserFuncName, UserExternalName, Signature, types, InstBuilder, entities, ExternalName, ExtFuncData, AbiParam}; +use cranelift_codegen::ir::{Function, UserFuncName, Signature, types, InstBuilder, entities}; use cranelift_codegen::isa::CallConv; use cranelift_codegen::{Context}; use cranelift_frontend::{FunctionBuilderContext, FunctionBuilder, Variable}; use cranelift_module::{FuncId, Module, Linkage, ModuleError, ModuleCompiledFunction}; impl Program { - pub fn into_cranelift(&self, module: &mut M, print_func_id: FuncId) -> Result { let basic_signature = Signature { params: vec![], @@ -28,7 +27,7 @@ impl Program { for stmt in self.statements.iter() { match stmt { - Statement::Print(ann, var) => { + Statement::Print(_ann, var) => { let var = builder.use_var(Variable::new(*var)); builder.ins().call(print_func_ref, &[var]); } diff --git a/src/runtime.rs b/src/runtime.rs new file mode 100644 index 0000000..5768969 --- /dev/null +++ b/src/runtime.rs @@ -0,0 +1,42 @@ +use cranelift_codegen::ir::{Signature, AbiParam, types, ArgumentPurpose, ArgumentExtension, Function, FuncRef}; +use cranelift_codegen::isa::CallConv; +use cranelift_module::{Module, ModuleResult, Linkage, FuncId}; +use std::collections::HashMap; +use thiserror::Error; + +pub struct RuntimeFunctions { + builtin_functions: HashMap, + _referenced_functions: Vec, +} + +#[derive(Debug, Error)] +pub enum RuntimeFunctionError { + #[error("Could not find runtime function named '{0}'")] + CannotFindRuntimeFunction(String), +} + +impl RuntimeFunctions { + pub fn new(module: &mut M) -> ModuleResult { + let mut builtin_functions = HashMap::new(); + let _referenced_functions = Vec::new(); + + let string_param = AbiParam::new(types::R64); + let int64_param = AbiParam::new(types::I64); + + let print_id = module.declare_function("print", Linkage::Import, &Signature { + params: vec![string_param, int64_param], + returns: vec![], + call_conv: CallConv::AppleAarch64 + })?; + builtin_functions.insert("print".to_string(), print_id); + + Ok(RuntimeFunctions { builtin_functions, _referenced_functions }) + } + + pub fn include_runtime_function(&self, name: &str, module: &mut M, func: &mut Function) -> Result { + match self.builtin_functions.get(name) { + None => Err(RuntimeFunctionError::CannotFindRuntimeFunction(name.to_string())), + Some(func_id) => Ok(module.declare_func_in_func(*func_id, func)), + } + } +} \ No newline at end of file