Start messing around with cranelift.
This commit is contained in:
65
src/bin.rs
65
src/bin.rs
@@ -3,9 +3,16 @@ use codespan_reporting::diagnostic::Diagnostic;
|
||||
use codespan_reporting::files::SimpleFiles;
|
||||
use codespan_reporting::term;
|
||||
use codespan_reporting::term::termcolor::{ColorChoice, StandardStream};
|
||||
use cranelift_codegen::ir::{AbiParam, types, Signature};
|
||||
use cranelift_codegen::isa::CallConv;
|
||||
use cranelift_codegen::{isa, settings, CodegenError};
|
||||
use cranelift_module::{default_libcall_names, ModuleError, Linkage, Module};
|
||||
use cranelift_object::{ObjectBuilder, ObjectModule, object};
|
||||
use ngr::asts::lil;
|
||||
use ngr::passes::run_front_end;
|
||||
use pretty::Arena;
|
||||
use std::io;
|
||||
use thiserror::Error;
|
||||
|
||||
#[derive(Parser, Debug)]
|
||||
#[clap(author, version, about, long_about = None)]
|
||||
@@ -18,7 +25,25 @@ struct CommandLineArguments {
|
||||
file: String,
|
||||
}
|
||||
|
||||
fn main() {
|
||||
#[derive(Debug, Error)]
|
||||
enum MainError {
|
||||
#[error("Error parsing triple: {0}")]
|
||||
Isa(#[from] isa::LookupError),
|
||||
|
||||
#[error("Code generation error: {0}")]
|
||||
Codegen(#[from] CodegenError),
|
||||
|
||||
#[error("Module error: {0}")]
|
||||
Module(#[from] ModuleError),
|
||||
|
||||
#[error("IO error: {0}")]
|
||||
IO(#[from] io::Error),
|
||||
|
||||
#[error("Object write error: {0}")]
|
||||
Object(#[from] object::write::Error),
|
||||
}
|
||||
|
||||
fn main() -> Result<(), MainError> {
|
||||
let args = CommandLineArguments::parse();
|
||||
let mut file_database = SimpleFiles::new();
|
||||
let initial_file_name = &args.file;
|
||||
@@ -46,13 +71,35 @@ fn main() {
|
||||
.unwrap();
|
||||
}
|
||||
|
||||
if let Some((hil_tree, mut variable_map)) = hil_conversion_result.result {
|
||||
let arena = Arena::new();
|
||||
let lil_tree = lil::Program::convert(hil_tree, &mut variable_map);
|
||||
lil_tree
|
||||
.pretty(&variable_map, &arena)
|
||||
.into_doc()
|
||||
.render_colored(72, StandardStream::stdout(ColorChoice::Auto))
|
||||
.unwrap()
|
||||
if let Some((hil_tree, variable_map)) = hil_conversion_result.result {
|
||||
//let arena = Arena::new();
|
||||
let lil_tree = lil::Program::convert(hil_tree, variable_map.clone());
|
||||
|
||||
let isa = isa::lookup_by_name("aarch64-apple-darwin")?.finish(settings::Flags::new(settings::builder()))?;
|
||||
let object_builder = ObjectBuilder::new(isa, "example", default_libcall_names())?;
|
||||
let mut object_module = ObjectModule::new(object_builder);
|
||||
|
||||
let print_signature = Signature {
|
||||
params: vec![AbiParam::new(types::I64)],
|
||||
returns: vec![],
|
||||
call_conv: CallConv::SystemV,
|
||||
};
|
||||
let print_func_id = object_module.declare_function("print", Linkage::Import, &print_signature)?;
|
||||
|
||||
let _compiled = lil_tree.into_cranelift(&mut object_module, print_func_id)?;
|
||||
|
||||
// something?
|
||||
|
||||
let bytes = object_module.finish().emit()?;
|
||||
|
||||
std::fs::write("output.o", bytes)?;
|
||||
|
||||
// lil_tree
|
||||
// .pretty(&variable_map, &arena)
|
||||
// .into_doc()
|
||||
// .render_colored(72, StandardStream::stdout(ColorChoice::Auto))
|
||||
// .unwrap()
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user