diff --git a/Cargo.lock b/Cargo.lock index 9121944..74cffee 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -24,8 +24,14 @@ checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1" name = "bcomp" version = "0.1.0" dependencies = [ + "anyhow", "cranelift", + "cranelift-codegen", + "cranelift-frontend", + "cranelift-module", + "cranelift-object", "ntest", + "target-lexicon", ] [[package]] @@ -37,6 +43,12 @@ dependencies = [ "allocator-api2", ] +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + [[package]] name = "cranelift" version = "0.131.0" @@ -178,12 +190,36 @@ dependencies = [ "cranelift-control", ] +[[package]] +name = "cranelift-object" +version = "0.131.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d212d15015c374333b11b833111b7c7e686bfaec02385af53611050bce7e9d" +dependencies = [ + "anyhow", + "cranelift-codegen", + "cranelift-control", + "cranelift-module", + "log", + "object", + "target-lexicon", +] + [[package]] name = "cranelift-srcgen" version = "0.131.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "090ee5de58c6f17eb5e3a5ae8cf1695c7efea04ec4dd0ecba6a5b996c9bad7dc" +[[package]] +name = "crc32fast" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" +dependencies = [ + "cfg-if", +] + [[package]] name = "equivalent" version = "1.0.2" @@ -214,12 +250,6 @@ dependencies = [ "stable_deref_trait", ] -[[package]] -name = "hashbrown" -version = "0.15.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5" - [[package]] name = "hashbrown" version = "0.16.1" @@ -234,6 +264,9 @@ name = "hashbrown" version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4f467dd6dccf739c208452f8014c75c18bb8301b050ad1cfb27153803edb0f51" +dependencies = [ + "foldhash", +] [[package]] name = "heck" @@ -243,12 +276,12 @@ checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "indexmap" -version = "2.10.0" +version = "2.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe4cd85333e22411419a0bcae1297d25e58c9443848b11dc6a86fefe8c78a661" +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" dependencies = [ "equivalent", - "hashbrown 0.15.4", + "hashbrown 0.17.0", ] [[package]] @@ -302,6 +335,18 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "object" +version = "0.39.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e5a6c098c7a3b6547378093f5cc30bc54fd361ce711e05293a5cc589562739b" +dependencies = [ + "crc32fast", + "hashbrown 0.17.0", + "indexmap", + "memchr", +] + [[package]] name = "proc-macro-crate" version = "3.3.0" diff --git a/Cargo.toml b/Cargo.toml index 5ff71cb..17b5c4d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,5 +4,11 @@ version = "0.1.0" edition = "2024" [dependencies] +anyhow = "1.0.100" ntest = "0.9.3" cranelift = "0.131.0" +cranelift-codegen = "0.131.0" +cranelift-frontend = "0.131.0" +cranelift-module = "0.131.0" +cranelift-object = "0.131.0" +target-lexicon = "0.13" diff --git a/src/emitter.rs b/src/emitter.rs index 72e425c..d326428 100644 --- a/src/emitter.rs +++ b/src/emitter.rs @@ -1,19 +1,29 @@ -//! The emitter for turning the abstract syntax tree into LLVM IR +//! The emitter for turning the abstract syntax tree into Cranelift IR. -// Temp used for the emitter placeholder -use std::marker::PhantomData; +use cranelift_codegen::{isa, settings}; +use cranelift_frontend::FunctionBuilderContext; +use cranelift_module::default_libcall_names; +use cranelift_object::{ObjectBuilder, ObjectModule}; +use target_lexicon::HOST; -/// The emiter structure, including a lifetime. -/// -/// See lexer.rs about doing away with lifetimes like this +/// The emitter state. #[allow(dead_code)] -pub struct Emitter<'ctx> { - temporary: PhantomData<&'ctx ()>, +pub struct Emitter { + module: ObjectModule, + function_context: FunctionBuilderContext, } #[allow(unused_variables, dead_code)] -impl Emitter<'_> { - pub fn new(module_name: &str) -> Self { - unimplemented!() +impl Emitter { + pub fn new() -> anyhow::Result { + let shared_flags = settings::Flags::new(settings::builder()); + let isa_builder = isa::lookup(HOST)?; + let isa = isa_builder.finish(shared_flags)?; + let builder = ObjectBuilder::new(isa, "bcomp", default_libcall_names())?; + + Ok(Self { + module: ObjectModule::new(builder), + function_context: FunctionBuilderContext::new(), + }) } } diff --git a/src/main.rs b/src/main.rs index 063ca5e..0244f19 100644 --- a/src/main.rs +++ b/src/main.rs @@ -5,10 +5,14 @@ //! A compiler for the basic language +use crate::parser::Parser; + mod emitter; mod lexer; mod parser; fn main() { - println!("Hello, world!"); + let mut parser = Parser::from_input("1"); + + let _program = parser.parse_program(); }