From b6a746352646965f71fa6c4fd9b37fd94918db8a Mon Sep 17 00:00:00 2001 From: Alex Crichton Date: Fri, 27 Dec 2013 22:52:22 -0800 Subject: [PATCH] Initialize LLVM only once This also appears to fix a race in LLVM that was causing a deadlock on the bots during the doc-test tests (where we use rustc in parallel). --- src/librustc/back/link.rs | 50 +++++++++++++++++++-------------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/src/librustc/back/link.rs b/src/librustc/back/link.rs index a85d5f35b5a3..e761a14a3ace 100644 --- a/src/librustc/back/link.rs +++ b/src/librustc/back/link.rs @@ -111,29 +111,7 @@ pub fn run_passes(sess: Session, let llmod = trans.module; let llcx = trans.context; unsafe { - llvm::LLVMInitializePasses(); - - // Only initialize the platforms supported by Rust here, because - // using --llvm-root will have multiple platforms that rustllvm - // doesn't actually link to and it's pointless to put target info - // into the registry that Rust can not generate machine code for. - llvm::LLVMInitializeX86TargetInfo(); - llvm::LLVMInitializeX86Target(); - llvm::LLVMInitializeX86TargetMC(); - llvm::LLVMInitializeX86AsmPrinter(); - llvm::LLVMInitializeX86AsmParser(); - - llvm::LLVMInitializeARMTargetInfo(); - llvm::LLVMInitializeARMTarget(); - llvm::LLVMInitializeARMTargetMC(); - llvm::LLVMInitializeARMAsmPrinter(); - llvm::LLVMInitializeARMAsmParser(); - - llvm::LLVMInitializeMipsTargetInfo(); - llvm::LLVMInitializeMipsTarget(); - llvm::LLVMInitializeMipsTargetMC(); - llvm::LLVMInitializeMipsAsmPrinter(); - llvm::LLVMInitializeMipsAsmParser(); + configure_llvm(sess); if sess.opts.save_temps { output.with_extension("no-opt.bc").with_c_str(|buf| { @@ -141,8 +119,6 @@ pub fn run_passes(sess: Session, }) } - configure_llvm(sess); - let OptLevel = match sess.opts.optimize { session::No => lib::llvm::CodeGenLevelNone, session::Less => lib::llvm::CodeGenLevelLess, @@ -367,6 +343,30 @@ unsafe fn configure_llvm(sess: Session) { LOCK.lock(); if !CONFIGURED { + llvm::LLVMInitializePasses(); + + // Only initialize the platforms supported by Rust here, because + // using --llvm-root will have multiple platforms that rustllvm + // doesn't actually link to and it's pointless to put target info + // into the registry that Rust can not generate machine code for. + llvm::LLVMInitializeX86TargetInfo(); + llvm::LLVMInitializeX86Target(); + llvm::LLVMInitializeX86TargetMC(); + llvm::LLVMInitializeX86AsmPrinter(); + llvm::LLVMInitializeX86AsmParser(); + + llvm::LLVMInitializeARMTargetInfo(); + llvm::LLVMInitializeARMTarget(); + llvm::LLVMInitializeARMTargetMC(); + llvm::LLVMInitializeARMAsmPrinter(); + llvm::LLVMInitializeARMAsmParser(); + + llvm::LLVMInitializeMipsTargetInfo(); + llvm::LLVMInitializeMipsTarget(); + llvm::LLVMInitializeMipsTargetMC(); + llvm::LLVMInitializeMipsAsmPrinter(); + llvm::LLVMInitializeMipsAsmParser(); + llvm::LLVMRustSetLLVMOptions(llvm_args.len() as c_int, llvm_args.as_ptr()); CONFIGURED = true;