Force single-threaded compilation if LLVM is not thread-safe

This commit is contained in:
David Mak 2023-10-13 11:28:30 +08:00
parent 950f431483
commit 7fc2a30c14
2 changed files with 16 additions and 6 deletions

View File

@ -9,6 +9,7 @@ use inkwell::{
memory_buffer::MemoryBuffer, memory_buffer::MemoryBuffer,
module::{Linkage, Module}, module::{Linkage, Module},
passes::PassBuilderOptions, passes::PassBuilderOptions,
support::is_multithreaded,
targets::*, targets::*,
OptimizationLevel, OptimizationLevel,
}; };
@ -582,7 +583,8 @@ impl Nac3 {
membuffer.lock().push(buffer); membuffer.lock().push(buffer);
}))); })));
let size_t = if self.isa == Isa::Host { 64 } else { 32 }; let size_t = if self.isa == Isa::Host { 64 } else { 32 };
let thread_names: Vec<String> = (0..4).map(|_| "main".to_string()).collect(); let num_threads = if is_multithreaded() { 4 } else { 1 };
let thread_names: Vec<String> = (0..num_threads).map(|_| "main".to_string()).collect();
let threads: Vec<_> = thread_names let threads: Vec<_> = thread_names
.iter() .iter()
.map(|s| Box::new(ArtiqCodeGenerator::new(s.to_string(), size_t, self.time_fns))) .map(|s| Box::new(ArtiqCodeGenerator::new(s.to_string(), size_t, self.time_fns)))

View File

@ -2,6 +2,7 @@ use clap::Parser;
use inkwell::{ use inkwell::{
memory_buffer::MemoryBuffer, memory_buffer::MemoryBuffer,
passes::PassBuilderOptions, passes::PassBuilderOptions,
support::is_multithreaded,
targets::*, targets::*,
OptimizationLevel, OptimizationLevel,
}; };
@ -210,12 +211,19 @@ fn main() {
.map(|arg| if arg == "native" { host_target_machine.cpu.clone() } else { arg }) .map(|arg| if arg == "native" { host_target_machine.cpu.clone() } else { arg })
.unwrap_or_default(); .unwrap_or_default();
let target_features = target_features.unwrap_or_default(); let target_features = target_features.unwrap_or_default();
let threads = if threads == 0 { let threads = if is_multithreaded() {
std::thread::available_parallelism() if threads == 0 {
.map(|threads| threads.get() as u32) std::thread::available_parallelism()
.unwrap_or(1u32) .map(|threads| threads.get() as u32)
.unwrap_or(1u32)
} else {
threads
}
} else { } else {
threads if threads != 1 {
println!("Warning: Number of threads specified in command-line but multithreading is disabled in LLVM at build time! Defaulting to single-threaded compilation")
}
1
}; };
let opt_level = match opt_level { let opt_level = match opt_level {
0 => OptimizationLevel::None, 0 => OptimizationLevel::None,