Load builtins on startup

This commit is contained in:
Richard Feldman 2020-03-31 23:49:12 -04:00
parent 081de1b4bc
commit 37492f4aa6
5 changed files with 24 additions and 4 deletions

View file

@ -8,7 +8,9 @@ use inkwell::passes::PassManager;
use inkwell::types::BasicType; use inkwell::types::BasicType;
use inkwell::OptimizationLevel; use inkwell::OptimizationLevel;
use roc_collections::all::ImMap; use roc_collections::all::ImMap;
use roc_gen::llvm::build::{build_proc, build_proc_header, get_call_conventions}; use roc_gen::llvm::build::{
build_proc, build_proc_header, get_call_conventions, module_from_builtins,
};
use roc_gen::llvm::convert::basic_type_from_layout; use roc_gen::llvm::convert::basic_type_from_layout;
use roc_mono::expr::{Expr, Procs}; use roc_mono::expr::{Expr, Procs};
use roc_mono::layout::Layout; use roc_mono::layout::Layout;
@ -65,7 +67,7 @@ fn gen(src: &str, target: Triple, dest_filename: &Path) {
let (content, mut subs) = infer_expr(subs, &mut unify_problems, &constraint, var); let (content, mut subs) = infer_expr(subs, &mut unify_problems, &constraint, var);
let context = Context::create(); let context = Context::create();
let module = context.create_module("app"); let module = module_from_builtins(&context, "app");
let builder = context.create_builder(); let builder = context.create_builder();
let fpm = PassManager::create(&module); let fpm = PassManager::create(&module);

View file

@ -2,6 +2,7 @@ use bumpalo::collections::Vec;
use bumpalo::Bump; use bumpalo::Bump;
use inkwell::builder::Builder; use inkwell::builder::Builder;
use inkwell::context::Context; use inkwell::context::Context;
use inkwell::memory_buffer::MemoryBuffer;
use inkwell::module::{Linkage, Module}; use inkwell::module::{Linkage, Module};
use inkwell::passes::PassManager; use inkwell::passes::PassManager;
use inkwell::types::{BasicTypeEnum, IntType, StructType}; use inkwell::types::{BasicTypeEnum, IntType, StructType};
@ -9,6 +10,7 @@ use inkwell::values::BasicValueEnum::{self, *};
use inkwell::values::{FunctionValue, IntValue, PointerValue, StructValue}; use inkwell::values::{FunctionValue, IntValue, PointerValue, StructValue};
use inkwell::{FloatPredicate, IntPredicate}; use inkwell::{FloatPredicate, IntPredicate};
use crate::llvm::builtins::BUILTINS_BITCODE;
use crate::llvm::convert::{ use crate::llvm::convert::{
basic_type_from_layout, collection_wrapper, empty_collection, get_fn_type, ptr_int, basic_type_from_layout, collection_wrapper, empty_collection, get_fn_type, ptr_int,
}; };
@ -47,6 +49,14 @@ impl<'a, 'ctx, 'env> Env<'a, 'ctx, 'env> {
} }
} }
pub fn module_from_builtins<'ctx>(ctx: &'ctx Context, module_name: &str) -> Module<'ctx> {
let memory_buffer = MemoryBuffer::create_from_memory_range(BUILTINS_BITCODE, module_name);
let module = Module::parse_bitcode_from_buffer(&memory_buffer, ctx)
.unwrap_or_else(|err| panic!("Unable to import builtins bitcode. LLVM error: {:?}", err));
module
}
pub fn add_passes(fpm: &PassManager<FunctionValue<'_>>) { pub fn add_passes(fpm: &PassManager<FunctionValue<'_>>) {
// tail-call elimination is always on // tail-call elimination is always on
fpm.add_instruction_combining_pass(); fpm.add_instruction_combining_pass();

File diff suppressed because one or more lines are too long

View file

@ -1,2 +1,3 @@
pub mod build; pub mod build;
pub mod builtins;
pub mod convert; pub mod convert;

View file

@ -10,7 +10,7 @@ macro_rules! assert_llvm_evals_to {
let (content, mut subs) = infer_expr(subs, &mut unify_problems, &constraint, var); let (content, mut subs) = infer_expr(subs, &mut unify_problems, &constraint, var);
let context = Context::create(); let context = Context::create();
let module = context.create_module("app"); let module = roc_gen::llvm::build::module_from_builtins(&context, "app");
let builder = context.create_builder(); let builder = context.create_builder();
let fpm = inkwell::passes::PassManager::create(&module); let fpm = inkwell::passes::PassManager::create(&module);
@ -142,7 +142,7 @@ macro_rules! assert_opt_evals_to {
let (content, mut subs) = infer_expr(subs, &mut unify_problems, &constraint, var); let (content, mut subs) = infer_expr(subs, &mut unify_problems, &constraint, var);
let context = Context::create(); let context = Context::create();
let module = context.create_module("app"); let module = roc_gen::llvm::build::module_from_builtins(&context, "app");
let builder = context.create_builder(); let builder = context.create_builder();
let fpm = PassManager::create(&module); let fpm = PassManager::create(&module);