extern crate inkwell; extern crate rustpython_parser; use rustpython_parser::parser; use inkwell::OptimizationLevel; use inkwell::builder::Builder; use inkwell::context::Context; use inkwell::module::Module; use inkwell::targets::*; use inkwell::passes::PassManager; use std::error::Error; use std::path::Path; struct CodeGen<'ctx> { context: &'ctx Context, module: Module<'ctx>, builder: Builder<'ctx> } impl<'ctx> CodeGen<'ctx> { fn compile_sum(&self) { let i64_type = self.context.i64_type(); let fn_type = i64_type.fn_type(&[i64_type.into(), i64_type.into(), i64_type.into()], false); let function = self.module.add_function("sum", fn_type, None); let basic_block = self.context.append_basic_block(function, "entry"); self.builder.position_at_end(basic_block); let x = function.get_nth_param(0).unwrap().into_int_value(); let y = function.get_nth_param(1).unwrap().into_int_value(); let z = function.get_nth_param(2).unwrap().into_int_value(); let sum = self.builder.build_int_add(x, y, "sum"); let sum = self.builder.build_int_add(sum, z, "sum"); self.builder.build_return(Some(&sum)); Target::initialize_all(&InitializationConfig::default()); //let triple = TargetMachine::get_default_triple(); let triple = TargetTriple::create("riscv32-none-linux-gnu"); let target = Target::from_triple(&triple) .expect("couldn't create target from target triple"); let target_machine = target .create_target_machine( &triple, "", "", OptimizationLevel::Default, RelocMode::Default, CodeModel::Default, ) .expect("couldn't create target machine"); target_machine .write_to_file(&self.module, FileType::Object, Path::new("test.o")) .expect("couldn't write module to file"); } } fn main() -> Result<(), Box> { let context = Context::create(); let module = context.create_module("sum"); let codegen = CodeGen { context: &context, module, builder: context.create_builder(), }; codegen.compile_sum(); let x = parser::parse_program("def foo(x: int): print('abc')"); println!("{:?}", x); Ok(()) }