diff --git a/Cargo.lock b/Cargo.lock index f53b5bfd..97aba67e 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 ec4cd3c1..12a72484 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 69596516..a0cbda1b 100644 --- a/nac3core/src/codegen/mod.rs +++ b/nac3core/src/codegen/mod.rs @@ -52,6 +52,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 +224,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() { diff --git a/nac3core/src/lib.rs b/nac3core/src/lib.rs index bff6b5cc..ec45cbe9 100644 --- a/nac3core/src/lib.rs +++ b/nac3core/src/lib.rs @@ -1,6 +1,9 @@ #![warn(clippy::all)] #![allow(dead_code)] +#[macro_use] +extern crate lazy_static; + pub mod codegen; pub mod symbol_resolver; pub mod toplevel;