diff options
Diffstat (limited to 'src/librustc_trans/llvm_util.rs')
| -rw-r--r-- | src/librustc_trans/llvm_util.rs | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/src/librustc_trans/llvm_util.rs b/src/librustc_trans/llvm_util.rs index 214fdbded4e..15988008de2 100644 --- a/src/librustc_trans/llvm_util.rs +++ b/src/librustc_trans/llvm_util.rs @@ -19,11 +19,12 @@ use std::ffi::{CStr, CString}; use std::sync::atomic::{AtomicBool, Ordering}; use std::sync::Once; -pub fn init(sess: &Session) { +static POISONED: AtomicBool = AtomicBool::new(false); +static INIT: Once = Once::new(); + +pub(crate) fn init(sess: &Session) { unsafe { // Before we touch LLVM, make sure that multithreading is enabled. - static POISONED: AtomicBool = AtomicBool::new(false); - static INIT: Once = Once::new(); INIT.call_once(|| { if llvm::LLVMStartMultithreaded() != 1 { // use an extra bool to make sure that all future usage of LLVM @@ -40,6 +41,13 @@ pub fn init(sess: &Session) { } } +fn require_inited() { + INIT.call_once(|| bug!("llvm is not initialized")); + if POISONED.load(Ordering::SeqCst) { + bug!("couldn't enable multi-threaded LLVM"); + } +} + unsafe fn configure_llvm(sess: &Session) { let mut llvm_c_strs = Vec::new(); let mut llvm_args = Vec::new(); @@ -125,6 +133,7 @@ pub fn target_feature_whitelist(sess: &Session) -> Vec<&CStr> { } pub fn print_version() { + // Can be called without initializing LLVM unsafe { println!("LLVM version: {}.{}", llvm::LLVMRustVersionMajor(), llvm::LLVMRustVersionMinor()); @@ -132,10 +141,12 @@ pub fn print_version() { } pub fn print_passes() { + // Can be called without initializing LLVM unsafe { llvm::LLVMRustPrintPasses(); } } -pub fn print(req: PrintRequest, sess: &Session) { +pub(crate) fn print(req: PrintRequest, sess: &Session) { + require_inited(); let tm = create_target_machine(sess); unsafe { match req { |
