diff --git a/Cargo.lock b/Cargo.lock index f53b5bf..97aba67 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -521,6 +521,7 @@ dependencies = [ "inkwell", "insta", "itertools", + "lazy_static", "nac3parser", "parking_lot 0.11.2", "rayon", diff --git a/nac3core/Cargo.toml b/nac3core/Cargo.toml index ec4cd3c..12a7248 100644 --- a/nac3core/Cargo.toml +++ b/nac3core/Cargo.toml @@ -10,6 +10,7 @@ crossbeam = "0.8.1" parking_lot = "0.11.1" rayon = "1.5.1" nac3parser = { path = "../nac3parser" } +lazy_static = "1.4.0" [dependencies.inkwell] git = "https://github.com/TheDan64/inkwell.git" diff --git a/nac3core/src/codegen/mod.rs b/nac3core/src/codegen/mod.rs index 6959651..a7be388 100644 --- a/nac3core/src/codegen/mod.rs +++ b/nac3core/src/codegen/mod.rs @@ -31,6 +31,7 @@ use std::sync::{ Arc, }; use std::thread; +use lazy_static::lazy_static; pub mod concrete_type; pub mod expr; @@ -52,6 +53,12 @@ pub struct StaticValueStore { pub type VarValue<'ctx> = (PointerValue<'ctx>, Option>, i64); +lazy_static!( + // HACK: The Mutex is a work-around for issue + // https://git.m-labs.hk/M-Labs/nac3/issues/275 + static ref PASSES_INIT_LOCK: Mutex = Mutex::new(AtomicBool::new(true)); +); + pub struct CodeGenContext<'ctx, 'a> { pub ctx: &'ctx Context, pub builder: Builder<'ctx>, @@ -218,10 +225,16 @@ impl WorkerRegistry { context.i32_type().const_int(4, false), ); - let pass_builder = PassManagerBuilder::create(); - pass_builder.set_optimization_level(OptimizationLevel::Default); let passes = PassManager::create(&module); - pass_builder.populate_function_pass_manager(&passes); + + // HACK: This critical section is a work-around for issue + // https://git.m-labs.hk/M-Labs/nac3/issues/275 + { + let _data = PASSES_INIT_LOCK.lock(); + let pass_builder = PassManagerBuilder::create(); + pass_builder.set_optimization_level(OptimizationLevel::Default); + pass_builder.populate_function_pass_manager(&passes); + } let mut errors = HashSet::new(); while let Some(task) = self.receiver.recv().unwrap() {