mirror of
https://github.com/roc-lang/roc.git
synced 2025-09-29 23:04:49 +00:00
Load builtins on startup
This commit is contained in:
parent
081de1b4bc
commit
37492f4aa6
5 changed files with 24 additions and 4 deletions
|
@ -8,7 +8,9 @@ use inkwell::passes::PassManager;
|
|||
use inkwell::types::BasicType;
|
||||
use inkwell::OptimizationLevel;
|
||||
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_mono::expr::{Expr, Procs};
|
||||
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 context = Context::create();
|
||||
let module = context.create_module("app");
|
||||
let module = module_from_builtins(&context, "app");
|
||||
let builder = context.create_builder();
|
||||
let fpm = PassManager::create(&module);
|
||||
|
||||
|
|
|
@ -2,6 +2,7 @@ use bumpalo::collections::Vec;
|
|||
use bumpalo::Bump;
|
||||
use inkwell::builder::Builder;
|
||||
use inkwell::context::Context;
|
||||
use inkwell::memory_buffer::MemoryBuffer;
|
||||
use inkwell::module::{Linkage, Module};
|
||||
use inkwell::passes::PassManager;
|
||||
use inkwell::types::{BasicTypeEnum, IntType, StructType};
|
||||
|
@ -9,6 +10,7 @@ use inkwell::values::BasicValueEnum::{self, *};
|
|||
use inkwell::values::{FunctionValue, IntValue, PointerValue, StructValue};
|
||||
use inkwell::{FloatPredicate, IntPredicate};
|
||||
|
||||
use crate::llvm::builtins::BUILTINS_BITCODE;
|
||||
use crate::llvm::convert::{
|
||||
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<'_>>) {
|
||||
// tail-call elimination is always on
|
||||
fpm.add_instruction_combining_pass();
|
||||
|
|
7
compiler/gen/src/llvm/builtins.rs
Normal file
7
compiler/gen/src/llvm/builtins.rs
Normal file
File diff suppressed because one or more lines are too long
|
@ -1,2 +1,3 @@
|
|||
pub mod build;
|
||||
pub mod builtins;
|
||||
pub mod convert;
|
||||
|
|
|
@ -10,7 +10,7 @@ macro_rules! assert_llvm_evals_to {
|
|||
let (content, mut subs) = infer_expr(subs, &mut unify_problems, &constraint, var);
|
||||
|
||||
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 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 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 fpm = PassManager::create(&module);
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue