275-fix-random-sigsegv #302
|
@ -521,6 +521,7 @@ dependencies = [
|
||||||
"inkwell",
|
"inkwell",
|
||||||
"insta",
|
"insta",
|
||||||
"itertools",
|
"itertools",
|
||||||
|
"lazy_static",
|
||||||
"nac3parser",
|
"nac3parser",
|
||||||
"parking_lot 0.11.2",
|
"parking_lot 0.11.2",
|
||||||
"rayon",
|
"rayon",
|
||||||
|
|
|
@ -10,6 +10,7 @@ crossbeam = "0.8.1"
|
||||||
parking_lot = "0.11.1"
|
parking_lot = "0.11.1"
|
||||||
rayon = "1.5.1"
|
rayon = "1.5.1"
|
||||||
nac3parser = { path = "../nac3parser" }
|
nac3parser = { path = "../nac3parser" }
|
||||||
|
lazy_static = "1.4.0"
|
||||||
|
|
||||||
[dependencies.inkwell]
|
[dependencies.inkwell]
|
||||||
git = "https://github.com/TheDan64/inkwell.git"
|
git = "https://github.com/TheDan64/inkwell.git"
|
||||||
|
|
|
@ -31,6 +31,7 @@ use std::sync::{
|
||||||
Arc,
|
Arc,
|
||||||
};
|
};
|
||||||
use std::thread;
|
use std::thread;
|
||||||
|
use lazy_static::lazy_static;
|
||||||
|
|
||||||
pub mod concrete_type;
|
pub mod concrete_type;
|
||||||
pub mod expr;
|
pub mod expr;
|
||||||
|
@ -52,6 +53,12 @@ pub struct StaticValueStore {
|
||||||
|
|
||||||
pub type VarValue<'ctx> = (PointerValue<'ctx>, Option<Arc<dyn StaticValue + Send + Sync>>, i64);
|
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 struct CodeGenContext<'ctx, 'a> {
|
||||||
pub ctx: &'ctx Context,
|
pub ctx: &'ctx Context,
|
||||||
pub builder: Builder<'ctx>,
|
pub builder: Builder<'ctx>,
|
||||||
|
@ -218,10 +225,16 @@ impl WorkerRegistry {
|
||||||
context.i32_type().const_int(4, false),
|
context.i32_type().const_int(4, false),
|
||||||
);
|
);
|
||||||
|
|
||||||
let pass_builder = PassManagerBuilder::create();
|
|
||||||
pass_builder.set_optimization_level(OptimizationLevel::Default);
|
|
||||||
let passes = PassManager::create(&module);
|
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();
|
let mut errors = HashSet::new();
|
||||||
while let Some(task) = self.receiver.recv().unwrap() {
|
while let Some(task) = self.receiver.recv().unwrap() {
|
||||||
|
|
Loading…
Reference in New Issue