work around random segmentation fault (#275)

Reviewed-on: M-Labs/nac3#302
Co-authored-by: z78078 <cc@m-labs.hk>
Co-committed-by: z78078 <cc@m-labs.hk>
issue-136
z78078 2022-07-04 18:06:36 +08:00 committed by sb10q
parent a18d095245
commit 96b3a3bf5c
3 changed files with 18 additions and 3 deletions

1
Cargo.lock generated
View File

@ -521,6 +521,7 @@ dependencies = [
"inkwell",
"insta",
"itertools",
"lazy_static",
"nac3parser",
"parking_lot 0.11.2",
"rayon",

View File

@ -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"

View File

@ -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<Arc<dyn StaticValue + Send + Sync>>, 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<AtomicBool> = 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() {