Add inkwell to replace llvm-sys and add the types module

This commit is contained in:
Sameer Rahmani 2020-06-20 22:02:17 +01:00
parent 0b348cff82
commit 3454a44f65
11 changed files with 170 additions and 44 deletions

104
Cargo.lock generated
View File

@ -38,6 +38,12 @@ version = "1.0.54"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7bbb73db36c1246e9034e307d0fba23f9a2e251faa47ade70c1bd252220c8311"
[[package]]
name = "cfg-if"
version = "0.1.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822"
[[package]]
name = "clap"
version = "3.0.0-beta.1"
@ -71,6 +77,21 @@ dependencies = [
"syn",
]
[[package]]
name = "cloudabi"
version = "0.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f"
dependencies = [
"bitflags",
]
[[package]]
name = "either"
version = "1.5.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bb1f6b1ce1c140482ea30ddd3335fc0024ac7ee112895426e0a629a6c20adfe3"
[[package]]
name = "heck"
version = "0.3.1"
@ -98,6 +119,30 @@ dependencies = [
"autocfg",
]
[[package]]
name = "inkwell"
version = "0.1.0"
source = "git+https://github.com/TheDan64/inkwell?branch=llvm10-0#84b9666c72ae9f286bfee559d13ac71ec8d1fce9"
dependencies = [
"either",
"inkwell_internals",
"libc",
"llvm-sys",
"once_cell",
"parking_lot",
"regex",
]
[[package]]
name = "inkwell_internals"
version = "0.2.0"
source = "git+https://github.com/TheDan64/inkwell?branch=llvm10-0#84b9666c72ae9f286bfee559d13ac71ec8d1fce9"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "lazy_static"
version = "1.4.0"
@ -129,18 +174,57 @@ dependencies = [
"semver",
]
[[package]]
name = "lock_api"
version = "0.3.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c4da24a77a3d8a6d4862d95f72e6fdb9c09a643ecdb402d754004a557f2bec75"
dependencies = [
"scopeguard",
]
[[package]]
name = "memchr"
version = "2.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3728d817d99e5ac407411fa471ff9800a778d88a24685968b36824eaf4bee400"
[[package]]
name = "once_cell"
version = "1.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0b631f7e854af39a1739f401cf34a8a013dfe09eac4fa4dba91e9768bd28168d"
[[package]]
name = "os_str_bytes"
version = "2.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "06de47b848347d8c4c94219ad8ecd35eb90231704b067e67e6ae2e36ee023510"
[[package]]
name = "parking_lot"
version = "0.10.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d3a704eb390aafdc107b0e392f56a82b668e3a71366993b5340f5833fd62505e"
dependencies = [
"lock_api",
"parking_lot_core",
]
[[package]]
name = "parking_lot_core"
version = "0.7.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d58c7c768d4ba344e3e8d72518ac13e259d7c7ade24167003b8488e10b6740a3"
dependencies = [
"cfg-if",
"cloudabi",
"libc",
"redox_syscall",
"smallvec",
"winapi",
]
[[package]]
name = "proc-macro-error"
version = "0.4.12"
@ -185,6 +269,12 @@ dependencies = [
"proc-macro2",
]
[[package]]
name = "redox_syscall"
version = "0.1.56"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2439c63f3f6139d1b57529d16bc3b8bb855230c8efcc5d3a896c8bea7c3b1e84"
[[package]]
name = "regex"
version = "1.3.9"
@ -203,6 +293,12 @@ version = "0.6.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "26412eb97c6b088a6997e05f69403a802a92d520de2f8e63c2b65f9e0f47c4e8"
[[package]]
name = "scopeguard"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"
[[package]]
name = "semver"
version = "0.9.0"
@ -223,9 +319,15 @@ name = "serene"
version = "0.1.0"
dependencies = [
"clap",
"llvm-sys",
"inkwell",
]
[[package]]
name = "smallvec"
version = "1.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c7cb5678e1615754284ec264d9bb5b4c27d2018577fd90ac0ceb578591ed5ee4"
[[package]]
name = "strsim"
version = "0.10.0"

View File

@ -7,5 +7,5 @@ edition = "2018"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
llvm-sys = "100"
clap = { version = "3.0.0-beta.1", features = ["yaml"] }
clap = { version = "3.0.0-beta.1", features = ["yaml"] }
inkwell = { git = "https://github.com/TheDan64/inkwell", branch = "llvm10-0" }

View File

@ -1,50 +1,20 @@
use crate::collections::list;
use crate::expr::Expression;
// Note: I kept the number implementation simple for now
// but we need to decide on our approach to numbers, are
// we going to only support the 64bit variants? or should
// try to be smart and support 32 and 64 and switch between
// them ?
// What about usize and isize ?
#[derive(Debug, Clone)]
pub enum Number {
Integer(i64),
Float(f64),
}
impl PartialEq for Number {
fn eq(&self, other: &Self) -> bool {
let comb = (&self, &other);
match comb {
(Number::Integer(x), Number::Integer(y)) => *x == *y,
(Number::Float(x), Number::Float(y)) => *x == *y,
(Number::Integer(x), Number::Float(y)) => *x as f64 == *y,
(Number::Float(x), Number::Integer(y)) => *x == *y as f64,
}
}
}
impl Eq for Number {}
use crate::types::{Expression, List, Number};
#[derive(Debug, Eq, PartialEq, Clone)]
pub enum Expr {
//List(list::List<Expr>),
Symbol(String),
Str(String),
Num(Number),
Comment,
Error(String),
// Cons(Box<Expr>, Box<Expr>),
Cons(list::List<Expr>),
Cons(List<Expr>),
Nil,
NoMatch,
}
impl Expr {
pub fn make_list(first: Expr, rest: Expr) -> Expr {
Expr::Cons(list::List::<Expr>::new(Box::new(first), Box::new(rest)))
Expr::Cons(List::<Expr>::new(Box::new(first), Box::new(rest)))
}
pub fn make_symbol(v: String) -> Expr {

View File

@ -1 +0,0 @@
pub mod list;

18
src/compiler.rs Normal file
View File

@ -0,0 +1,18 @@
use inkwell::builder::Builder;
use inkwell::context::Context;
use inkwell::module::Module;
use inkwell::values::{BasicValue, BasicValueEnum, FloatValue, FunctionValue, PointerValue};
use crate::expr::Expression;
use std::collections::HashMap;
pub struct Compiler<'a, 'ctx> {
context: &'ctx Context,
builder: &'a Builder<'ctx>,
module: &'a Module<'ctx>,
scope: HashMap<String, PointerValue<'ctx>>,
}
impl<'a, 'ctx> Compiler<'a, 'ctx> {
pub fn compile(exprs: &impl Expression) {}
}

View File

@ -1,3 +0,0 @@
pub trait Expression {
fn gen_code(&self);
}

View File

@ -1,4 +1,4 @@
extern crate llvm_sys;
extern crate inkwell;
use clap::{load_yaml, App};
use std::fs::File;
@ -7,9 +7,9 @@ use std::io::prelude::*;
use std::string::String;
pub mod ast;
pub mod collections;
pub mod expr;
pub mod compiler;
pub mod reader;
pub mod types;
fn main() -> io::Result<()> {
let yaml = load_yaml!("cli.yml");

7
src/types.rs Normal file
View File

@ -0,0 +1,7 @@
pub mod core;
pub mod list;
pub mod number;
pub use self::core::Expression;
pub use self::list::List;
pub use self::number::Number;

View File

@ -1,4 +1,4 @@
use crate::expr::Expression;
use crate::types::core::Expression;
#[derive(Debug, Eq, PartialEq, Clone)]
pub struct List<T: Expression> {

33
src/types/number.rs Normal file
View File

@ -0,0 +1,33 @@
use crate::types::Expression;
// Note: I kept the number implementation simple for now
// but we need to decide on our approach to numbers, are
// we going to only support the 64bit variants? or should
// try to be smart and support 32 and 64 and switch between
// them ?
// What about usize and isize ?
#[derive(Debug, Clone)]
pub enum Number {
Integer(i64),
Float(f64),
}
impl PartialEq for Number {
fn eq(&self, other: &Self) -> bool {
let comb = (&self, &other);
match comb {
(Number::Integer(x), Number::Integer(y)) => *x == *y,
(Number::Float(x), Number::Float(y)) => *x == *y,
(Number::Integer(x), Number::Float(y)) => *x as f64 == *y,
(Number::Float(x), Number::Integer(y)) => *x == *y as f64,
}
}
}
impl Eq for Number {}
impl Expression for Number {
fn eval() {}
fn code_gen() {}
}